🤔
helm create nginx
를 실행하면 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/
를 통해 파일들을 전부 지워주겠습니다.
nginx/
├── charts
├── Chart.yaml
├── templates
└── values.yaml
🫠다음 templates 폴더 밑에 service.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
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
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.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가 실행되고 있는 것을 확인 할 수 있습니다.
위에서는 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
🤓
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 was a success! Happy Helming!
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)