Kubernetes 이야기

kubernetes yaml 을 helm chart로 변환하기 본문

Kubernetes/일반

kubernetes yaml 을 helm chart로 변환하기

kmaster 2022. 3. 15. 23:00
반응형

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

 

GitHub - arttor/helmify: Creates Helm chart from Kubernetes yaml

Creates Helm chart from Kubernetes yaml. Contribute to arttor/helmify development by creating an account on GitHub.

github.com

 

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

 

 

반응형
Comments