Code States/TIL

[0519] (페어) 컨테이너 오케스트레이션 - 새 버전이 망가졌어요

ki1111m2 2023. 5. 19. 12:09

새 버전이 망가졌어요! 3.0에서 2.0으로 롤백하기

 

새 버전이 망가졌어요! 스프린트는, 버그가 있는 새 버전을 쿠버네티스를 이용해 롤링 업데이트를 시도하고, 구버전으로 롤백하는 과정을 담은 스프린트입니다.

시나리오

여기 CozServer라는 간단한 WAS가 있습니다. 버전 1.0은 정상적으로 잘 작동하는 애플리케이션입니다. 여기에 디플로이먼트 명세를 적용해서 파드의 레플리카를 배포할 것입니다. 이후에 2.0 버전을 만들고, 디플로이먼트를 이용해 업데이트를 적용합니다. 여기까지는 전혀 문제가 없습니다.

그러나 여기서 우리는 3.0 버전에 의도적으로 버그를 만들 것입니다. 3.0 버전에 문제가 발생하면, 2.0 버전으로 롤백해야 합니다. 이러한 과정을 통해 실질적으로 서비스 전체에 문제가 생기는 것을 막는 법을 배워봅시다.

목표

이번 스프린트에서 여러분에게 요구하는 스킬은 다음과 같습니다.

  • 파드 명세를 작성할 수 있다.
  • 디플로이먼트 명세를 작성할 수 있다.
  • 서비스를 이용해 파드를 노출할 수 있다.
  • kubectl apply 명령을 이용해 리소스를 생성할 수 있다.
  • 디플로이먼트 명세를 수정(또는 재작성)하여 새로운 버전을 배포할 수 있다.
  • kubectl rollout 명령을 이용해 롤링 배포 현황을 확인할 수 있다.
  • 새로운 버전에 문제가 발생했을 때 롤백할 수 있다.

Bare Minimum Requirement

Getting Started 가이드를 통해, 보다 구체적인 안내가 제공됩니다. 🏁 이모지는 해당 STEP의 목표, ✅ 해당 STEP에서 잊지 말고 진행해야 할 것을 안내합니다.

  • 개별 STEP 마다 총 다섯 번의 커밋 기록이 있어야 합니다.
  • 작성해서 제출해야 하는 파일은 다음과 같습니다.
    • cozserver-deployment-v1.yaml
    • cozserver-deployment-v2.yaml
    • cozserver-deployment-v3.yaml
    • cozserver-service.yaml
    • rollback-log.txt (롤백 터미널 로그)

Step 1: 파드

apiVersion: v1
kind: Pod
metadata:
  name: cozserver
spec:
  containers:
  - name: cozserver
    image: sebcontents/cozserver:1.0
    ports:
    - containerPort: 8080

Step 2: 디플로이먼트를 이용한 1.0 배포

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cozserver
  labels: 
    app: cozserver
spec:
  replicas: 1
  selector:
    matchLabels: 
      app: cozserver
  template:
    metadata: 
      labels:
        app: cozserver
    spec:
      containers:
      - name: cozserver
        image: sebcontents/cozserver:1.0
        ports:
        - containerPort: 8080

Step 3: 서비스

apiVersion: v1
kind: Service
metadata:
  name: cozserver
  namespace: default
spec:
  selector: 
    app: cozserver
  type: LoadBalancer
  ports:
  - name: cozserver
    protocol: TCP
    port: 80
    targetPort: 8080

Step 4: 2.0 배포, 롤아웃

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cozserver
  labels: 
    app: cozserver
spec:
  replicas: 1
  selector:
    matchLabels: 
      app: cozserver
  template:
    metadata: 
      labels:
        app: cozserver
    spec:
      containers:
      - name: cozserver
        image: sebcontents/cozserver:2.0
        ports:
        - containerPort: 8080

기존 배포(1.0)가 여전히 실행 중이고, 새 배포(2.0)가 시작된다

새 배포(2.0)가 시작된 후, 기존 배포(1.0)는 종료된다

종료된 배포(1.0)는 삭제된다

Step 3: 3.0 배포와 2.0으로의 롤백

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cozserver
  labels: 
    app: cozserver
spec:
  replicas: 1
  selector:
    matchLabels: 
      app: cozserver
  template:
    metadata: 
      labels:
        app: cozserver
    spec:
      containers:
      - name: cozserver
        image: sebcontents/cozserver:3.0
        ports:
        - containerPort: 8080

기존 배포(2.0)가 여전히 실행 중이고, 새 배포(3.0)가 시작된다

새 배포(3.0)가 시작된 후, 기존 배포(2.0)는 종료된다

종료된 배포(2.0)는 삭제된다