-
๋ฐ์ํ
๐ก Helm์ด๋?
- helm์ ์ฟ ๋ฒ๋คํฐ์ค ํจํค์ง ๋งค๋์ ์ด๋ค. apt, yum, pip ํด๊ณผ ๋น์ทํ๊ฒ ํ๋ซํผ์ ํจํค์ง๋ฅผ ๊ด๋ฆฌํ๋ค.
- helm์ ์ด์ฉํ์ฌ ์ํ๋ ์ํํธ์จ์ด(ํจํค์ง)๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค์ ์์ฝ๊ฒ ์ค์นํ ์ ์๋ค.
- helm ํจํค์ง ๋ํ YAML ํ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ์ด๊ฒ์ Chart๋ผ๊ณ ํ๋ค.
- Chart ๋๋ ํ ๋ฆฌ ์์๋ Deployment, Service ๋ฑ๊ณผ ๊ฐ์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๊ฐ YAML ํ์ผ ํํ๋ก ๋ค์ด๊ฐ ์๋ค. ๊ฐ ํ์ผ๋ค์ ์ค์ ๊ฐ์ ๋น์์ ธ ์๊ณ (placeholder) values.yaml์ ์ค์ ๊ฐ๋ค๋ก ์ฑ์์ง๋ค. ํจํค์ง๊ฐ ์ค์น๋ ์์ ์ values.yaml ํ์ผ์ ์ค์ ๊ฐ๋ค์ ์ด์ฉํ์ฌ templates ๋๋ ํ ๋ฆฌ์ ๋ค์ด์๋ YAML ํ์ผ์ ๊ตฌ๋ฉ๋ ๋ถ๋ถ์ ์ฑ์ด๋ค. values.yaml ํ์ผ์๋ ์์ฃผ ๋ฐ๋๊ฑฐ๋ ์ฌ์ฉ์๋ง๋ค ๋ฌ๋ผ์ง๋ ์ค์ ๊ฐ๋ค์ ์ ๋ ฅํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๊ณ templates ๋๋ ํ ๋ฆฌ๋ ํจํค์ง์ ๋ผ๋๋ฅผ ์ด๋ฃฌ๋ค.
๐ ์ฐจํธ ๊ตฌ์กฐ
ChartStructure/ Chart.yaml # ์ฐจํธ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง YAML ํ์ผ LICENSE # ์ต์ : ์ฐจํธ์ ๋ผ์ด์ผ์ค ์ ๋ณด๋ฅผ ๊ฐ์ง ํ ์คํธ ํ์ผ README.md # ์ต์ : README ํ์ผ values.yaml # ์ฐจํธ์ ๋ํ ๊ธฐ๋ณธ ํ๊ฒฝ์ค์ ๊ฐ๋ค values.schema.json # ์ต์ : values.yaml ํ์ผ์ ๊ตฌ์กฐ๋ฅผ ์ ์ฝํ๋ JSON ํ์ผ charts/ # ์ด ์ฐจํธ์ ์ข ์๋ ์ฐจํธ๋ค์ ํฌํจํ๋ ๋๋ ํฐ๋ฆฌ crds/ # ์ปค์คํ ์์์ ๋ํ ์ ์ templates/ # values์ ๊ฒฐํฉ๋ ๋, ์ ํจํ ์ฟ ๋ฒ๋คํฐ์ค manifest ํ์ผ๋ค์ด ์์ฑ๋ ํ ํ๋ฆฟ๋ค์ ๋๋ ํฐ๋ฆฌ templates/NOTES.txt # ์ต์ : ๊ฐ๋จํ ์ฌ์ฉ๋ฒ์ ํฌํจํ๋ ํ ์คํธ ํ์ผ
๐ Chart.yaml Fields
apiVersion: ์ฐจํธ API ๋ฒ์ (ํ์) name: ์ฐจํธ๋ช (ํ์) version: SemVer 2 ๋ฒ์ (ํ์) kubeVersion: ํธํ๋๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ ์ SemVer ๋ฒ์ (์ ํ) description: ์ด ํ๋ก์ ํธ์ ๋ํ ๊ฐ๋ตํ ์ค๋ช (์ ํ) type: ์ฐจํธ ํ์ (์ ํ) keywords: - ์ด ํ๋ก์ ํธ์ ๋ํ ํค์๋ ๋ฆฌ์คํธ (์ ํ) home: ํ๋ก์ ํธ ํํ์ด์ง์ URL (์ ํ) sources: - ์ด ํ๋ก์ ํธ์ ์์ค์ฝ๋ URL ๋ฆฌ์คํธ (์ ํ) dependencies: # ์ฐจํธ ํ์์กฐ๊ฑด๋ค์ ๋ฆฌ์คํธ (optional) - name: ์ฐจํธ๋ช (nginx) version: ์ฐจํธ์ ๋ฒ์ ("1.2.3") repository: ์ ์ฅ์ URL ("https://example.com/charts") ๋๋ ("@repo-name") condition: (์ ํ) ์ฐจํธ๋ค์ ํ์ฑ/๋นํ์ฑ์ ๊ฒฐ์ ํ๋ boolean ๊ฐ์ ๋ง๋๋ yaml ๊ฒฝ๋ก (์์: subchart1.enabled) tags: # (์ ํ) - ํ์ฑํ / ๋นํ์ฑ์ ํจ๊ปํ๊ธฐ ์ํด ์ฐจํธ๋ค์ ๊ทธ๋ฃนํ ํ ์ ์๋ ํ๊ทธ๋ค enabled: (์ ํ) ์ฐจํธ๊ฐ ๋ก๋๋ ์ ์๋์ง ๊ฒฐ์ ํ๋ boolean import-values: # (์ ํ) - ImportValues ๋ ๊ฐ์ ธ์ฌ ์์ ํค์ ๋ํ ์์ค ๊ฐ์ ๋งตํ์ ๋ณด์ ํ๋ค. ๊ฐ ํญ๋ชฉ์ ๋ฌธ์์ด์ด๊ฑฐ๋ ํ์ / ์์ ํ์ ๋ชฉ๋ก ํญ๋ชฉ ์์ผ ์ ์๋ค. alias: (์ ํ) ์ฐจํธ์ ๋ํ ๋ณ๋ช ์ผ๋ก ์ฌ์ฉ๋๋ค. ๊ฐ์ ์ฐจํธ๋ฅผ ์ฌ๋ฌ๋ฒ ์ถ๊ฐํด์ผํ ๋ ์ ์ฉํ๋ค. maintainers: # (์ ํ) - name: maintainer๋ค์ ์ด๋ฆ (๊ฐ maintainer๋ง๋ค ํ์) email: maintainer๋ค์ email (๊ฐ maintainer๋ง๋ค ์ ํ) url: maintainer์ ๋ํ URL (๊ฐ maintainer๋ง๋ค ์ ํ) icon: ์์ด์ฝ์ผ๋ก ์ฌ์ฉ๋ SVG๋ PNG ์ด๋ฏธ์ง URL (์ ํ) appVersion: ์ด ์ฑ์ ๋ฒ์ (์ ํ). SemVer์ธ ํ์๋ ์๋ค. deprecated: ์ฐจํธ์ deprecated ์ฌ๋ถ (์ ํ, boolean) annotations: example: ํค๋ก ๋งคํ๋ ์ฃผ์๋ค์ ๋ฆฌ์คํธ (์ ํ).
1.1. Helm ์ค์น
$ brew install helm
1.2. Chart ์์ฑ
$ helm create <CHART_NAME>
$ helm create mychart Creating mychart $ ls mychart Chart.yaml charts templates values.yaml - Chart.yaml: chart ์ด๋ฆ, ๋ฒ์ ์ ๋ณด ๋ฑ chart์ ์ ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค. - charts: chart ์์ ๋ ๋ค๋ฅธ ์ฌ๋ฌ chart๋ค์ ๋ฃ์ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋น์ด์๋ค. - templates/: chart์ ๋ผ๋๊ฐ ๋๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๊ฐ ๋ค์ด์๋ ํด๋์ด๋ค. - values.yaml: ์ฌ์ฉ์๊ฐ ์ ์ํ๋ ์ค์ ๊ฐ์ ๊ฐ์ง YAML ํ์ผ์ด๋ค.
1.3 templates/service.yaml
apiVersion: v1 kind: Service metadata: name: {{ include "mychart.fullname" . }} labels: {{- include "mychart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} # ์๋น์ค ํ์ ์ง์ ports: - port: {{ .Values.service.port }} # ์๋น์ค ํฌํธ ์ง์ targetPort: http protocol: TCP name: http selector: {{- include "mychart.selectorLabels" . | nindent 4 }}
- service.yaml ๋ด์ฉ์ ๋ณด๋ฉด placeholder({{ key }})๊ฐ ์๋ ๊ฒ์ ํ์ธํด๋ณผ ์ ์๋ค.
1.4 values.yaml
replicaCount: 1 image: repository: nginx pullPolicy: IfNotPresent imagePullSecrets: [] nameOverride: "" fullnameOverried: "" ... service: type: LoadBalancer port: 8888 ...
- YAML ํ์์ ๋ฐ๋ผ ์ค์ ๊ฐ๋ค์ด ์ ํ์๋ค. ์ service.yaml์ ์ง์ ๋์ด ์๋ service.type๊ณผ service.port ํ์ธ(example) service.type๊ณผ service.port๋ฅผ ๊ฐ๊ฐ ๋ก๋๋ฐธ๋ฐ์์ 8888๋ก ์์ ํ๋ค.
1.5 Chart ์ค์น
helm install <CHART_NAME> <CHART_PATH>
$ helm install foo ./mychart NAME: foo LAST DEPLOYED: Mon May 30 13:22:06 2022 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: 1. Get the application URL by running these commands: NOTE: It may take a few minutes for the LoadBalancer IP to be available. You can watch the status of by running 'kubectl get --namespace default svc -w foo-mychart' export SERVICE_IP=$(kubectl get svc --namespace default foo-mychart --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}") echo http://$SERVICE_IP:8888
1.6 Service ์กฐํ
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE foo-mychart LoadBalancer 10.108.49.163 <pending> 8888:30633/TCP 28s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19m
- Type๊ณผ Port๋ฅผ ๋ณด๋ฉด values.yaml์์ ์ ์ํ๋๋ก LoadBalancer์ 8888 ํฌํธ๋ก ์ง์ ๋์ด ์๋๊ฒ์ ํ์ธํ ์ ์๋ค.
2-1. Helm Repository
- helm์ ์ฌ์ฉํ ๋์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์ธ๋ถ์ ์ ๊ตฌ์ถ๋ ์ ํ๋ฆด์ผ์ด์ ์ ์์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํด์ค๋ค๋ ์ ์ด๋ค. helm๋ง ์ ์ฌ์ฉํด๋ ์ฟ ๋ฒ๋คํฐ์ค ์ํ๊ณ์์ ์ง์ํ๋ ๋ค์ํ๊ณ ๊ฐ๋ ฅํ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ ํ์ฉํ ์ ์๋ค.
- helm์๋ chart ์๊ฒฉ ์ ์ฅ์์ธ Repository ์๋ค. Repository๋ ์ฌ๋ฌ chart๋ฅผ ํ ๊ณณ์ ๋ฌถ์ด์ ๋ณด๊ดํด๋์ ์ ์ฅ์์ด๋ค. ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ์์ ์ ๊ณต๋๋ Repository๋ฅผ ์ถ๊ฐํด์ ์๊ฒฉ ์ ์ฅ์๋ก๋ถํฐ chart๋ฅผ ๋ก์ปฌ ํด๋ฌ์คํฐ์ ์ค์นํ ์๋ ์๋ค.
2-2. Repository ์ถ๊ฐ
$ helm repo add nginx-stable https://helm.nginx.com/stable
2-3. Repository ์ ๋ฐ์ดํธ
$ helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "nginx-stable" chart repository Update Complete. โHappy Helming!โ
- ์ถ๊ฐํ ๋ ํ์งํ ๋ฆฌ์ ์ธ๋ฑ์ค ์ ๋ณด๋ฅผ ์ต์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ๋๊ฒ์ด ํ์ํ๋ค. helm์ ๋ ํ์งํ ๋ฆฌ ์ ๋ณด๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์ฑํด์, ์ ๊ท chart๋ฅผ ์ค์นํ๊ธฐ ์ํด์ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ค.
2-4. ์ธ๋ถ Chart ์ค์น
$ helm install nginx nginx-stable/nginx-ingress --set rbac.create=true
- ๋ก์ปฌ ๋๋ ํ ๋ฆฌ์ chart๊ฐ ์กด์ฌํ์ง ์๋๋ผ๋ ์๊ฒฉ ๋ฆฌํ์งํ ๋ฆฌ์ ์๋ chart๋ฅผ ์ค์น ํ ์ ์๋ค.
- ์์์ ์ค์นํ nginx-stable ๋ ํ์งํ ๋ฆฌ์์ nginx-ingress chart๋ฅผ ์ค์นํ๋ค.
2-5. Nginx-ingress ์กฐํ
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 172.20.0.1 <none> 443/TCP 18m nginx-nginx-ingress LoadBalancer 172.20.206.178 ac935cd6f67ab42128f5d46606b76e7f-1861304753.ap-northeast-2.elb.amazonaws.com 80:32472/TCP,443:32499/TCP 4m40s
- ์ด๋ ๋ฏ ํด๋ฌ์คํฐ ์์ Nginx ๊ด๋ จ๋ ์ํํธ์จ์ด ํ๋ ์์ด๋ ๋ ํ์งํ ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ helm install ๋ช ๋ น ํ๋๋ก ์์๊ฐ์ ๋ง๋ค ์ ์๋ค.
References
https://helm.sh/ko/docs/chart_template_guide/getting_started/๋ฐ์ํ