[Helm] Helm (2)
Helm
Helm 차트 생성
실습
[Helm Chart 구성 전 작업]
# Helm chart 생성 전, 구성 yaml 파일 생성
# Create helm chart : mynginx
mkdir manifests
kubectl create deployment webserver --image nginx:1.25.2 --port 80 -o yaml > manifests/deployment.yaml
kubectl expose deployment webserver --port 80 --target-port 80 --type NodePort -o yaml > manifests/service.yaml
tree manifests/
kubectl delete -f deployments.yaml
kubectl delete -f service.yaml
# deployment.yaml 파일 수정
root@master:~/manifests# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webserver
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: webserver
template:
metadata:
labels:
app: webserver
spec:
containers:
- image: nginx:1.25.2
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
그냥 냅둬도 되는데 필요없는 spec들 지워보자,,
# service.yaml 파일 수정
root@master:~/manifests# vi service.yaml
apiVersion: v1
kind: Service
metadata:
name: webserver
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: webserver
type: NodePort
# helm chart 생성
root@master:~# helm create mynginx
Creating mynginx
# helm chart 구조 확인
root@master:~# tree mynginx/
mynginx/
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
4 directories, 10 files
불필요 파일 삭제 후 다시 확인해보자
root@master:~# rm mynginx/templates/*.yaml mynginx/templates/{_helpers.tpl,NOTES.txt}
root@master:~# rm -rf mynginx/templates/tests/
root@master:~# tree mynginx/
mynginx/
├── Chart.yaml
├── charts
├── templates
└── values.yaml
3 directories, 2 files
아까 manifests 디렉터리에 만들어 놓은 yaml 파일을 해당 nginx chart에 복사하자
root@master:~# cd manifests
root@master:~/manifests# ls
deployment.yaml service.yaml
root@master:~# cp manifests/* mynginx/templates/
root@master:~# tree mynginx/
mynginx/
├── Chart.yaml
├── charts
├── templates
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml
3 directories, 4 files
# Chart를 테스트 실행하여 문법 오류 유무 확인
# chart를 TEST 실행하여 오류 유무를 확인
# helm lint PATH [flags]
helm lint mynginx/
# helm chart 실행
root@master:~# helm install webserver ./mynginx
NAME: webserver
LAST DEPLOYED: Mon Jan 20 06:53:10 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# 확인
root@master:~# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/webserver-6fdb4fc7d-bkrcf 1/1 Running 0 49s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
service/webserver NodePort 10.96.55.139 <none> 80:30438/TCP 49s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webserver 1/1 1 1 49s
NAME DESIRED CURRENT READY AGE
replicaset.apps/webserver-6fdb4fc7d 1 1 1 49s
root@master:~# curl localhost:30438
service의 port로 접근해서, nginx 화면이 잘 나오면 성공
# 삭제
root@master:~# helm uninstall webserver
release "webserver" uninstalled
실습2
# mynginx chart에 변수(values.yaml) 설정
root@master:~# cat > mynginx/values.yaml
replicaCount: 1
image:
repository: nginx
tag: 1.25.2
pullPolicy: IfNotPresent
pullSecret:
service:
type: NodePort
# deployment.yaml 파일 수정
root@master:~/mynginx/templates# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: "deploy-{{ .Release.Name }}"
namespace: default
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: "{{ .Chart.Name }}"
template:
metadata:
labels:
app: "{{ .Chart.Name }}"
spec:
containers:
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
name: "{{ .Chart.Name }}"
ports:
- containerPort: 80
변수값을 통해 할당이 되게 끔 파일 수정
# service.yaml 파일 수정
root@master:~/mynginx/templates# vi service.yaml
apiVersion: v1
kind: Service
metadata:
name: "svc-{{ .Release.Name }}"
namespace: default
spec:
type: "{{ .Values.service.type }}"
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: "{{ .Chart.Name }}"
해당 파일도 동일
# tree 구조로 확인
root@master:~# tree mynginx/
mynginx/
├── Chart.yaml
├── charts
├── templates
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml
3 directories, 4 files
# helm chart 실행
root@master:~# helm install webserver ./mynginx/
NAME: webserver
LAST DEPLOYED: Mon Jan 20 07:32:23 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# 확인
root@master:~# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/deploy-webserver-75ddfdc77c-659l2 1/1 Running 0 2m10s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
service/svc-webserver NodePort 10.104.9.36 <none> 80:31048/TCP 2m10s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deploy-webserver 1/1 1 1 2m10s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deploy-webserver-75ddfdc77c 1 1 1 2m10s
# Helm chart rolling update
root@master:~# helm upgrade --set image.repository=httpd --set image.tag=2.2.34-alpine webserver mynginx
Release "webserver" has been upgraded. Happy Helming!
NAME: webserver
LAST DEPLOYED: Mon Jan 20 07:39:35 2025
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
# 확인
root@master:~# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VE RSION
webserver default 2 2025-01-20 07:39:35.467990862 +0000 UTC deployed mynginx-0.1.0 1.16.0
# Helm chart rolling back
root@master:~# helm rollback webserver 1
Rollback was a success! Happy Helming!
revision 1로 rollback
# 확인
root@master:~# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VE RSION
webserver default 3 2025-01-20 07:43:50.593053996 +0000 UTC deployed mynginx-0.1.0 1.16.0
# 삭제
root@master:~# helm uninstall webserver
release "webserver" uninstalled
helm chart package(파일) 만들기
# helm chart package 생성
root@master:~# helm package mynginx/
Successfully packaged chart and saved it to: /root/mynginx-0.1.0.tgz
# 확인
root@master:~# ls
mynginx-0.1.0.tgz
mynginx-0.1.0.tgw 파일이 만들어졌다.
* 0.1.0 : 차트 버전정보
# 차트 버전 정보 수정 후 helm package 생성
root@master:~# vi mynginx/Chart.yaml
apiVersion: v2
name: mynginx
description: A Helm chart for running nginx web server
type: application
version: 0.2.0
appVersion: "1.16.0"
Chart.yaml 파일의 버전 정보를 0.2.0로 업데이트했다.
root@master:~# helm package mynginx/
Successfully packaged chart and saved it to: /root/mynginx-0.2.0.tgz
# 확인
root@master:~# helm package mynginx/
Successfully packaged chart and saved it to: /root/mynginx-0.2.0.tgz
root@master:~# ls
mynginx-0.2.0.tgz
[참고 영상]
https://www.youtube.com/watch?v=DEUMYnR5wv4&list=PLApuRlvrZKohLYdvfX-UEFYTE7kfnnY36&index=14