쿠버네티스 사용방법
쿠버네티스 사용방법: 초보자를 위한 상세 가이드
목차
- 1. 쿠버네티스란 무엇인가?
- 2. 쿠버네티스 환경 준비하기
- 3. 쿠버네티스 기본 개념
- 4. 첫 번째 애플리케이션 배포하기
- 5. 쿠버네티스 리소스 관리
- 6. 실제 사용 사례
- 7. 문제 해결 및 디버깅
- 8. 고급 주제
- 9. 참고 자료
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는 개발 및 테스트 목적으로 로컬 환경에서 쿠버네티스를 쉽게 실행할 수 있게 해주는 도구입니다.
-
도커 설치
bash1# 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 설치
-
Minikube 설치
bash1# 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'
-
kubectl 설치
bash1# 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'
-
Minikube 시작
bash1minikube start --driver=docker
3. 쿠버네티스 기본 개념
쿠버네티스 아키텍처
쿠버네티스 클러스터는 크게 컨트롤 플레인과 워커 노드로 구성됩니다.
-
컨트롤 플레인: 클러스터 관리 및 제어
- API 서버: 모든 쿠버네티스 요청의 관문
- 스케줄러: 새로운 워크로드를 노드에 할당
- 컨트롤러 매니저: 클러스터 상태 관리
- etcd: 모든 클러스터 데이터를 저장하는 키-값 저장소
-
워커 노드: 실제 애플리케이션이 실행되는 곳
- Kubelet: 노드의 쿠버네티스 에이전트
- Kube-proxy: 네트워크 규칙 관리
- 컨테이너 런타임: 도커 등 컨테이너 실행 환경
핵심 개념
1. 파드(Pod)
쿠버네티스의 가장 기본적인 배포 단위로, 하나 이상의 컨테이너를 포함합니다.
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)
지정된 수의 파드 복제본이 실행되도록 보장합니다.
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)
레플리카셋을 관리하며 선언적인 업데이트를 제공합니다.
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)
파드 집합에 대한 단일 진입점을 제공합니다.
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 라우팅을 관리합니다.
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은 쿠버네티스 클러스터를 제어하기 위한 명령줄 도구입니다.
리소스 생성 및 관리
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 [파드명]
스케일링
1# 디플로이먼트 스케일링
2kubectl scale deployment nginx-deployment --replicas=5
3
4# 자동 스케일링 설정
5kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=80
업데이트 및 롤백
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 작성
1FROM node:14
2WORKDIR /app
3COPY package*.json ./
4RUN npm install
5COPY . .
6EXPOSE 3000
7CMD [ "node", "app.js" ]
2. 도커 이미지 빌드 및 푸시
1docker build -t username/nodejs-app:v1 .
2docker push username/nodejs-app:v1
3. 쿠버네티스 디플로이먼트 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. 애플리케이션 배포
1kubectl apply -f nodejs-app.yaml
5. 배포 확인
1kubectl get pods
2kubectl get services
6. 실제 운영 환경에서의 고려사항
리소스 관리
1resources:
2 requests:
3 memory: "64Mi"
4 cpu: "250m"
5 limits:
6 memory: "128Mi"
7 cpu: "500m"
헬스 체크
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
롤링 업데이트 설정
1strategy:
2 type: RollingUpdate
3 rollingUpdate:
4 maxSurge: 1
5 maxUnavailable: 0
보안 컨텍스트
1securityContext:
2 runAsUser: 1000
3 runAsGroup: 3000
4 fsGroup: 2000
7. 문제 해결 가이드
일반적인 문제 해결 단계
-
파드 상태 확인
bash1kubectl get pods
-
파드 세부 정보 확인
bash1kubectl describe pod [파드명]
-
로그 확인
bash1kubectl logs [파드명]
-
이벤트 확인
bash1kubectl get events
일반적인 오류 및 해결 방법
ImagePullBackOff
원인: 쿠버네티스가 컨테이너 이미지를 가져올 수 없음 해결책:
- 이미지 이름이 올바른지 확인
- 비공개 레지스트리인 경우 시크릿 설정
- 네트워크 연결 확인
CrashLoopBackOff
원인: 컨테이너가 시작된 후 계속 충돌함 해결책:
- 컨테이너 로그 확인
- 애플리케이션 구성 확인
- 리소스 제한 확인
Pending 상태
원인: 스케줄러가 파드를 노드에 할당할 수 없음 해결책:
- 노드의 리소스 가용성 확인
- PVC가 바인딩되었는지 확인
- 노드 셀렉터/어피니티 설정 확인
8. 고급 주제
1. 헬름(Helm) 사용하기
헬름은 쿠버네티스 패키지 관리자로, 복잡한 애플리케이션을 쉽게 배포할 수 있게 해줍니다.
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. 쿠버네티스 대시보드
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)
데이터베이스와 같은, 상태를 가진 애플리케이션을 위한 워크로드 리소스입니다.
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. 결론
쿠버네티스는 컨테이너화된 애플리케이션을 확장성 있고 효율적으로 관리할 수 있게 해주는 강력한 도구입니다. 초보자에게는 다소 복잡할 수 있지만, 기본 개념과 명령어를 익히고 작은 애플리케이션부터 시작하면 점차 익숙해질 수 있습니다.
이 가이드가 쿠버네티스 여정의 첫걸음을 내딛는 데 도움이 되었기를 바랍니다. 더 깊이 학습하고 싶다면 공식 문서와 커뮤니티 자료를 참고하세요. 쿠버네티스의 세계는 방대하지만, 한 번에 한 개념씩 익혀나가면 결국 마스터할 수 있습니다!