kubernetes/practical

Hands-On Helm: Deploying Essential Kubernetes Components

blogger903 2024. 8. 27. 18:10
728x90

"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에서 제거됩니다