"k8s 클러스터에 springboot application 배포후 모니터링" 연재를 다루는데 helm 파트가 적지 않고, 이번에 helm chart를 직접 만들어서 install 해보는 결과 helm으로 애플리케이션 배포에 대한 포스팅을 따로 다뤄야할것 같아서 이렇게 포스팅하게 되었습니다
이번 포스트에서는 helm chart를 생성해서, k8s cluster에 애플리케이션을 배포하는 실천적인 내용을 다룹니다
환경
- Apple M2 Pro
- macOS Sonoma
다루는 내용
- helm chart
- helm install
- helm uninstall
준비사항
- yaml로 k8s에 배포할 svc, deployment 작성해서 k8s cluster에 배포해보기
helm chart 생성
helm create demo
helm: command not found 라고 뜬다면? helm를 설치해야 됩니다
brew install helm
https://helm.sh/docs/intro/install/#from-homebrew-macos
Installing Helm
Learn how to install and get running with Helm.
helm.sh
다시 helm create를 하면 helm chart가 생성됩니다
$ helm create demo
Creating demo
명령어를 실행한 디렉토리에 demo 디렉토리가 생성되고 템플릿 파일들이 생성된것을 확인합니다
tree demo/
demo/
├── Chart.yaml # 차트에 대한 정보가 담긴 YAML 파일
├── charts # 차트에 종속된 차트들을 포함하는 디렉터리
├── templates # values 파일과 같이 유효한 쿠버네티스 메니페스트 파일을 생성하는 템플릿
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 차트의 기본 템플릿 변수 파일
4 directories, 10 files
yaml로 k8s에 배포할 svc, deployment 등이 있다는 가정하에 이제 deployment.yaml을 보고 삭제해줍니다
한번은 봐주세요 이런게 있다라는것을 보고 다시 직접 작성한 yaml을 찾아서 복사한후 차트 디렉토리에 붙여놓습니다
deployment는 각자 다를거에요
기존의 deployment에 {{ .Values.projectName }} 템플릿이 보이는데 values.yaml에 명시한 값이 helm install할때 치환됩니다
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.projectName }}-deployment
labels:
app: {{ .Values.projectName }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Values.projectName }}
template:
metadata:
labels:
app: {{ .Values.projectName }}
spec:
containers:
- name: {{ .Values.projectName }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- name: http
containerPort: 80
protocol: TCP
envFrom:
- secretRef:
name: {{ .Values.projectName }}-app-secret
https://helm.sh/docs/intro/quickstart/
values.yaml
# 프로젝트 이름 추가
projectName: "my-app"
{{.Values.image.repository }} 의 경우에는?
이런형식으로 설정을 하면 설치할때 다음과 같이 치환됩니다.
spec.template.spec.containers[0].image: "nginx:latest"
image:
repository: nginx
tag: latest
자 이제 nginx 배포하겠습니다 배포해도 확인할 방법이 없기 때문에 svc도 같이 만들어줍니다
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.projectName }}-service
labels:
app: {{ .Values.projectName }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: 80
protocol: TCP
name: http
selector:
app: {{ .Values.projectName }}
values.yaml
# 프로젝트 이름 추가
projectName: "my-app"
replicaCount: 1
image:
repository: nginx
tag: latest
service:
type: LoadBalancer
port: 8080
helm install
helm chart로 k8s resource를 배포하겠습니다
이제 k8s cluster context 확인하시고 dry-run으로 yaml 미리보기를 출력해봅니다
appName은 아무거나 입력해주세요.
그리고 이렇게 입력값을 helm 내부에서 예약어로 참조할수도 있고 cli로 실행시 옵션을 덮어쓰기도 가능합니다
$ helm install <appName> ./demo --dry-run
자 이제 yaml이 잘 출력된다면 helm으로 deployment와 svc를 배포해줍니다
$ helm install demo-app ./demo
lens로 Deployments, Services 탭에서 잘 배포된것을 확인할 수 있습니다
helm uninstall
배포된 helm chart를 확인합니다
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
demo default 1 2024-08-26 16:33:00.465901 +0900 KST deployed helm-demo-0.1.0 1.16.0
my-strimzi-release default 1 2024-08-16 01:52:54.682196 +0900 KST deployed strimzi-kafka-operator-0.42.0 0.42.0
helm chart를 삭제해줍니다
helm uninstall demo
차트에 포함된 모든 k8s 리소스가 k8s cluster에서 제거됩니다
'kubernetes > practical' 카테고리의 다른 글
Using HashiCorp Vault with Kubernetes SecretStore: Hands-on Guide (0) | 2024.08.21 |
---|---|
Kubernetes Vault Deployment: A Hands-on Guide with Minikube (0) | 2024.08.20 |