Helm에 대하여- Kubernetes Helm Chart Repositories | Part 2

양승현·2023년 9월 5일
0

kubernetes

목록 보기
11/18
post-thumbnail

Helm Chart

Chart의 기본 구조

  • Helm에서 사용하는 패키지 포맷
# helm chart를 로컬에 다운로드
$ helm pull [Chart name] 
# 새로운 helm chart 기본 구조를 생성
$ helm create [Chart name]
$ helm create yang

# 디렉터리 및 파일 확인
$ tree yang
Demo (Chart.yaml과 values.yaml, templates 폴더는 고정 포멧)
├── Chart.yaml ------------------------------ chart 정보를 정의한 yaml (EX, # helm show chart bitnami/Demo를 쳤을 때 나오는 정보들이 저장되는 yaml
├── charts ---------------------------------- dependency chart 파일들을 저장하는 디렉터리
├── templates ------------------------------- kubernetes 리소스 템플릿이 보관되는 디렉터리 (templates 폴더 안의 기타 yaml 파일들은 고정적이지 않음)
│   ├── NOTES.txt --------------------------- chart를 설치한 후 출력할 메세지를 정의한 txt 파일(chart의 도움말 helm install 시 사용자에게 표시)
│   ├── _helpers.tpl ------------------------ chart 전체에서 다시 사용할 수 있는 템플릿 헬퍼를 지정
│   ├── deployment.yaml --------------------- kubernetes cluster에 실행할 리소스 템플릿
│   ├── ingress.yaml
│   ├── service.yaml
└── values.yaml ---------------------------------- kubernetes templates file에 적용하는 변수 정의

helm chart 구성하기

nginx chart 만들기

  • 클러스터에 실행할 templates yaml 생성하기
$ mkdir chart; cd chart

$ kubectl create deployment yang --image nginx:1.25.2 --port 80 -o yaml > deployment.yaml

$ kubectl expose deployment yang --port 80 --target-port 80 --type NodePort -o yaml > service.yaml
  • nginx chart templates 생성하기
## Chart.yaml & values.yaml & templates 생성
# 나만의 helm chart 생성
$ helm create yangnginx

# chart 디렉터리에 구성한 deployment.yaml & service.yaml 복사
$ cp chart/* yangnginx/templates/
  • Chart.yaml 편집
## 생성된 yangnginx Chart.yaml
$ vi Chart.yaml
apiVersion: v2
name: yangnginx
description: yang seunghyun chart 
type: application
version: 0.1.0
appVersion: "1.16.0"
  • 실행 오류 점검 후 Chart 실행
# 실행 오류 점검
$ helm lint yangnginx/

# yang 이름을 가진 yangnginx helm chart install
$ helm install yang ./yangnginx
NAME: yang
LAST DEPLOYED: Thu Sep 5 22:23:33 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

# kubernetes 상 정상 동작 하는지 확인
$ kubernetes get all
  • 서비스가 잘 동작중인지 확인
$ helm list

$ kubectl get all
# nignx 호출
$ curl localhost:nodeport # service.yaml을 통해 배포된 nodeport를 입력 (kubectl get svc yang)

# helm chart로 배포한 kubernete 리소스 삭제
$ helm uninstall yang

변수를 설정한 helm chart 구성하기

value.yaml 구성 살펴보기

  • yangnginx/value.yaml 설정하기
# cat value.yaml
replicaCount: 1
image:
  repository: nginx
  tag: 1.25.2
  pullPolicy: IfNotPresent
  pullSecret:
service:
  type: NodePort
  • value.yaml 설정 후 templates 디렉터리 안의 yaml 파일 value 설정하기
$ cd /yangnginx/templates
$ vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: yang
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: yang
  template:
    metadata:
      labels:
        app: yang
    spec:
      containers:
      - image: nginx:1.25.2
        imagePullPolicy: IfNotPresent
        name: nginx
        ports: 
        - containerPort: 80
## 아래와 같이 value 설정 변경하기
## 아래와 같이 변경한 value 값은 변수가 정의되어 있는 value.yaml과 매칭된다.
$ 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
$ 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 }}
  • 실행 오류 점검 후 Chart 실행
# 실행 오류 점검
$ helm lint yangnginx/

# yang 이름을 가진 yangnginx helm chart install
$ helm install yang ./yangnginx ## {{ .Release.Name }}의 값은 install시 정의한 이름인yang으로 값이 들어가게 된다.
NAME: yang
LAST DEPLOYED: Thu Sep 5 22:23:33 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

# kubernetes 상 정상 동작 하는지 확인
$ kubernetes get all
  • 서비스가 잘 동작중인지 확인
$ helm list
REVISION 1

$ kubectl get all
# nignx 호출
$ curl localhost:nodeport # service.yaml을 통해 배포된 nodeport를 입력 (kubectl get svc yang)

# helm chart로 배포한 kubernete 리소스 삭제
$ helm uninstall yang

helm chart rolling update & rollback

  • helm으로 실행한 chart 수정해서 재배포하기
# image nginx -> httpd, tag 1.25.2 -> 2.2.34-alpine으로 변경하기
$ helm upgrade --set image.repository=httpd --set image.tag=2.2.34-alpine yang yangnginx
# 이력 조회, upgrade를 했기때문에 REVISION은 1 -> 2 로 변경됨
$ helm list
REVISION 2
  • helm을 이용하여 이전에 배포한 nginx로 다시 rollback하여 재배포
# image httpd -> nginx, tag 2.2.34-alpine -> 1.25.2으로 rollback
# 맨 뒤 1은 helm list로 조회한 REVISION이며 1로 입력시 변경 전 버전으로 돌아가며 이후 REVISION은 3으로 변경됨
$ helm rollback yang 1
$ helm list
REVISION 3

helm chart file 만들기

  • 지금까지 만든 helm chart를 tgz 패키지로 압축
$ helm package yangnginx
$ ls yangnginx-0.1.0.tgz ## 0.1.0은 chart.yaml에 정의된 version으로 정의된다.

0개의 댓글