ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CKAD - Application Deployment
    Tools for IT/- Kubernetes 2024. 3. 11. 17:59

    Understand Deployments and how to perform rolling updates

    Use Kubernetes primitives to implement common deployment strategies (e.g. blue/green or canary)

     

    Deployment

    Create

    kubectl create -f <deployment_yml_file>

    Get

    kubectl get deployments

    Describe

    kubectl describe deployment <deployment_name>

    Update

    • Apply file
    kubectl apply -f <deployment_yaml_file>

     

    • Set image
    kubectl set image deployment/<deployment_name> <container_name>=<image_detail>

     

    Status

    • Status
    kubectl rollout status deployment/<deployment_name>
    • History
    kubectl rollout history deployment/<deployment_name>

    기본적으로 kubectl history에서 CHANGE-CAUSE는 <none>으로 되어 있고 CHANGE-CAUSE에 기록하길 원한다면 아래와 같이 deployment를 생성할 때--record를 설정해줘야 한다.

    kubectl create -f <deployment_yml_file> --record

     

    Delete

    kubectl delete deployment <deployment_name>

    Rollback

    • 현재 상태의 배포의 오류가 발생했을때 이전 배포 상태로 돌리는 기능
    kubectl rollout undo deployment/<deployment_name>

     

    배포 전략

    Recreate

    • 모든 pod를 한 번에 down 시키고 새로운 것을 한 번에 up 하는 단순한 방식

    Rolling Update

    • 새로운 pod로 하나씩 교체(기본 배포 전략)
    • RollingUpdateStrategy: 25% max unavailable, 25% max surge
      • maxSurge: 업데이트 중 desired Pod 개수 중 생성될 수 있는 Pod 비율
        • e.g. desired Pod: 4개, maxSurge: 25% -> 새로 생성될 수 있는 Pod: 1개
      • maxUnavailable: 업데이트 중 unavailable Pod로 만들 수 있는 Pod 비율
        • e.g. desired Pod: 4개, maxUnavailable: 25% -> 정지시킬 수 있는 Pod: 1개
    •  

    Blue Green

    • Blue와 Green 모두 배포한 상태에서 배포된 Green의 테스트가 완료되면 트래픽을 한 번에 100% 전환하는 방식
      • Blue: 기존 버전
      • Green: 신규 버전
    • Deployment 배포 전략으로 선택할 수는 없고 Deployment와 Service로 구현해야 함.

    Blue Green 구현 

    • 구현 순서
      1. Deployment - blue 배포 <- Service가 blue Deployment의 selector 설정
      2. Deployment - green 배포
      3. green 테스트 및 완료
      4. Service 라벨 선택기 green으로 Update

    Example

    • myapp-blue.yml (Deployment yaml file)
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-blue
      labels:
        app: myapp
        type: front-end
    spec:
      template:
        metadata:
          name: myapp-pod
          labels:
            version: v1
        spec:
          containers:
          - name: app-container
            image: myapp-image:1.0
    replicas: 5
    selector:
      matchLabels:
        version: v1
    • my-service.yml (Service yaml file)
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        version: v1

    기존의 배포(blue) 상태는 위와 같음.

     

    아래과 같이 변경한 green 배포

    • myapp-green.yml (Deployment yaml file)
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-green
      labels:
        app: myapp
        type: front-end
    spec:
      template:
        metadata:
          name: myapp-pod
          labels:
            version: v2
        spec:
          containers:
          - name: app-container
            image: myapp-image:2.0
    replicas: 5
    selector:
      matchLabels:
        version: v2

    Green 테스트 완료 후 service selector update

     

    • my-service.yml (Service yaml file)
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        version: v2

    Canary

    • Canary 배포 방식
      1. 기존 배포 Pod들 배포된 상태
      2. 몇 개의 Test 용 새로운 버전의 Pod 배포
      3. 적은 양의 트래픽만 새로운 버전으로 경로를 지정
      4. 새로운 버전으로 들어온 트래픽이 정상적으로 동작하는 것이 테스트 완료
      5. 기존 배포들을 새로운 버전으로 Update
      6. Test 용 새로운 버전의 Pod 제거
    • Blue/Green 배포 전략과 마찬가지로 Deployment 배포 전략으로 선택할 수는 없고 Deployment와 Service로 구현해야 함.

    Canary 구현

    • 구현 순서
      1. 기존 primary 배포가 존재하는 상태 <- Service가 front-end를 selector로 선택
      2. canary를 최소 replica(1)로 설정하여 배포
        1. 이때 canary의 image와 version은 Update
      3. Service는 label을 선택하여 트래픽을 분산하기 때문에 primary(5)와 canary(1)로 트래픽이 분산됨
      4. canary가 정상적으로 동작하는 것이 테스트 완료
      5. primary의 image와 version을 Update
      6. canary 배포 제거

    Example

    • myapp-primary.yml (Deployment yaml file)
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-primary
      labels:
        app: myapp
        type: front-end
    spec:
      template:
        metadata:
          name: myapp-pod
          labels:
            version: v1
            app: front-end
        spec:
          containers:
          - name: app-container
            image: myapp-image:1.0
    replicas: 5
    selector:
      matchLabels:
        version: front-end
    • my-service.yml (Service yaml file)
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        version: front-end

    위와 같이 배포된 상태에서

     

    canary 배포

    • myapp-canary.yml (Deployment yaml file)
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-canary
      labels:
        app: myapp
        type: front-end
    spec:
      template:
        metadata:
          name: myapp-pod
          labels:
            version: v2
            app: front-end
        spec:
          containers:
          - name: app-container
            image: myapp-image:2.0
    replicas: 1
    selector:
      matchLabels:
        version: front-end
    반응형

    댓글

Designed by Tistory.