일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- eBPF
- CANARY
- Kopf
- opentelemetry
- serving
- Kubeflow
- argocd
- mlops
- nginx ingress
- MLflow
- blue/green
- kubernetes operator
- CI/CD
- Kubernetes
- xdp
- Model Serving
- Argo
- Continuous Deployment
- 오퍼레이터
- gitops
- Kubernetes 인증
- Litmus
- Pulumi
- operator
- 카오스 엔지니어링
- keda
- seldon core
- tekton
- opensearch
- knative
- Today
- Total
Kubernetes 이야기
kubernetes yaml 을 helm chart로 변환하기 본문
Helm Chart는 Kubernetes의 다양한 Resource들을 한개의 Package로 관리하기 좋은 방법이다.
Kubernetes의 다양한 Workload ( deployment, statefulset, daemonset 등 ), Service, Ingress, PV/PVC, CRD 등 하나하나 생성/삭제, 업그레이드 등을 사용자가 관리하기에는 상당히 부담스러운것이 사실이다. 또한 이러한 Resource 들을 여러 Cluster, Namespace에서 Template형태로 사용할 때는 Helm Chart만한 것이 없다.
하지만, Helm Chart를 이용하여 Template 형태로 만드는 것 또한 쉽지 않다.
이번에는 기존 Kubernetes Yaml 들을 Helm Chart로 손쉽게 만든는 Tool인 helmify 를 테스트 해보자.
helmify
https://github.com/arttor/helmify
helmify는 Kubernetes yaml에서 Helm Chart를 생성하는 CLI 도구이다. 현재 버전은 Helm 3.6.0 이상을 지원한다.
설치
# wget https://github.com/arttor/helmify/releases/download/v0.3.8/helmify_0.3.8_Linux_64-bit.tar.gz
# tar xvfz helmify_0.3.8_Linux_64-bit.tar.gz
# mv helmify /usr/local/bin/.
테스트
먼저 Kubernetes yaml 들을 준비하자.
# ls -al
total 24
drwxr-xr-x. 2 root root 128 Mar 15 22:52 .
dr-xr-x---. 18 root root 4096 Mar 15 22:43 ..
-rw-r--r--. 1 root root 328 Mar 15 22:37 deployment-backend.yaml
-rw-r--r--. 1 root root 366 Mar 15 22:37 deployment-front.yaml
-rw-r--r--. 1 root root 1012 Mar 15 22:37 ing.yaml
-rw-r--r--. 1 root root 171 Mar 15 22:37 svc-backend.yaml
-rw-r--r--. 1 root root 169 Mar 15 22:37 svc-front.yaml
현재 yaml들은 deployment 2개, service 2개, ingress 1개인 평범한 yaml들이다.
이것을 helm chart로 변환해 보자.
# awk 'FNR==1 && NR!=1 {print "---"}{print}' *.yaml | helmify mychart
# awk 'FNR==1 && NR!=1 {print "---"}{print}' *.yaml 을 하는 이유는 각 yaml 들에는 '---' 행이 없어 모든 yaml들을 읽으면 구분자가 없기 때문이다.
이렇게 실행하면 mychart 라는 폴더가 생성되어 있다.
# cd mychart/
# ls -al
total 12
drwxr-x---. 3 root root 79 Mar 15 22:54 .
drwxr-xr-x. 3 root root 143 Mar 15 22:54 ..
-rwxr-x---. 1 root root 1139 Mar 15 22:54 Chart.yaml
-rwxr-x---. 1 root root 349 Mar 15 22:54 .helmignore
drwxr-x---. 2 root root 118 Mar 15 22:54 templates
-rw-------. 1 root root 352 Mar 15 22:54 values.yaml
먼저 values.yaml 을 살펴보자.
# cat values.yaml
backend:
backend:
image:
repository: docker.io/tomcat
tag: "9"
ports:
- port: 8080
protocol: TCP
targetPort: 8080
replicas: 1
type: ClusterIP
frontend:
front:
image:
repository: ghcr.io/kmaster8/httpd
tag: v1
ports:
- port: 80
protocol: TCP
targetPort: 80
replicas: 1
type: ClusterIP
기본적으로 빼어야 할 이미지명, 포트번호, replicas, service type 등이 자동으로 values 에 세팅된다.
templates폴더를 한번 보면
# cd templates/
# ls
backend.yaml deployment.yaml frontend.yaml _helpers.tpl ingress-example.yaml
# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . }}-backend
labels:
{{- include "mychart.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.backend.replicas }}
selector:
matchLabels:
app: backend
{{- include "mychart.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
app: backend
{{- include "mychart.selectorLabels" . | nindent 8 }}
spec:
containers:
- image: {{ .Values.backend.backend.image.repository }}:{{ .Values.backend.backend.image.tag
| default .Chart.AppVersion }}
name: backend
ports:
- containerPort: 8080
resources: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . }}-frontend
labels:
{{- include "mychart.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.frontend.replicas }}
selector:
matchLabels:
app: frontend
{{- include "mychart.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
app: frontend
{{- include "mychart.selectorLabels" . | nindent 8 }}
spec:
containers:
- image: {{ .Values.frontend.front.image.repository }}:{{ .Values.frontend.front.image.tag
| default .Chart.AppVersion }}
imagePullPolicy: Always
name: front
ports:
- containerPort: 80
기본적인 helm chart구조가 잘 만들어진다. 이렇게 만들어진 helm chart를 배포해 보자.
# helm install mychart -n test .
NAME: mychart
LAST DEPLOYED: Tue Mar 15 22:57:48 2022
NAMESPACE: test
STATUS: deployed
REVISION: 1
TEST SUITE: None
# helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx ingress-nginx 2 2022-02-24 21:31:07.27383963 +0900 KST deployed ingress-nginx-4.0.17 1.1.1
mychart test 1 2022-03-15 22:57:48.636627499 +0900 KST deployed mychart-0.1.0 0.1.0
sonarqube sonarqube 1 2022-03-03 18:42:51.115816574 +0900 KST deployed sonarqube-2.0.0+248 9.3.0
vault vault 1 2022-03-14 22:13:43.449404186 +0900 KST deployed vault-0.19.0 1.9.2
실제 배포된 app들을 확인해 보자.
# kubectl get all -n test
NAME READY STATUS RESTARTS AGE
pod/mychart-backend-6f7f9c9cf7-vsfnb 1/1 Running 0 65s
pod/mychart-frontend-8547b9694-87h77 1/1 Running 0 65s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mychart-backend ClusterIP 10.97.201.147 <none> 8080/TCP 65s
service/mychart-frontend ClusterIP 10.103.173.124 <none> 80/TCP 65s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mychart-backend 1/1 1 1 65s
deployment.apps/mychart-frontend 1/1 1 1 65s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mychart-backend-6f7f9c9cf7 1 1 1 65s
replicaset.apps/mychart-frontend-8547b9694 1 1 1 65s
'Kubernetes > 일반' 카테고리의 다른 글
Kubernetes Pod Eviction (0) | 2022.04.02 |
---|---|
Pod에서 imagePullSecrets 설정하기 (0) | 2022.03.24 |
Nginx Ingress Path 기반 라우팅 설정 (0) | 2022.03.15 |
로컬 Kubernetes 클러스터 - kind 설치 (0) | 2022.03.08 |
Nginx Ingress 트래픽 모니터링 결과로 Auto Scale 사용하기 (0) | 2022.02.28 |