helm 차트 생성 및 사용

greenTea·2023년 9월 16일
0

helm 차트 생성 및 사용

chart 생성

🤔helm create nginx를 실행하면 nginx라는 폴더가 생깁니다.
tree nginx를 통해 보시면 아래와 같은 구조를 보여줄 것입니다.

tree nginx의 결과

nginx/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

😎rm nginx/templates/*.yaml nginx/templates/{_helpers.tpl,NOTES.txt}
rm -rf nginx/templates/tests/를 통해 파일들을 전부 지워주겠습니다.

지우고 난 후의 tree nginx의 결과

nginx/
├── charts
├── Chart.yaml
├── templates
└── values.yaml

🫠다음 templates 폴더 밑에 service.yaml과 deployment.yaml 파일을 만들어줍니다.


파일 생성

deployment.yaml

cat > nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:{{ .Values.imageVersion }}
        ports:
        - containerPort: 80

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort

value.yaml

replicaCount: 1
imageVersion: "1.19.3"

😊위에서 deployment.yaml에서 보시면 image: nginx:{{ .Values.imageVersion }}와 같은 표현을 보실수 있습니다.
values파일의 imageVersion을 사용하겠다는 의미이며 imageVersion은 저희가 value.yaml에 1.19.3으로 설정해 놓았습니다.

이제 직접 helm을 통해 실행해보겠습니다.

helm install mynginx ./nginx/

명령 실행 결과 창

NAME: mynginx
LAST DEPLOYED: Sun Sep 10 15:46:52 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

🤔 위 명령어 실행 후 pod를 확인해보시면 1개의 nginx가 실행되고 있는 것을 보실 수 있습니다. 또한 저희가 서비스를 NodePort로 설정했기에 확인해보시면 랜덤한 포트가 열려있는 것을 확인 할 수 있습니다.

정말 잘 되는지 curl node IP:service port를 실행해보면 성공적으로 나오는 것을 확인 할 수 있습니다.


values 변경

😑values.yaml을 변경하여 정말로 값이 변경되는지를 확인해보겠습니다.
위에서 replicaCount를 1로 설정해놓았는데 이 값을 2로 변경한 후에 시작해 보겠습니다.

replicaCount: 2   <-- 2로 변경
imageVersion: "1.19.3"

다음 helm upgrade mynginx ./nginx을 통해 변경된 값을 이용하도록 해줍니다.

명령 실행 결과

Release "mynginx" has been upgraded. Happy Helming!
NAME: mynginx
LAST DEPLOYED: Sun Sep 10 15:53:23 2023
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None

🤗kubectl get deployment를 실행해보면 deployment에 2개의 pod가 실행되고 있는 것을 확인 할 수 있습니다.

helm upgrade

위에서는 values.yaml의 값을 변경하여 이용하였지만 직접 명령어를 통해 변경할 수도 있습니다.

이미지의 버전을 latest로 변경해보겠습니다.

helm upgrade mynginx ./nginx/ --set imageVersion=latest

위 명령어를 실행한 후에 describe로 확인해보시면 실제로 최신버전의 nginx가 동작중인 것을 확인 할 수 있습니다.

변경된 이미지 버전

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  26s   default-scheduler  Successfully assigned default/nginx-deployment-7777f55dd5-xxcsl to gke-my-cluster-default-pool-8ae128ca-3kkx
  Normal  Pulled     26s   kubelet            Container image "nginx:latest" already present on machine
  Normal  Created    26s   kubelet            Created container nginx
  Normal  Started    26s   kubelet            Started container nginx

rollback

🤓helm list를 실행해보면 아래와 같은 값을 볼 수 있습니다.

NAME            NAMESPACE       REVISION        UPDATED                                 STATUS  CHART           APP VERSION
mynginx         default         3               2023-09-10 15:58:04.218566168 +0000 UTC deployednginx-0.1.0     1.16.0  

🤔revision의 경우 쿠버네티스에서 rollback을 할 때 사용하던 revision과 같은 것으로 이해하시면 됩니다.

현재 위 과정까지 진행했다면 nginx는 최신번전인 latest로 나올 것입니다.
다시 전 단계로 rollback을 하여 nginx의 버전을 기존 버전인 1.19.3로 변경해보겠습니다.

helm rollback mynginx 2

rollback 실행 직후의 결과 창

Rollback was a success! Happy Helming!

pod의 이미지 정보

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  17s   default-scheduler  Successfully assigned default/nginx-deployment-84446cbc78-sx2d7 to gke-my-cluster-default-pool-8ae128ca-nnjm
  Normal  Pulled     16s   kubelet            Container image "nginx:1.19.3" already present on machine
  Normal  Created    16s   kubelet            Created container nginx
  Normal  Started    16s   kubelet            Started container nginx

🥳위 값을 보면 실제로 1.19.3으로 변경된 것을 보실 수 있습니다.

추가

{{ }}는 Go 언어의 문법으로 예를 들어서 아래와 같은 values.yaml파일과 deployment.yaml 파일이 있을 경우

replicaCount: 3
image:
  repository: nginx
  tag: latest
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
      - name: my-container
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"

와 같이 {{ .Values.키-값] }}을 이용하면 values.yaml에 있는 값으로 교체되서 실행이 됩니다.

참고자료 : [따배쿠] 21. Helm 사용하기(2)

profile
greenTea입니다.

0개의 댓글