DevOps/Kubernetes

k8s service 에서 label 을 바꿀때의 다운타임?

100win10 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를 종료한다.

 


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