Helm Chart 개발 팁

Install 및 Upgrade

차트 템플릿 생성

helm create mychart

불필요 파일 삭제

rm -rf deployment.yaml  hpa.yaml  ingress.yaml  service.yaml  serviceaccount.yaml  tests

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
spec:
  selector:
    matchLabels:
      type: app
  replicas: 1
  template:
    metadata:
      labels:
        type: app
    spec:
      initContainers:
      - name: init-myservice
        image: kubetm/app
        command: ["sh", "-c", "echo 'start'; sleep 30; echo 'done'"]
      containers:
      - name: container
        image: kubetm/app
        envFrom:
        - configMapRef:
            name: test-cm
        volumeMounts:
        - name: volume
          mountPath: /hostpath
      volumes:
      - name : volume
        persistentVolumeClaim:
          claimName: test-pvc

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-cm
data:
  env: prod
  log: Error

pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
  storageClassName: ""
  selector:
    matchLabels:
      name: test-pv

pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv
  labels:
    name: test-pv
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 1G
  hostPath:
    path: /host1
    type: DirectoryOrCreate

Install 배포

helm install mychart . -n nm-1 --create-namespace

해당 네임스페이스가 없으면 에러 발생

helm install mychart . -n nm-1 --create-namespace

배포와 동시에 네임스페이스 생성

생성 확인

kubectl get ns nm-1
kubectl get -n nm-1 pods

Upgrade

helm upgrade mychart . -n nm-1 

잘 동작한다

helm uninstall mychart -n nm-1 

하지만 배포된 차트를 삭제하고 나서 다이 업그레이드 명령어를 입력해보면

helm upgrade mychart . -n nm-1 

배포된 것이 없기 때문에 에러가 발생한다.

helm upgrade mychart . -n nm-1 --create-namespace --install

생성되었는지 확인해야하는 번거로움을 없애기 위해 업그레이드 시에 install 옵션을 준다.
이 명령어를 입력하면 입력한 헬름 차트가 존재하면 upgrade를 해주고 없다면 install로 배포를 해주기 때문에 상태를 확인할 필요가 없다.

helm upgrade mychart . -n nm-1 --create-namespace --install --wait --timeout 10m

wait 옵션을 주게 되면 파드가 생성될 때까지 기다렸다가 결과를 반환해 준다

Pod 자동 재기동

configmap.yaml 수정

data:
  env: prod
  log: Info

적용을 위해 업그레이드를 해보면

helm upgrade mychart . -n nm-1 --create-namespace --install

업그레이드는 되었지만 파드를 확인해보면

kubectl get -n nm-1 pods

파드는 재기동 되지 않는다.
configMap을 확인해 보면

kubectl get -n nm-1 cm -o yaml

수정이 되었다. 좀 더 확인해 보기 위해 파드의 env 내용을 보면

kubectl exec -n nm-1 test-6d949d676-cgldm -it env

적용이 되지 않았음을 알 수 있다.

deployment.yaml 업데이트

annotations:
  checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
#        rollme: {{ randAlphaNum 5 | quote }}

적용을 위해 업그레이드를 해보면

helm upgrade mychart . -n nm-1 --create-namespace --install

업그레이드가 되었고 파드를 확인해보면

kubectl get -n nm-1 pods

새로 생성되었음을 알 수 있다

env 내용을 확인을 해봐도

kubectl exec -n nm-1 test-54c444f478-9z752 -it env

적용이 잘 된 것을 알 수 있다.

원리:

  • 어노테이션에 configMap 파일 변화하는 것을 감지하는 코드 작성
  • configMap 파일을 인코딩 시켜 조금이라도 바뀌면 checksum/config:에 들어가는 값이 바뀌기 때문에 변화 감지 가능

기타 Resources

pv.yaml 수정

hostPath:
  path: /host2
  type: DirectoryOrCreate

PV는 생성이 된 뒤에는 수정이 불가능하기 때문에 에러 발생

수정을 위해 차트를 제거하고

helm uninstall mychart -n nm-1

PV 상태를 확인을 해본다

kubectl get pv
kubectl get pvc -n nm-1

완전히 리소스가 제거된 뒤에 다시 배포를 해보면

helm upgrade mychart . -n nm-1 --create-namespace --install

잘 배포가 되었고

kubectl get pv -o yam

pv도 잘 적용된다

네임스페이스 확인

헬름 목록을 확인해보고

helm list -n nm-1

헬름을 다시 삭제한 뒤에

helm uninstall mychart -n nm-1

또 다시 헬름 목록을 확인해보면

helm list -n nm-1

목록에 지워진 것을 알 수 있다.

하지만 네임스페이스를 보면

kubectl get ns nm-1

네임스페이스는 사라지지 않는다.

kubectl delete ns nm-1

그렇기 때문에 네임스페이스는 직접 제거를 해준다.

Helm 저장소

Install 및 Upgrade

helm upgrade mychart . -n nm-1 --create-namespace --install

Secret 확인

kubectl get -n nm-1 secret -l name=mychart
kubectl get -n nm-1 secret sh.helm.release.v1.mychart.v1 -o yaml

생성된 차트의 secret을 확인할 수 있다.

Helm History 확인

helm history -n nm-1 mychart

배포시 생성되는 Secret을 확인할 수 있다

helm upgrade mychart . -n nm-1 --create-namespace --install --history-max 2

업데이트시에 계속해서 secret이 생성되기 때문에 옵션을 주어 최대 2개까지만 생기도록 설정할 수 있다

kubectl get -n nm-1 secret -l name=mychart
helm history -n nm-1 mychart

다시 확인해보면 가장 오래된 secret.v1이 삭제되는 것을 볼 수 있다

[참조]: 인프런 - 대세는 쿠버네티스 [Helm편]

끝!