Kubernetes

Kubernetes 기초 - Helm(2)

사실 나도 모름 2024. 1. 27. 04:47
  1. Helm 차트 구조
  2. Helm 차트 만들기
  3. 변수를 설정한 Helm 차트 만들기
  4. Helm Upgrade와 Rollback 실행
  5. Helm 차트 파일(package) 만들기

1. Helm 차트 구조

Chart : Helm에서 사용하는 패키지 포맷

helm pull [Chart] : Helm Chart를 로컬에 다운로드

helm create [Chart] : 새로운 Helm Chart를 생성

 

 

차트 생성

helm create myapp

myapp 차트를 생성 후 디렉토리 구조

 

위에서 부터 차례대로 무엇을 하는 파일과 디렉토리인지 설명하면 다음과 같다.

  • charts : dependency chart파일들을 저장하는 디렉토리
  • Chart.yaml : chart 정보를 정의
  • templates : kubernetes 리소스 템플릿이 보관되는 디렉토리
  • NOTES.txt : chart를 설치 후 출력할 메시지 정의
  • templates 내부 .yaml파일들 : 쿠버네티스 클러스터에 실행할 리소스 템플릿
  • values.yaml : kubernetes templates file에 적용하는 변수 정의

 

우리가 helm install 명령으로 애플리케이션 서비스를 실행하고 싶을 때 각 API 오브젝트의 정보가 담긴 yaml파일은 templates 디렉토리 내부에 넣으면 된다.

 

직접 차트를 커스터마이징하면서 나만의 차트를 만들어보자.

 

 

 


2. Helm 차트 만들기

mynginx chart 만들기

# 클러스터에서 실행할 templates yaml 만들기
mkdir manifests ; cd manifests
kubectl create deployment webserver --image nginx:1.25.2 --port 80 -o yaml > deployment.yaml
kubectl expose deployment webserver --port 80 --target-port 80 --type NodePort -o yaml > service.yaml
cd .. ; kubectl delete -f manifests/.

