쿠버네티스 사용방법

SB신범
8분 읽기
조회수 로딩 중...

쿠버네티스 사용방법: 초보자를 위한 상세 가이드

목차

1. 쿠버네티스란 무엇인가?

쿠버네티스(Kubernetes, 줄여서 K8s)는 컨테이너화된 애플리케이션의 자동 배포, 스케일링, 관리를 위한 오픈소스 플랫폼입니다. 구글에서 개발을 시작했으며, 현재는 클라우드 네이티브 컴퓨팅 재단(CNCF)에서 관리하고 있습니다.

1.1 쿠버네티스의 역사

쿠버네티스는 구글의 내부 시스템인 '보그(Borg)'에서 영감을 받아 2014년에 오픈소스로 공개되었습니다. 구글은 15년 이상 컨테이너 기술을 사용해 왔으며, 이 경험을 바탕으로 쿠버네티스를 설계했습니다. 현재는 Amazon, Microsoft, IBM, Red Hat 등 주요 클라우드 서비스 제공업체들이 쿠버네티스를 지원하고 있습니다.

1.2 쿠버네티스가 해결하는 문제

전통적인 배포 방식과 달리, 쿠버네티스는 다음과 같은 문제를 해결합니다:

  • 복잡한 분산 시스템 관리: 수십, 수백 개의 컨테이너를 효율적으로 관리
  • 고가용성 보장: 애플리케이션의 중단 없는 운영
  • 확장성: 트래픽 증가에 따른 자동 스케일링
  • 복구 용이성: 장애 발생 시 자동 복구
  • 배포 자동화: CI/CD 파이프라인과의 통합
  • 리소스 효율성: 하드웨어 리소스를 최적으로 활용

1.3 쿠버네티스의 주요 장점

쿠버네티스는 다음과 같은 핵심 장점을 제공합니다:

장점설명
선언적 구성원하는 상태를 정의하면 쿠버네티스가 자동으로 해당 상태를 유지
자가 복구노드 장애, 컨테이너 충돌 등의 상황에서 자동 복구
수평적 확장부하에 따라 애플리케이션 인스턴스를 자동으로 확장
서비스 디스커버리내부 DNS 시스템을 통한 서비스 검색
로드 밸런싱트래픽을 여러 컨테이너에 분산
롤링 업데이트다운타임 없이 애플리케이션 업데이트
시크릿 및 구성 관리민감한 정보와 구성 값을 안전하게 관리
스토리지 오케스트레이션로컬 또는 클라우드 스토리지를 자동으로 마운트
배치 실행일회성 작업 및 크론 작업 관리

1.4 쿠버네티스 vs 다른 오케스트레이션 도구

쿠버네티스는 다양한 컨테이너 오케스트레이션 도구 중 하나입니다. 다음은 주요 경쟁 제품과의 비교입니다:

특성쿠버네티스Docker SwarmApache Mesos
복잡성높음 (강력하지만 학습 곡선이 가파름)낮음 (간단하고 빠른 설정)중간~높음
확장성매우 높음 (수천 개의 노드)중간 (수백 개의 노드)매우 높음
커뮤니티매우 활발함중간중간
기업 지원강함 (CNCF 및 주요 클라우드 제공업체)중간 (Docker Inc.)중간 (Mesosphere)
기능풍부함기본적풍부함
사용 사례복잡한 마이크로서비스 아키텍처간단한 컨테이너 배포대규모 데이터 처리

2. 쿠버네티스 환경 준비하기

2.1 요구 사항

쿠버네티스를 실행하기 위한 최소 하드웨어 및 소프트웨어 요구 사항은 다음과 같습니다:

하드웨어 요구 사항

구성 요소최소 사양권장 사양
CPU2코어 이상4코어 이상
메모리2GB RAM8GB RAM 이상
스토리지20GB 이상50GB 이상 SSD
네트워크안정적인 인터넷 연결고속 인터넷 연결

소프트웨어 요구 사항

  • 운영체제: Linux (Ubuntu, CentOS, RHEL 등), macOS, Windows
  • 컨테이너 런타임: Docker, containerd, CRI-O
  • 쿠버네티스 클라이언트 도구: kubectl, kubeadm, helm

