소개
이 랩에서는 Kubernetes 클러스터에 배포된 애플리케이션을 업데이트하고 롤백하는 방법을 배우게 됩니다. 먼저 Minikube 를 사용하여 로컬 Kubernetes 클러스터를 설정한 다음, 샘플 NGINX 애플리케이션을 배포합니다. 다음으로, 애플리케이션의 이미지를 업데이트하고 성공적인 업데이트를 확인합니다. 업데이트 실패를 시뮬레이션하기 위해 문제를 진단한 다음 안정적인 버전으로 롤백합니다. 마지막으로, Deployment YAML 파일에서 롤링 업데이트 전략을 조정합니다.
Kubernetes 클러스터 시작
이 단계에서는 Minikube 를 사용하여 로컬 Kubernetes 클러스터를 시작하고 확인하는 방법을 배우게 됩니다. 이는 Kubernetes 개발 환경을 설정하는 데 있어 중요한 첫 번째 단계입니다.
먼저, 프로젝트 디렉토리에 있는지 확인합니다.
cd ~/project
Minikube 클러스터를 시작합니다.
minikube start
예시 출력:
😄 minikube v1.29.0 on Ubuntu 22.04
✨ Automatically selected the docker driver
📌 Using Docker driver with root permissions
🔥 Creating kubernetes in kubernetes cluster
🔄 Restarting existing kubernetes cluster
🐳 Preparing Kubernetes v1.26.1 on Docker 20.10.23 ...
🚀 Launching Kubernetes ...
🌟 Enabling addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace
클러스터 상태를 확인합니다.
minikube status
예시 출력:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
클러스터 노드를 확인합니다.
kubectl get nodes
예시 출력:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.26.1
이 단계의 주요 사항:
minikube start는 로컬 단일 노드 Kubernetes 클러스터를 생성합니다.- 클러스터는 기본 드라이버로 Docker 를 사용합니다.
- Kubernetes v1.26.1 이 자동으로 구성됩니다.
minikube status및kubectl get nodes는 클러스터의 준비 상태를 확인합니다.
샘플 애플리케이션 배포
이 단계에서는 Kubernetes Deployment 를 사용하여 간단한 웹 애플리케이션을 생성하고 배포하는 방법을 배우게 됩니다. 배포 프로세스를 시연하기 위해 샘플 애플리케이션으로 NGINX 이미지를 사용합니다.
먼저, 프로젝트 디렉토리로 이동합니다.
cd ~/project
mkdir -p k8s-manifests
cd k8s-manifests
웹 애플리케이션용 새 배포 매니페스트를 생성합니다.
nano nginx-deployment.yaml
다음 내용을 파일에 추가합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.23.3-alpine
ports:
- containerPort: 80
파일을 저장하고 nano 편집기를 종료합니다.
kubectl 을 사용하여 애플리케이션을 배포합니다.
kubectl apply -f nginx-deployment.yaml
예시 출력:
deployment.apps/web-app created
배포를 확인합니다.
kubectl get deployments
예시 출력:
NAME READY UP-TO-DATE AVAILABLE AGE
web-app 3/3 3 3 30s
생성된 파드를 확인합니다.
kubectl get pods -l app=web
예시 출력:
NAME READY STATUS RESTARTS AGE
web-app-xxx-yyy 1/1 Running 0 45s
web-app-xxx-zzz 1/1 Running 0 45s
web-app-xxx-www 1/1 Running 0 45s
이 배포의 주요 사항:
- NGINX 웹 서버의 3 개 레플리카 (replica) 를 가진 Deployment 를 생성했습니다.
- 특정하고 안정적인 버전의 NGINX(1.23.3-alpine) 를 사용했습니다.
- 컨테이너 포트 80 을 노출했습니다.
- 레이블 (labels) 을 사용하여 파드를 식별하고 관리했습니다.
Deployment YAML 에서 애플리케이션 이미지 업데이트
이 단계에서는 실제 애플리케이션 업그레이드 시나리오를 시뮬레이션하여 Kubernetes Deployment 에서 컨테이너 이미지를 업데이트하는 방법을 배우게 됩니다.
먼저, 올바른 디렉토리에 있는지 확인합니다.
cd ~/project/k8s-manifests
기존 배포 매니페스트를 엽니다.
nano nginx-deployment.yaml
이미지를 nginx:1.23.3-alpine에서 최신 버전으로 업데이트합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.24.0-alpine
ports:
- containerPort: 80
업데이트된 배포를 적용합니다.
kubectl apply -f nginx-deployment.yaml
예시 출력:
deployment.apps/web-app configured
배포 업데이트 프로세스를 관찰합니다.
kubectl rollout status deployment web-app
예시 출력:
Waiting for deployment "web-app" to roll out...
Waiting for deployment spec update to be applied...
Waiting for available replicas to reach desired number...
deployment "web-app" successfully rolled out
새 이미지 버전을 확인합니다.
kubectl get pods -l app=web -o jsonpath='{.items[*].spec.containers[0].image}'
예시 출력:
nginx:1.24.0-alpine nginx:1.24.0-alpine nginx:1.24.0-alpine
이미지 업데이트에 대한 주요 사항:
kubectl apply를 사용하여 배포를 업데이트합니다.- Kubernetes 는 기본적으로 롤링 업데이트 (rolling update) 를 수행합니다.
- 애플리케이션 가용성을 유지하기 위해 파드 (pod) 가 점진적으로 교체됩니다.
- 업데이트 프로세스는 무중단 배포 (zero-downtime deployment) 를 보장합니다.
업데이트 성공 여부 확인
이 단계에서는 파드 (pod) 버전, 상태 및 추가 배포 세부 정보를 검토하여 Kubernetes 배포의 성공적인 업데이트를 확인하는 방법을 배우게 됩니다.
먼저, 자세한 정보와 함께 파드를 나열합니다.
kubectl get pods -l app=web -o wide
예시 출력:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-app-xxx-yyy 1/1 Running 0 3m 10.244.0.5 minikube <none> <none>
web-app-xxx-zzz 1/1 Running 0 3m 10.244.0.6 minikube <none> <none>
web-app-xxx-www 1/1 Running 0 3m 10.244.0.7 minikube <none> <none>
파드의 특정 이미지 버전을 확인합니다.
kubectl get pods -l app=web -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
예시 출력:
web-app-xxx-yyy nginx:1.24.0-alpine
web-app-xxx-zzz nginx:1.24.0-alpine
web-app-xxx-www nginx:1.24.0-alpine
더 자세한 정보를 얻기 위해 배포를 설명합니다.
kubectl describe deployment web-app
예시 출력:
Name: web-app
Namespace: default
CreationTimestamp: [current timestamp]
Labels: app=web
Annotations: deployment.kubernetes.io/revision: 2
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:1.24.0-alpine
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
롤아웃 (rollout) 기록을 확인합니다.
kubectl rollout history deployment web-app
예시 출력:
REVISION CHANGE-CAUSE
1 <none>
2 <none>
확인에 대한 주요 사항:
- 모든 파드가 새 이미지 버전을 실행하고 있습니다.
- 배포는 3 개의 사용 가능한 레플리카 (replica) 를 가지고 있습니다.
- 롤아웃 전략 (rollout strategy) 은 무중단 업데이트를 보장합니다.
- 배포 리비전 (revision) 이 증가했습니다.
업데이트 실패 시뮬레이션 및 진단
이 단계에서는 문제가 있는 이미지 업데이트를 시뮬레이션하고 Kubernetes 진단 도구를 사용하여 잠재적인 배포 업데이트 실패를 진단하는 방법을 배우게 됩니다.
먼저, 프로젝트 디렉토리로 이동합니다.
cd ~/project/k8s-manifests
잘못된 이미지를 사용하여 배포 매니페스트를 생성합니다.
nano problematic-deployment.yaml
다음 내용을 추가합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: troubleshoot-app
labels:
app: troubleshoot
spec:
replicas: 3
selector:
matchLabels:
app: troubleshoot
template:
metadata:
labels:
app: troubleshoot
spec:
containers:
- name: nginx
image: nginx:non-existent-tag
ports:
- containerPort: 80
문제가 있는 배포를 적용합니다.
kubectl apply -f problematic-deployment.yaml
예시 출력:
deployment.apps/troubleshoot-app created
배포 상태를 확인합니다.
kubectl rollout status deployment troubleshoot-app
예시 출력:
Waiting for deployment "troubleshoot-app" to roll out...
Ctrl+C를 눌러 롤아웃 상태를 종료합니다.
파드 이벤트 및 상태를 확인합니다.
kubectl get pods -l app=troubleshoot
예시 출력:
NAME READY STATUS RESTARTS AGE
troubleshoot-app-6b8986c555-gcjj9 0/1 ImagePullBackOff 0 2m56s
troubleshoot-app-6b8986c555-p29dp 0/1 ImagePullBackOff 0 2m56s
troubleshoot-app-6b8986c555-vpv5q 0/1 ImagePullBackOff 0 2m56s
파드 세부 정보 및 로그를 검사합니다.
## Replace 'xxx-yyy' with your actual pod name
POD_NAME=$(kubectl get pods -l app=troubleshoot -o jsonpath='{.items[0].metadata.name}')
kubectl describe pod $POD_NAME
kubectl logs $POD_NAME
이미지 풀 (image pull) 실패를 나타내는 파드 상태 및 로그를 보게 됩니다.
Failed to pull image "nginx:non-existent-tag"
이미지를 수정하여 문제를 해결합니다.
nano problematic-deployment.yaml
이미지를 유효한 태그로 업데이트합니다.
image: nginx:1.24.0-alpine
수정된 배포를 다시 적용합니다.
kubectl apply -f problematic-deployment.yaml
파드 상태를 다시 확인합니다.
kubectl get pods -l app=troubleshoot
예시 출력:
NAME READY STATUS RESTARTS AGE
troubleshoot-app-5dc9b58d57-bvqbr 1/1 Running 0 5s
troubleshoot-app-5dc9b58d57-tdksb 1/1 Running 0 8s
troubleshoot-app-5dc9b58d57-xdq5n 1/1 Running 0 6s
실패 진단에 대한 주요 사항:
kubectl describe를 사용하여 배포 및 파드 이벤트를 봅니다.ImagePullBackOff또는 기타 오류 상태에 대한 파드 상태를 확인합니다.- 자세한 오류 정보를 위해 파드 로그를 검사합니다.
- 이미지 가용성 및 태그 정확성을 확인합니다.
안정적인 버전으로 롤백
이 단계에서는 kubectl rollout undo 명령을 사용하여 Kubernetes 배포를 이전의 안정적인 버전으로 롤백하는 방법을 배우게 됩니다.
먼저, 프로젝트 디렉토리로 이동합니다.
cd ~/project/k8s-manifests
웹 애플리케이션의 롤아웃 (rollout) 기록을 확인합니다.
kubectl rollout history deployment web-app
예시 출력:
REVISION CHANGE-CAUSE
1 <none>
2 <none>
현재 배포 세부 정보를 확인합니다.
kubectl describe deployment web-app | grep Image
예시 출력:
Image: nginx:1.24.0-alpine
이전 리비전 (revision) 으로 롤백을 수행합니다.
kubectl rollout undo deployment web-app
예시 출력:
deployment.apps/web-app rolled back
롤백을 확인합니다.
kubectl rollout status deployment web-app
예시 출력:
Waiting for deployment "web-app" to roll out...
deployment "web-app" successfully rolled out
업데이트된 이미지 버전을 확인합니다.
kubectl get pods -l app=web -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
예시 출력:
web-app-xxx-yyy nginx:1.23.3-alpine
web-app-xxx-zzz nginx:1.23.3-alpine
web-app-xxx-www nginx:1.23.3-alpine
롤아웃 기록을 확인합니다.
kubectl rollout history deployment web-app
예시 출력:
REVISION CHANGE-CAUSE
2 <none>
3 <none>
롤백에 대한 주요 사항:
kubectl rollout undo는 이전 배포 리비전으로 되돌립니다.- Kubernetes 는 배포 변경 기록을 유지합니다.
- 롤백은 무중단 (zero downtime) 으로 수행됩니다.
- 롤백은 기록에 새로운 리비전을 생성합니다.
Deployment YAML 에서 롤링 업데이트 전략 조정
이 단계에서는 애플리케이션이 업데이트되고 확장되는 방식을 제어하기 위해 Kubernetes Deployment 에서 롤링 업데이트 전략을 사용자 정의하는 방법을 배우게 됩니다.
먼저, 프로젝트 디렉토리로 이동합니다.
cd ~/project/k8s-manifests
사용자 정의 롤링 업데이트 전략으로 새 배포 매니페스트를 생성합니다.
nano custom-rollout-deployment.yaml
다음 내용을 추가합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app-custom-rollout
labels:
app: web
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
maxSurge: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.24.0-alpine
ports:
- containerPort: 80
배포를 적용합니다.
kubectl apply -f custom-rollout-deployment.yaml
예시 출력:
deployment.apps/web-app-custom-rollout created
배포 상태를 확인합니다.
kubectl rollout status deployment web-app-custom-rollout
예시 출력:
Waiting for deployment "web-app-custom-rollout" to roll out...
deployment "web-app-custom-rollout" successfully rolled out
전략을 확인하기 위해 배포를 설명합니다.
kubectl describe deployment web-app-custom-rollout
예시 출력에는 다음이 포함됩니다.
StrategyType: RollingUpdate
RollingUpdateStrategy: 2 max unavailable, 3 max surge
이미지를 업데이트하여 롤링 업데이트를 트리거합니다.
kubectl set image deployment/web-app-custom-rollout nginx=nginx:1.25.0-alpine
업데이트 프로세스를 모니터링합니다.
kubectl rollout status deployment web-app-custom-rollout
롤링 업데이트 전략에 대한 주요 사항:
maxUnavailable: 업데이트 중에 사용할 수 없는 최대 파드 수maxSurge: 원하는 수보다 더 많이 생성될 수 있는 최대 파드 수- 업데이트 속도 및 애플리케이션 가용성을 제어하는 데 도움이 됩니다.
- 배포 동작을 미세 조정할 수 있습니다.
요약
이 랩에서는 Kubernetes 개발 환경을 설정하는 데 중요한 첫 번째 단계인 Minikube 를 사용하여 로컬 Kubernetes 클러스터를 시작하고 확인하는 방법을 배웠습니다. 또한 샘플 애플리케이션으로 NGINX 이미지를 사용하여 Kubernetes Deployment 를 통해 간단한 웹 애플리케이션을 생성하고 배포하는 방법을 배웠습니다. 배포 프로세스에는 배포 매니페스트 파일을 생성하고 클러스터에 적용하는 작업이 포함되었습니다.
애플리케이션의 초기 버전을 배포한 후, 배포 YAML 에서 애플리케이션 이미지를 업데이트하고, 성공적인 업데이트를 확인하고, 업데이트 실패를 시뮬레이션하고 진단하며, 안정적인 버전으로 롤백하고, 배포 YAML 에서 롤링 업데이트 전략을 조정하는 방법을 배우게 됩니다.


