티스토리 뷰

728x90
반응형
728x170

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
반응형
그리드형
댓글
댓글쓰기 폼