2.2 로컬 개발 환경 설정

개발 및 학습 목적으로 로컬 환경에서 쿠버네티스를 실행하는 방법에는 여러 가지가 있습니다. 다음은 가장 인기 있는 세 가지 방법입니다:

Minikube 설치 (단일 노드 클러스터)

Minikube는 개발 및 테스트 목적으로 로컬 환경에서 쿠버네티스를 쉽게 실행할 수 있게 해주는 도구입니다.

  1. 도커 설치

    bash
    1# Ubuntu 2sudo apt-get update 3sudo apt-get install docker.io 4sudo systemctl enable docker 5sudo systemctl start docker 6 7# CentOS 8sudo yum install docker 9sudo systemctl enable docker 10sudo systemctl start docker 11 12# Windows 13# Docker Desktop for Windows 설치
  2. Minikube 설치

    bash
    1# Linux 2curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 3sudo install minikube-linux-amd64 /usr/local/bin/minikube 4 5# Windows 6# 관리자 권한으로 PowerShell 실행 7New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory 8Invoke-WebRequest -OutFile 'c:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe' 9Add-Content -Path $profile -Value 'Set-Alias -Name minikube -Value c:\minikube\minikube.exe'
  3. kubectl 설치

    bash
    1# Linux 2curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" 3sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl 4 5# Windows 6# 관리자 권한으로 PowerShell 실행 7curl.exe -LO "https://dl.k8s.io/release/v1.29.0/bin/windows/amd64/kubectl.exe" 8mkdir 'C:\Program Files\Kubernetes' 9Move-Item kubectl.exe 'C:\Program Files\Kubernetes' 10$env:Path += ';C:\Program Files\Kubernetes'
  4. Minikube 시작

    bash
    1minikube start --driver=docker

3. 쿠버네티스 기본 개념

쿠버네티스 아키텍처

쿠버네티스 클러스터는 크게 컨트롤 플레인워커 노드로 구성됩니다.

  • 컨트롤 플레인: 클러스터 관리 및 제어

    • API 서버: 모든 쿠버네티스 요청의 관문
    • 스케줄러: 새로운 워크로드를 노드에 할당
    • 컨트롤러 매니저: 클러스터 상태 관리
    • etcd: 모든 클러스터 데이터를 저장하는 키-값 저장소
  • 워커 노드: 실제 애플리케이션이 실행되는 곳

    • Kubelet: 노드의 쿠버네티스 에이전트
    • Kube-proxy: 네트워크 규칙 관리
    • 컨테이너 런타임: 도커 등 컨테이너 실행 환경

핵심 개념

1. 파드(Pod)

쿠버네티스의 가장 기본적인 배포 단위로, 하나 이상의 컨테이너를 포함합니다.

yaml
1apiVersion: v1 2kind: Pod 3metadata: 4 name: nginx-pod 5spec: 6 containers: 7 - name: nginx 8 image: nginx:latest 9 ports: 10 - containerPort: 80

2. 레플리카셋(ReplicaSet)

지정된 수의 파드 복제본이 실행되도록 보장합니다.

yaml
1apiVersion: apps/v1 2kind: ReplicaSet 3metadata: 4 name: nginx-replicaset 5spec: 6 replicas: 3 7 selector: 8 matchLabels: 9 app: nginx 10 template: 11 metadata: 12 labels: 13 app: nginx 14 spec: 15 containers: 16 - name: nginx 17 image: nginx:latest

3. 디플로이먼트(Deployment)

레플리카셋을 관리하며 선언적인 업데이트를 제공합니다.

yaml
1apiVersion: apps/v1 2kind: Deployment 3metadata: 4 name: nginx-deployment 5spec: 6 replicas: 3 7 selector: 8 matchLabels: 9 app: nginx 10 template: 11 metadata: 12 labels: 13 app: nginx 14 spec: 15 containers: 16 - name: nginx 17 image: nginx:latest 18 ports: 19 - containerPort: 80

4. 서비스(Service)

파드 집합에 대한 단일 진입점을 제공합니다.

yaml
1apiVersion: v1 2kind: Service 3metadata: 4 name: nginx-service 5spec: 6 selector: 7 app: nginx 8 ports: 9 - port: 80 10 targetPort: 80 11 type: ClusterIP # ClusterIP, NodePort, LoadBalancer

