Step 17 연습 과제 — Helm
실습 네임스페이스: step17. 모두 끝나면 helm uninstall 후 kubectl delete ns step17.
과제 1. helm template으로 렌더 결과 예측하기
replicaCount=5, page.message="quiz"로 렌더했을 때 Deployment의 replicas와 index.html의 <h1>이 어떻게 나올지, 클러스터에 설치하지 않고 확인하세요.
해답
helm template quiz ./chart --set replicaCount=5 --set page.message="quiz" \
| grep -E "replicas:|<h1>"
replicas: 5
<h1>quiz</h1>
--dry-run은 클러스터 API에 접속해 검증까지 하지만, helm template은 완전히 로컬입니다.
과제 2. -f와 --set의 우선순위
values-prod.yaml에는 replicaCount: 3이 있습니다. 아래 명령의 결과 replica는 몇일까요?
helm template x ./chart -f ./chart/values-prod.yaml --set replicaCount=7 | grep "replicas:"
해답
7입니다. 우선순위는 values.yaml(2) < -f(3) < --set(7). 뒤로 갈수록 이깁니다.
과제 3. named template 추가하기
_helpers.tpl에 webapp.image라는 named template을 만들어 "{{ .Values.image.repository }}:{{ .Values.image.tag }}"를 반환하게 하고, deployment.yaml에서 include로 사용하세요.
해답
_helpers.tpl에 추가:
{{- define "webapp.image" -}}
{{ .Values.image.repository }}:{{ .Values.image.tag }}
{{- end -}}
deployment.yaml의 image 줄을 교체:
image: "{{ include "webapp.image" . }}"
helm template demo ./chart | grep image:로 nginx:1.27-alpine이 그대로 나오는지 확인.
과제 4. if로 Service 타입 토글
values.yaml에 service.nodePort 값을 추가하고, service.type이 NodePort일 때만 nodePort 필드가 렌더링되도록 service.yaml을 수정하세요.
해답
service.yaml의 ports 아래:
ports:
- name: http
port: {{ .Values.service.port }}
targetPort: 80
{{- if eq .Values.service.type "NodePort" }}
nodePort: {{ .Values.service.nodePort }}
{{- end }}
확인:
helm template x ./chart --set service.type=NodePort --set service.nodePort=30080 | grep -A1 nodePort
helm template x ./chart | grep nodePort # ClusterIP 이면 아무것도 안 나옴
과제 5. 롤백 시나리오
replicaCount=10으로 잘못 업그레이드했다고 가정하고, (1) 현재 리비전을 확인한 뒤 (2) 바로 직전 리비전으로 롤백하고 (3) 이력을 확인하세요.
해답
helm install web ./chart -n step17 --create-namespace --wait # rev1
helm upgrade web ./chart -n step17 --set replicaCount=10 --wait # rev2 (실수)
helm history web -n step17 # 현재 rev2 deployed
helm rollback web 1 -n step17 --wait # rev3 = "Rollback to 1"
kubectl get deploy web-webapp -n step17 -o jsonpath='{.spec.replicas}'; echo # 2
helm history web -n step17
helm rollback web 0처럼 0을 주면 "바로 이전 리비전"으로 롤백됩니다(리비전 번호를 몰라도 됨).