# mynginx chart 템플릿 생성
# Chart.yaml, values.yaml, templates yaml 구성
helm create mynginx
rm mynginx/templates/* mynginx/templates/{_helpers.tpl,NOTES.txt}
rm -rf mynginx/templates/tests/
cp manifests/* mynginx/templates/
vi mynginx/Chart.yaml	# 내부 구조 확인
vi mynginx/values.yaml	# 내부 구조 확인

# 실행 오류 점검 후 Chart 실행
helm lint mynginx/
helm install webserver ./mynginx

# 서비스 동작 중인지 확인
helm list
kubectl get all
curl localhost:<NodePort Number>
helm uninstall webserver

최종적으로 다음과 같은 형태로 만들면 된다.
오류가 없지만 아이콘 하나 넣는 걸 추천한다고 출력된다. 무시해도 된다.
실행
생성된 리소스들
nginx 실행

 

여기까지 우리가 차트를 만들고 실행하는 것까지 해보았다.

이 차트를 .tgz 확장자 파일로 압축하여 리포지토리에 업로드하면 다른 사람에게 배포할 수도 있다.

실습 완료했으면 helm uninstall webserver명령을 입력하여 모든 리소스를 정리한다.

 

 

 


3. 변수를 설정한 Helm 차트 만들기

모든 변수들은 values.yaml파일에 저장되어 해당 변수를 templates 디렉토리에 있는 yaml파일들이 사용하는 형태이다.

이렇게 하면 좀더 유연한 애플리케이션을 생성할 수 있고 수정사항이 생겼을 경우 values.yaml에서 값만 수정하여 다시 배포하면 변경점들이 그대로 적용되기 때문에 더 효율적이라 할 수 있다.

 

cat > mynginx/values.yaml
replicaCount: 2
image: 
  repository: nginx
  tag: 1.25.2
  pullPolicy: IfNotPresent
  pullSecret:
service: 
  type: NodePort

 

 

기존의 deployment.yaml 파일을 다음과 같이 수정한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: "{{ .Chart.Name }}"
  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
          protocol: TCP

 

 

기존의 service.yaml 파일을 다음과 같이 수정한다.

apiVersion: v1
kind: Service
metadata:
  labels:
    app: webserver
  name: "svc-{{ .Release.Name }}"
  namespace: default
spec:
  clusterIP: 10.109.57.122
  ports:
  - nodePort: 32133
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: "{{ .Chart.Name }}"
  type: "{{ .Values.service.type }}"

 

쿠버네티스에서 필드의 값을 지시할 때 자주 사용되는 jsonPath와 동일한 형태다.

이와 같이 변수의 값을 직접 사용하여 템플릿 yaml파일에 값을 전달할 수 있게 된다.

 

다시 차트를 실행한다.

helm install webserver ./mynginx/

두 개의 파드가 생성되었다.

 

기존에 values.yaml파일에서 replicaCount를 2로 지정했기 때문에 그 값을 그대로 가져다 쓴 deployment가 두 개의 파드를 생성한 것이다.

.Release.Name은 우리가 helm install <이름> ./mynginx/ 로 명령을 실행할 때 저 <이름> 부분이 .Release.Name으로 동작하는 것이다.

 

 

파일 전체의 값을 보면 다음과 같다.

 

 

 


4. Helm Upgrade와 Rollback 실행

이미 실행 중인 차트의 내용을 수정하는 방법도 가능하다.

 

다음은 webserver의 이미지를 변경하는 명령이다.

helm upgrade --set image.repository=httpd --set image.tag=2.4.58-alpine webserver mynginx

REVISION이 2가 되었고 정상적으로 배포되었다.
출력의 결과가 다르다.

 

겉으로는 별로 바뀐게 없어도 이미지가 바뀌어서 출력도 다르게 출력된다.

이미지와 이벤트를 보면 httpd 이미지가 다운로드 되었다.

 

이와 같이 리소스를 업그레이드 할 수도 있다.

 

 

 

REVISION 2

 

REVISION이 2가 되었다는 말은 다시 1로 되돌아갈 수도 있다는 말이다.

이번에는 차트를 Rollback 해보자.

helm rollback webserver 1

Rollback
nginx 웹서버

 

롤백을 한 이후 다시 nginx 웹서버가 출력된다.

여기서 다시 롤백하면 Apache 웹서버가 되고 거기서 또 롤백하면 다시 nginx 웹서버가 된다.

이전에 Deployment를 롤링업데이트하고 롤백했던 것과 동일하다.

 

실습이 끝났으면 리소스를 다시 정리한다.

helm uninstall webserver

 

 

 


5. Helm 차트 파일(package) 만들기

Helm 차트를 .tgz 확장자 형태로 파일을 만들어 주는 방법이다.

helm package mynginx/

릴리즈 이름과 버전이 붙어서 생성됨

 

Chart.yaml 파일 내부에 version 정보가 릴리즈 이름과 함께 결합되어 파일이 생성된다.

만약 차트의 내용이 수정된다면 Chart.yaml 의 version 정보도 함께 수정하여 다시 package명령으로 파일을 생성하면 다음 버전의 차트 패키지가 생성되는 것이다.

이제 이 패키지를 내가 원하는 리포지토리에 넣어서 다른 사람들이 사용할 수 있도록 배포할 수 있다.

다음은 github 리포지토리에 나만의 패키지를 배포하는 방법을 알아보자.

 

 


 

 

아래 영상을 참조하였습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohLYdvfX-UEFYTE7kfnnY36&si=QfnuyP_2OpoDOsX1

 

[따배쿠 Advance] 쿠버네티스 심화 시리즈

 

www.youtube.com

 

'Kubernetes' 카테고리의 다른 글

Kubernetes - Metrics Server, PodAutoScaling  (0) 2024.02.03
Kubernetes 기초 - Helm(3)  (0) 2024.01.30
Kubernetes 기초 - Helm(1)  (0) 2024.01.25
Kubernetes 기초 - Custom Resources  (0) 2024.01.24
kubernetes 기초 - RBAC(2)  (0) 2024.01.24