쿠버네티스 사용방법

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

쿠버네티스 로고

목차

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

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

2.1 요구 사항

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

하드웨어 요구 사항

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

소프트웨어 요구 사항

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

2.2 로컬 개발 환경 설정

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

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

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

Minikube 시작

minikube start --driver=docker

kubectl 설치

# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# Windows
# 관리자 권한으로 PowerShell 실행
curl.exe -LO "https://dl.k8s.io/release/v1.29.0/bin/windows/amd64/kubectl.exe"
mkdir 'C:\Program Files\Kubernetes'
Move-Item kubectl.exe 'C:\Program Files\Kubernetes'
$env:Path += ';C:\Program Files\Kubernetes'

Minikube 설치

# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# Windows
# 관리자 권한으로 PowerShell 실행
New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory
Invoke-WebRequest -OutFile 'c:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe'
Add-Content -Path $profile -Value 'Set-Alias -Name minikube -Value c:\minikube\minikube.exe'

도커 설치

# Ubuntu
sudo apt-get update
sudo apt-get install docker.io
sudo systemctl enable docker
sudo systemctl start docker

# CentOS
sudo yum install docker
sudo systemctl enable docker
sudo systemctl start docker

# Windows
# Docker Desktop for Windows 설치

3. 쿠버네티스 기본 개념

쿠버네티스 아키텍처

쿠버네티스 아키텍처

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

  • 컨트롤 플레인: 클러스터 관리 및 제어
    • API 서버: 모든 쿠버네티스 요청의 관문
    • 스케줄러: 새로운 워크로드를 노드에 할당
    • 컨트롤러 매니저: 클러스터 상태 관리
    • etcd: 모든 클러스터 데이터를 저장하는 키-값 저장소
  • 워커 노드: 실제 애플리케이션이 실행되는 곳
    • Kubelet: 노드의 쿠버네티스 에이전트
    • Kube-proxy: 네트워크 규칙 관리
    • 컨테이너 런타임: 도커 등 컨테이너 실행 환경

핵심 개념

1. 파드(Pod)

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

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

2. 레플리카셋(ReplicaSet)

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

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest

3. 디플로이먼트(Deployment)

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

4. 서비스(Service)

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

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP  # ClusterIP, NodePort, LoadBalancer

5. 인그레스(Ingress)

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

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

4. 기본 명령어 익히기

kubectl 명령어

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

리소스 생성 및 관리

# YAML 파일로 리소스 생성
kubectl apply -f [파일명.yaml]

# 배포 생성
kubectl create deployment nginx --image=nginx

# 실행 중인 파드 목록 조회
kubectl get pods

# 파드에 대한 상세 정보 조회
kubectl describe pod [파드명]

# 파드 로그 확인
kubectl logs [파드명]

# 파드 내 컨테이너에 명령어 실행
kubectl exec -it [파드명] -- /bin/bash

# 리소스 삭제
kubectl delete -f [파일명.yaml]
kubectl delete pod [파드명]

스케일링

# 디플로이먼트 스케일링
kubectl scale deployment nginx-deployment --replicas=5

# 자동 스케일링 설정
kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=80

업데이트 및 롤백

# 이미지 업데이트
kubectl set image deployment/nginx-deployment nginx=nginx:1.19

# 롤아웃 상태 확인
kubectl rollout status deployment/nginx-deployment

# 이전 버전으로 롤백
kubectl rollout undo deployment/nginx-deployment

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

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

1. Dockerfile 작성

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "node", "app.js" ]

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

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nodejs-app
  template:
    metadata:
      labels:
        app: nodejs-app
    spec:
      containers:
      - name: nodejs-app
        image: username/nodejs-app:v1
        ports:
        - containerPort: 3000
        resources:
          limits:
            cpu: "0.5"
            memory: "512Mi"
          requests:
            cpu: "0.2"
            memory: "256Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: nodejs-app-service
spec:
  selector:
    app: nodejs-app
  ports:
  - port: 80
    targetPort: 3000
  type: LoadBalancer

4. 애플리케이션 배포

kubectl apply -f nodejs-app.yaml

5. 배포 확인

kubectl get pods
kubectl get services

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

리소스 관리

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

헬스 체크

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 3
  periodSeconds: 3
readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

롤링 업데이트 설정

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0

보안 컨텍스트

securityContext:
  runAsUser: 1000
  runAsGroup: 3000
  fsGroup: 2000

7. 문제 해결 가이드

일반적인 문제 해결 단계

이벤트 확인

kubectl get events

로그 확인

kubectl logs [파드명]

파드 세부 정보 확인

kubectl describe pod [파드명]

파드 상태 확인

kubectl get pods

일반적인 오류 및 해결 방법

ImagePullBackOff

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

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

CrashLoopBackOff

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

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

Pending 상태

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

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

8. 고급 주제

1. 헬름(Helm) 사용하기

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

# 헬름 설치
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 레포지토리 추가
helm repo add stable https://charts.helm.sh/stable

# 차트 검색
helm search repo stable

# 애플리케이션 설치
helm install my-release stable/mysql

2. 쿠버네티스 대시보드

# 대시보드 설치
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

# 프록시 시작
kubectl proxy

# 브라우저에서 접속
# http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

3. 스테이트풀셋(StatefulSet)

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

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: mysql
  replicas: 3
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

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

공식 문서

유용한 도구

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

관련 기술 학습

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

10. 결론

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

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