티스토리 뷰

728x90
반응형

Kubernetes는 Pod를 Deploy하기 위한 다양한 Template을 제공한다. 대표적으로 Deployment가 있으며, Deployment는 Pod와 Replica에 대한 정의를 담고 있다.

Deployment는 pod의 정보를 담고 있는 동시에 Kubernetes가 Pod를 재반영하는 기준이 된다. 즉 Kubernetes는 Deployment가 변경되었는지 여부를 확인하여 Pod를 재 배포한다. 이는 Application이 변경되어 DockerImage에 추가되었음에도 불구하고, 애플리케이션이 배포되지 않을 수 있음을 의미하며, 이를 강제로 적용하기 위해 RollOut을 수행하기도 한다.

Helm도 마찬가지로 이와 같은 현상이 발생할 수 있다.

Helm Install의 경우 신규 Pod를 생성하는 과정이기 때문에 배포가 가능하지만, Helm Upgrade의 경우 Pod를 정의하는 template/deployment.yaml 파일이 변경되지 않을 경우 배포가 발생하지 않는다.

이는 Pod를 정의하는 yaml과는 다르게 ConfigMaps 또는 Secrets이 변경 또는 삽입되거나 외부적인 요소의 변경(Database, External Componenet 연동 등)에 의해 Pod를 Rolling Update해야 할 경우 다음과 같은 조치가 필요하다.

Helm 2

1) --recreate-pods

helm upgrade --recreate-pods my-helm --username admin --password Harbor12345 --version 0.1.0 my-helm/my-helm

--recreate-pods 옵션으로 강제 redeploy를 한다. 다만, 강제 redeploy로 인한 side-effect를 차단하기 위해 해당 옵션은 Helm 3에서 제거되었다.

2) timestamp annotation

- deployment.yaml

kind: Deployment
spec:
  template:
    metadata:
      labels:
        app: my-helm-app
      annotations:
        timestamp: "{{ .Values.timestamp }}"

- CLI

helm upgrade --set-string timestamp=a_random_value my-helm-app . 

위와 같이 timestamp를 주입하여 매 upgrade 마다 변경된 timestamp를 적용하여 재 반영을 수행할 수 있다.

Helm 3

1) checksum 활용

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "configmap.yaml") . | sha256sum }}

위와 같이 반영 시 configmap.yaml의 변경 시 변경되는 checksum 정보를 반영할 수 있도록 주입한다. checksum의 경우 정해진 특정 파일의 변경 시를 정의할 수 있으며, 그밖의 파일이 변경 되었을 시에는 적용하지 않도록 할 수 있다.

2) rollme 적용

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        rollme: {{ randAlphaNum 5 | quote }}

모든 helm upgrade 시 강제로 반영할 수 있도록 조치하는 방법이다. helm 2의 --recreate-pod와 같은 기능과 유사하지만, 실제로 임의 rand 문자(Alpha, Num)로 대체되어 매번 deployment.yaml이 변경되었다고 인지시켜 Rolling Update를 수행하도록 한다.

# Tip

upgrade와 install을 동시에 사용하는 방법

helm upgrade --install my-helm my-helm/my-helm와 같은 형태로 사용하면, helm install과 upgrade를 함께 사용할 수 있다. 이는 release 버전에 my-helm이 있을 경우 upgrade를 없을 경우 install을 수행한다.

728x90
반응형