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편]
끝!