5. 인그레스(Ingress)

클러스터 외부에서 내부 서비스로의 HTTP 및 HTTPS 라우팅을 관리합니다.

yaml
1apiVersion: networking.k8s.io/v1 2kind: Ingress 3metadata: 4 name: nginx-ingress 5spec: 6 rules: 7 - host: example.com 8 http: 9 paths: 10 - path: / 11 pathType: Prefix 12 backend: 13 service: 14 name: nginx-service 15 port: 16 number: 80

4. 기본 명령어 익히기

kubectl 명령어

kubectl은 쿠버네티스 클러스터를 제어하기 위한 명령줄 도구입니다.

리소스 생성 및 관리

bash
1# YAML 파일로 리소스 생성 2kubectl apply -f [파일명.yaml] 3 4# 배포 생성 5kubectl create deployment nginx --image=nginx 6 7# 실행 중인 파드 목록 조회 8kubectl get pods 9 10# 파드에 대한 상세 정보 조회 11kubectl describe pod [파드명] 12 13# 파드 로그 확인 14kubectl logs [파드명] 15 16# 파드 내 컨테이너에 명령어 실행 17kubectl exec -it [파드명] -- /bin/bash 18 19# 리소스 삭제 20kubectl delete -f [파일명.yaml] 21kubectl delete pod [파드명]

스케일링

bash
1# 디플로이먼트 스케일링 2kubectl scale deployment nginx-deployment --replicas=5 3 4# 자동 스케일링 설정 5kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=80

업데이트 및 롤백

bash
1# 이미지 업데이트 2kubectl set image deployment/nginx-deployment nginx=nginx:1.19 3 4# 롤아웃 상태 확인 5kubectl rollout status deployment/nginx-deployment 6 7# 이전 버전으로 롤백 8kubectl rollout undo deployment/nginx-deployment

5. 간단한 애플리케이션 배포 실습

예제: Node.js 애플리케이션 배포하기

1. Dockerfile 작성

dockerfile
1FROM node:14 2WORKDIR /app 3COPY package*.json ./ 4RUN npm install 5COPY . . 6EXPOSE 3000 7CMD [ "node", "app.js" ]

2. 도커 이미지 빌드 및 푸시

bash
1docker build -t username/nodejs-app:v1 . 2docker push username/nodejs-app:v1

3. 쿠버네티스 디플로이먼트 YAML 작성

yaml
1apiVersion: apps/v1 2kind: Deployment 3metadata: 4 name: nodejs-app 5spec: 6 replicas: 3 7 selector: 8 matchLabels: 9 app: nodejs-app 10 template: 11 metadata: 12 labels: 13 app: nodejs-app 14 spec: 15 containers: 16 - name: nodejs-app 17 image: username/nodejs-app:v1 18 ports: 19 - containerPort: 3000 20 resources: 21 limits: 22 cpu: "0.5" 23 memory: "512Mi" 24 requests: 25 cpu: "0.2" 26 memory: "256Mi" 27--- 28apiVersion: v1 29kind: Service 30metadata: 31 name: nodejs-app-service 32spec: 33 selector: 34 app: nodejs-app 35 ports: 36 - port: 80 37 targetPort: 3000 38 type: LoadBalancer

4. 애플리케이션 배포

bash
1kubectl apply -f nodejs-app.yaml

5. 배포 확인

bash
1kubectl get pods 2kubectl get services

6. 실제 운영 환경에서의 고려사항

리소스 관리

yaml
1resources: 2 requests: 3 memory: "64Mi" 4 cpu: "250m" 5 limits: 6 memory: "128Mi" 7 cpu: "500m"

헬스 체크

yaml
1livenessProbe: 2 httpGet: 3 path: /healthz 4 port: 8080 5 initialDelaySeconds: 3 6 periodSeconds: 3 7readinessProbe: 8 httpGet: 9 path: /ready 10 port: 8080 11 initialDelaySeconds: 5 12 periodSeconds: 5

롤링 업데이트 설정

yaml
1strategy: 2 type: RollingUpdate 3 rollingUpdate: 4 maxSurge: 1 5 maxUnavailable: 0

