애플리케이션 업데이트 및 롤백

KubernetesBeginner
지금 연습하기

소개

이 랩에서는 Kubernetes 클러스터에 배포된 애플리케이션을 업데이트하고 롤백하는 방법을 배우게 됩니다. 먼저 Minikube 를 사용하여 로컬 Kubernetes 클러스터를 설정한 다음, 샘플 NGINX 애플리케이션을 배포합니다. 다음으로, 애플리케이션의 이미지를 업데이트하고 성공적인 업데이트를 확인합니다. 업데이트 실패를 시뮬레이션하기 위해 문제를 진단한 다음 안정적인 버전으로 롤백합니다. 마지막으로, Deployment YAML 파일에서 롤링 업데이트 전략을 조정합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 96%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

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

이 단계의 주요 사항:

  1. minikube start는 로컬 단일 노드 Kubernetes 클러스터를 생성합니다.
  2. 클러스터는 기본 드라이버로 Docker 를 사용합니다.
  3. Kubernetes v1.26.1 이 자동으로 구성됩니다.
  4. minikube statuskubectl 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

이 배포의 주요 사항:

  1. NGINX 웹 서버의 3 개 레플리카 (replica) 를 가진 Deployment 를 생성했습니다.
  2. 특정하고 안정적인 버전의 NGINX(1.23.3-alpine) 를 사용했습니다.
  3. 컨테이너 포트 80 을 노출했습니다.
  4. 레이블 (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

이미지 업데이트에 대한 주요 사항:

  1. kubectl apply를 사용하여 배포를 업데이트합니다.
  2. Kubernetes 는 기본적으로 롤링 업데이트 (rolling update) 를 수행합니다.
  3. 애플리케이션 가용성을 유지하기 위해 파드 (pod) 가 점진적으로 교체됩니다.
  4. 업데이트 프로세스는 무중단 배포 (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>

확인에 대한 주요 사항:

  1. 모든 파드가 새 이미지 버전을 실행하고 있습니다.
  2. 배포는 3 개의 사용 가능한 레플리카 (replica) 를 가지고 있습니다.
  3. 롤아웃 전략 (rollout strategy) 은 무중단 업데이트를 보장합니다.
  4. 배포 리비전 (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

실패 진단에 대한 주요 사항:

  1. kubectl describe를 사용하여 배포 및 파드 이벤트를 봅니다.
  2. ImagePullBackOff 또는 기타 오류 상태에 대한 파드 상태를 확인합니다.
  3. 자세한 오류 정보를 위해 파드 로그를 검사합니다.
  4. 이미지 가용성 및 태그 정확성을 확인합니다.

안정적인 버전으로 롤백

이 단계에서는 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>

롤백에 대한 주요 사항:

  1. kubectl rollout undo는 이전 배포 리비전으로 되돌립니다.
  2. Kubernetes 는 배포 변경 기록을 유지합니다.
  3. 롤백은 무중단 (zero downtime) 으로 수행됩니다.
  4. 롤백은 기록에 새로운 리비전을 생성합니다.

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

롤링 업데이트 전략에 대한 주요 사항:

  1. maxUnavailable: 업데이트 중에 사용할 수 없는 최대 파드 수
  2. maxSurge: 원하는 수보다 더 많이 생성될 수 있는 최대 파드 수
  3. 업데이트 속도 및 애플리케이션 가용성을 제어하는 데 도움이 됩니다.
  4. 배포 동작을 미세 조정할 수 있습니다.

요약

이 랩에서는 Kubernetes 개발 환경을 설정하는 데 중요한 첫 번째 단계인 Minikube 를 사용하여 로컬 Kubernetes 클러스터를 시작하고 확인하는 방법을 배웠습니다. 또한 샘플 애플리케이션으로 NGINX 이미지를 사용하여 Kubernetes Deployment 를 통해 간단한 웹 애플리케이션을 생성하고 배포하는 방법을 배웠습니다. 배포 프로세스에는 배포 매니페스트 파일을 생성하고 클러스터에 적용하는 작업이 포함되었습니다.

애플리케이션의 초기 버전을 배포한 후, 배포 YAML 에서 애플리케이션 이미지를 업데이트하고, 성공적인 업데이트를 확인하고, 업데이트 실패를 시뮬레이션하고 진단하며, 안정적인 버전으로 롤백하고, 배포 YAML 에서 롤링 업데이트 전략을 조정하는 방법을 배우게 됩니다.