ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • k8s service 에서 label 을 바꿀때의 다운타임?
    DevOps/Kubernetes 2022. 4. 25. 00:38

    서비스에서 라벨을 바꿀 때의 다운타임

    Kubernetes에서 애플리케이션을 배포하고 운영하는 과정에서, 서비스의 라벨을 변경해야 하는 상황이 발생할 수 있다. 이러한 변경 과정에서 서비스의 가용성을 유지하는 것이 중요하다.

    새로운 Deployment 준비

    첫 번째 단계는 새로운 Deployment를 준비하는 것이다. 새로운 Deployment는 기존 Deployment와 동일한 역할을 수행하지만, 새로운 라벨을 가진다. 이를 통해 서비스 셀렉터가 변경될 때 새로운 Deployment로 트래픽을 라우팅할 수 있다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: new-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-app
          version: v2
      template:
        metadata:
          labels:
            app: my-app
            version: v2
        spec:
          containers:
          - name: my-container
            image: my-new-image
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8080
              initialDelaySeconds: 5
              periodSeconds: 10
            lifecycle:
              preStop:
                exec:
                  command: ["/bin/sh", "-c", "sleep 10"]

    위의 예시에서 새로운 Deployment는 version: v2 라벨을 가지고 있다. 이 라벨은 나중에 서비스 셀렉터가 참조할 라벨이다.

    새로운 Deployment의 준비 상태 확인
    새로운 Deployment의 모든 Pod가 Ready 상태가 되기 전까지 서비스 셀렉터를 변경하지 않는다. 이를 위해 kubectl get pods -l app=my-app,version=v2 명령어를 사용하여 모든 Pod가 Ready 상태인지 확인한다.

    서비스 셀렉터 업데이트
    새로운 Deployment가 완전히 준비된 후, 서비스의 셀렉터를 업데이트하여 트래픽을 새로운 Pod로 라우팅한다. 이 과정에서 다운타임이 발생하지 않도록 하기 위해서는 반드시 새로운 Pod가 Ready 상태인지 확인한 후 셀렉터를 변경해야 한다.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
        version: v2
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080

    이 설정을 적용하면, 서비스는 이제 version: v2 라벨을 가진 Pod로 트래픽을 전달하게 된다.

    이전 Deployment 종료
    서비스가 새로운 Deployment로 안정적으로 트래픽을 전달하는 것이 확인되면, 이전 Deployment를 종료한다. 이를 통해 불필요한 리소스를 해제하고, 시스템의 복잡성을 줄일 수 있다.

    kubectl delete deployment old-deployment

    Kubernetes에서 서비스 라벨을 변경할 때 다음과 같은 단계로 해보자.

     

    1. 새로운 Deployment를 준비한다.
    2. 새로운 Deployment의 Pod가 완전히 Ready 상태가 되었는지 확인한다.
    3. 서비스 셀렉터를 새로운 라벨로 업데이트한다.
    4. 이전 Deployment를 종료한다.

     


    이러한 단계를 준수하면, 서비스의 가용성을 유지하면서 라벨 변경 작업을 수행할 수 있다. 이를 통해 클라이언트에게 안정적인 서비스를 제공할 수 있다.

Designed by Tistory.