보안 컨텍스트

yaml
1securityContext: 2 runAsUser: 1000 3 runAsGroup: 3000 4 fsGroup: 2000

7. 문제 해결 가이드

일반적인 문제 해결 단계

  1. 파드 상태 확인

    bash
    1kubectl get pods
  2. 파드 세부 정보 확인

    bash
    1kubectl describe pod [파드명]
  3. 로그 확인

    bash
    1kubectl logs [파드명]
  4. 이벤트 확인

    bash
    1kubectl get events

일반적인 오류 및 해결 방법

ImagePullBackOff

원인: 쿠버네티스가 컨테이너 이미지를 가져올 수 없음 해결책:

  • 이미지 이름이 올바른지 확인
  • 비공개 레지스트리인 경우 시크릿 설정
  • 네트워크 연결 확인

CrashLoopBackOff

원인: 컨테이너가 시작된 후 계속 충돌함 해결책:

  • 컨테이너 로그 확인
  • 애플리케이션 구성 확인
  • 리소스 제한 확인

Pending 상태

원인: 스케줄러가 파드를 노드에 할당할 수 없음 해결책:

  • 노드의 리소스 가용성 확인
  • PVC가 바인딩되었는지 확인
  • 노드 셀렉터/어피니티 설정 확인

8. 고급 주제

1. 헬름(Helm) 사용하기

헬름은 쿠버네티스 패키지 관리자로, 복잡한 애플리케이션을 쉽게 배포할 수 있게 해줍니다.

bash
1# 헬름 설치 2curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash 3 4# 레포지토리 추가 5helm repo add stable https://charts.helm.sh/stable 6 7# 차트 검색 8helm search repo stable 9 10# 애플리케이션 설치 11helm install my-release stable/mysql

2. 쿠버네티스 대시보드

bash
1# 대시보드 설치 2kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 3 4# 프록시 시작 5kubectl proxy 6 7# 브라우저에서 접속 8# http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

3. 스테이트풀셋(StatefulSet)

데이터베이스와 같은, 상태를 가진 애플리케이션을 위한 워크로드 리소스입니다.

yaml
1apiVersion: apps/v1 2kind: StatefulSet 3metadata: 4 name: mysql 5spec: 6 selector: 7 matchLabels: 8 app: mysql 9 serviceName: mysql 10 replicas: 3 11 template: 12 metadata: 13 labels: 14 app: mysql 15 spec: 16 containers: 17 - name: mysql 18 image: mysql:5.7 19 env: 20 - name: MYSQL_ROOT_PASSWORD 21 valueFrom: 22 secretKeyRef: 23 name: mysql-secret 24 key: password 25 volumeMounts: 26 - name: data 27 mountPath: /var/lib/mysql 28 volumeClaimTemplates: 29 - metadata: 30 name: data 31 spec: 32 accessModes: [ "ReadWriteOnce" ] 33 resources: 34 requests: 35 storage: 10Gi

9. 학습 리소스 및 다음 단계

공식 문서

유용한 도구

  • k9s: 터미널 기반 UI
  • kubectx/kubens: 컨텍스트와 네임스페이스를 쉽게 전환
  • kustomize: 쿠버네티스 구성 관리
  • lens: 쿠버네티스 IDE

관련 기술 학습

  • 서비스 메시: Istio, Linkerd
  • 모니터링: Prometheus, Grafana
  • 로깅: ELK Stack, Loki
  • CI/CD: Jenkins, GitLab CI, ArgoCD

10. 결론

쿠버네티스는 컨테이너화된 애플리케이션을 확장성 있고 효율적으로 관리할 수 있게 해주는 강력한 도구입니다. 초보자에게는 다소 복잡할 수 있지만, 기본 개념과 명령어를 익히고 작은 애플리케이션부터 시작하면 점차 익숙해질 수 있습니다.

이 가이드가 쿠버네티스 여정의 첫걸음을 내딛는 데 도움이 되었기를 바랍니다. 더 깊이 학습하고 싶다면 공식 문서와 커뮤니티 자료를 참고하세요. 쿠버네티스의 세계는 방대하지만, 한 번에 한 개념씩 익혀나가면 결국 마스터할 수 있습니다!