2 minute read

일지

특이 사항 없음

오늘의 할일

  • 220530 TIL 작성
  • Kubernetes udemy 강좌 수강
  • Side Project 진행

주요 키워드

  • S/W 배포/테스트 전략
  • K8s
    • Deployment

수업 정리

소프트웨어 배포 전략/테스트 전략

배포 전략

  • 재생성
    • 현재 동작중인 인스턴스들을 모두 중지하고 새로운 인스턴스를 생성하여 배포
    • 기존 동작중인 어플리케이션이 모두 중지되므로, 다운타임 발생
    • 가장 단순한 배포방식
  • 순차 배포
    • 기존 어플리케이션과 새로운 버전의 어플리케이션을 함께 구동
    • 재성성 배포 방식과 달리 서비스의 다운타임의 없게 하거나 최소화 할 수 있음
    • 기존 어플리케이션과 신규 어플리케이션의 호환성을 고려
  • 블루/그린 배포
    • 기존 어플리케이션과 신규 어플리케이션의 리소스를 동시에 생성
    • 기존 어플리케이션에서 신규 어플리케이션으로 한번에 이전 가능, 다운타임 없음
    • 비용의 문제 고려가 필요 (동시에 기존/신규 어플리케이션 인프라 필요)

테스트 전략

  • 카나리 테스트 : 새로운 어플리케이션을 테스트하기 위하여 테스트용 리소스를 일부만 배포하여 테스트
  • A/B: 같은 요청에 대하여 A와 B로 나누어진 요청 처리를 하도록하여 정상 처리 여부 등을 확인
  • 섀도우 테스트: 기존 서비스의 요청을 미러링 하여 테스트 리소스로 전달

디플로이먼트(Deployment)

  • 컨트롤러의 유형 중 하나
  • 레플리카셋의 상위 리소스 처럼 동작
    디플로이먼트 - 레플리카셋 - 파드
  • 업데이트 기능을 제공

레플리케이션 컨트롤러를 사용한 롤링업데이트(순차업데이트)

  1. 롤링업데이트를 위한 RC리소스 및 서비스 리소스 생성

     apiVersion: v1
     kind: ReplicationController
     metadata:
       name: rolling-update-rc
     spec:
       replicas: 3
       selector:
         app: myapp
       template:
         metadata:
           labels:
             app: myapp
         spec:
           containers:
           - name: rolling-update-container
             image: misayo/myapp:1
             ports:
             - containerPort: 80
               protocol: TCP
    
     apiVersion: v1
     kind: Service
     metadata:
       name: rolling-update-service
     spec:
       selector:
         app: myapp
       ports:
       - targetPort: 80
         port: 80
    
  2. 테스트 리소스 생성 후, 서비스를 통해 출력되는 http응답 및 파드 상태를 모니터링
    watch -n 1 curl <서비스IP> watch -n 1 kubectl get pod

  3. 레플리케이션 컨트롤러의 롤링업데이트 기능을 사용한 업데이트 수행 kubectl rolling-update <현재RC> <새로운RC> --image=misayo/myapp:2 (현재 1.21.12 버전에서는 더이상 rolling-update 서브커맨드 지원하지 않음)

레플리케이션 컨트롤러의 롤링업데이트의 문제점

  1. 명령어에 의한 직접적인 업데이트 수행: 업데이트 중지 등의 문제가 발생할 수 있음. 명령의 오류 발생시 업데이트 불가
  2. 레이블 정보를 임의로 추가: 사용자에 의한 추가가 아닌 업데이트 작업에 의한 임의의 수정이 발생하여 문제가 될 수도 있음. (deployment 레이블 생성)

디플로이먼트 리소스

  1. 명령어의 지속적인 실행상태에 의한 업데이트가 아닌 리소스 차원의 업데이트 수행
  2. 리소스의 임의 변경 등이 필요하지 않음

디플로이먼트 리소스 테스트

  1. 디플로이먼트 리소스 생성

     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: rolling-update-deployment
     spec:
       selector:
         matchLabels:
           app: myapp
       template:
         metadata:
           labels:
             app: myapp
         spec:
           containers:
           - name: rolling-update-container
             image: misayo/myapp:1
             ports:
             - containerPort: 80
               protocol: TCP
    
     apiVersion: v1
     kind: Service
     metadata:
       name: rolling-update-service
     spec:
       selector:
         app: myapp
       ports:
       - targetPort: 80
         port: 80
    
  2. 테스트 리소스 생성 후 확인
    kubectl get deployments.apps rolling-update-deployment -o yaml

     spec:
     ...
       strategy:
         rollingUpdate:
           maxSurge: 25%
           maxUnavailable: 25%
         type: RollingUpdate
     ...
    

    type: RollingUpdate / Recreate

  3. 기존 Deployment 리소스 삭제 후 재 생성
    kubectl delete -f deployment.yaml
    kubectl create -f deployment.yaml –record
    kubectl rollout status deployment rolling-update-deployment
    kubectl history status deployment rolling-update-deployment

  4. 디플로이먼트 리소스에 대한 업데이트 수행
    kubectl set image deployment rolling-update-deployment rolling-update-container=misayo/myapp:2
    kubectl set image deployment <디플로이먼트이름> <컨테이너명>=<이미지>

  5. 업데이트 실행 후 상태 확인
    kubectl rollout status deployment rolling-update-deployment
    kubectl history status deployment rolling-update-deployment

  6. v2 → v3 업데이트 수행 (–record 포함)
    kubectl set image deployment rolling-update-deployment rolling-update-container=misayo/myapp:3 –record

  7. 업데이트 롤백 (undo)
    kubectl rollout undo deployment rolling-update-deployment –to-revision=2
    kubectl rollout undo deployment <디플로이먼트이름> --to-revision=<리비전번호>

  8. 오브젝트 파일을 사용하여 리소스 업데이트

     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: rolling-update-deployment
       annotations:
         kubernetes.io/change-cause: Container Image set to misayo/myapp:3
     spec:
       replicas: 3
       selector:
         matchLabels:
           app: myapp
       template:
         metadata:
           labels:
             app: myapp
         spec:
           containers:
           - name: rolling-update-container
             image: misayo/myapp:3
             ports:
             - containerPort: 80
               protocol: TCP
    

Categories:

Updated:

Leave a comment