6. Helm Chart

jjuyaa·2023년 4월 17일
0

GitOps

목록 보기
6/7

Helm 이란?

k8s cluster 에서 package 를 관리하는 것을 돕는 도구

3가지 개념

1. Chart

helm package

  • k8s cluster 내부에서 service,tool,application 을 run 하기 위해 필수적으로 필요한 resource definition을 모두 가지고 있다.
  • Chart특정 폴더 내의 파일들로 구성된다. 해당 폴더의 이름은 chart 의 이름이다.
    • 따라서 , wordPress 를 설명하는 chart 는 workpress/ directory 내에 저장된다.
  • 특정 폴더 내의 파일들은 deploy 되기 위해 versioned 된 결과물로 package 된다.

2. Repository

chart 가 모아지고, 공유되는 공간

3. Release

k8s cluster 에서 running 중인 chart 의 instance

  • 하나의 chart 는 같은 cluster 에 여러번 설치될 수 있다.
  • chart 가 설치될 때 마다 새로운 release 가 생성된다.

기본 명령어

1. helm search : chart 찾기

두가지 source 에서 chart 를 찾을 수 있다.

  • helm search hub : the Artifact Hub 에서 여러 다른 repo 에서 chart 를 찾는다.
  • helm search repo : helm repo add 명령어를 통해 이미 local 에 추가한 repository 에서 chart 를 찾는다. 따라서 인터넷 연결이 필요없다.
  • 또한, helm search 는 string 검색 기능이 제공하기 때문에 이를 사용해서 단어 또는 문구이 일부만 이력해 찾을 수 있다.
    • ex) helm search repo word → wordpress chart 나옴

2. helm install : package 설치하기

새로운 package 를 설치하기 위해 사용한다.

  • 두가지 인자(argument) 가 필요한다.
    • 내가 정하는 release name (helm 이 생성해줬으면 한다면 --generate-name 를 사용한다.)
    • install 하고자하는 chart name
  • chart 를 설치한다 == 새로운 release object 를 생성한다.
  • helm status 명령어를 통해 현재 release 의 상태를 볼 수 있다.
helm install happy-panda bitnami/wordpress
# 결과
NAME: happy-panda
LAST DEPLOYED: Tue Jan 26 10:27:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1

3. helm chart customize 하기

  • helm show values 명령어를 통해 해당 chart 가 정의한 옵션들을 확인할 수 있다.
  • YAML 파일 형태로 해당 명령어들을 override 하고, 해당 파일을 chart 설치 중 전달할 수 있다.
    • --values 또는 -f : override 할 YAML 파일을 명시한다. 여러 파일을 전달할 수 있고, 가장 오른쪽에 위치한 파일이 우선적이다.
    • --set : command line 에서 override 를 명시한다.
    • --set 으로 명시한 값들을 --values 에 높은 우선순위를 가지고 합쳐진다.
    • --set 으로 명시한 값들은 ConfigMap 안에서 지속되고, helm get values <release-name> 명령어로 확인할 수 있다.
    • helm upgrade 명령어를 사용할 때 --reset-values 옵션을 사용해 --set 으로 지정한 값을 초기화할 수 있다.

Chart

chart 는 directory 를 pacakage 로 만든 것

Chart directory 의 구성

<chart 명>/
  Chart.yaml          # A YAML file containing information about the chart
  values.yaml         # The default configuration values for this chart
  charts/             # A directory containing any charts upon which this chart depends.
  crds/               # Custom Resource Definitions
  templates/          # A directory of templates that, when combined with values,
                      # will generate valid Kubernetes manifest files.
  • Chart.yaml : chart 에 대한 정보 가진 yaml 파일
  • values.yaml : 차트에 대한 기본 환경 설정 값들
  • charts/ : 이 차트에 종속된 차트들을 포함하는 dir
  • templates/: values.yaml 과 결합해 유효한 k8s manifest file 들이 생성될 template 들의 dir

Chart.yaml 파일

apiVersion: 차트 API 버전 (필수)
name: 차트명 (필수)
version: SemVer 2 버전 (필수)

차트와 버저닝

모든 차트는 SemVer 2 표준을 따른 버전 번호를 가져야한다.

  • Helm v2 는 version number 를 release marker 로 사용한다.
  • repository 내의 package 는 name + version 으로 구별된다.
    • nginx 이름의 version: 1.2.3 을 가진 chart 는 nginx-1.2.3.tgz 로 이름지어진다.
  • helm package 명령어는 패키지명 안의 버전 번호가 Chart.yaml 파일 안의 version 필드의 값과 일치한다고 가정하고 실행된다. 그렇지 않을 시 에러가 발생한다.

Templates

values.yaml 과 결합해 유효한 k8s manifest file 들이 생성될 파일들의 dir

  • 모든 template 파일은 templates/ 폴더 내에 저장된다.
  • Helm 이 chart 를 rendering 할 때, template engine 을 통해 templates/ 폴더 내의 모든 파일을 전달한다.
  • values.yaml 파일 내의 값이 같이 렌더링된다.
    • value 값를 가진 다른 YAML 파일을 작성해 helm install 을 통해 전달할 수 있다, 이 경우 chart 폴더 내의 values.yaml 파일 안의 값을 override 한다.
  • template 파일은 모두 k8s manifest file 의 형식과 동일하다.

Templates File 내에서 values.yaml 내의 값 사용하는 방법

values.yaml 파일 내의 값은 .Values object 를 통해 template 에서 접근할 수 있다.

  • {{.Values.}} 로 template 에 values.yaml 파일의 값을 가져올 수 있다.

  • Predefined Values : values.yaml 파일 내에 작성한 값 외에 기존에 사용 가능한 값들

    • [Release.Name](http://Release.Name) : release 의 이름 (chart 의 이름이 아님)
    • Release.Namespace : chart 가 release 된 namespace 의 이름
    • Release.Service : release 를 수행하는 service
    • Release.IsUpgrade : 현재 업그레이드 or 롤백 중이면 true
    • Release.IsInstall : 현재 install 중이면 true
    • Chart : chart.yaml 내의 값을 가져올 수 있다.

Helm Chart 을 사용해 k8s deployment 수정하기

1. helm chart 생성하기

  • helm create <chart명>
    • ./<chart명 폴더가 생성된다.
    • chart.yaml , values.yaml, templates/ 를 제외하고 일단 지운다.
    • templates/ 폴더 내의 모든 파일도 지운다.
  • 실제로 install 하지 않고, template 이 어떻게 rendering 되는지 확인하기 위한 명령어
helm install <chart 명> <chart 폴더 주소> --debug --dry-run 

2. values.yaml 파일 작성하고 적용하기

  • container image registry의 image version 이 바뀔 경우 pull 받기 위해 ImagePullPolicy 또한 설정해준다.

ImagePullPolicy

kubelet 이 image 를 pull 받는 것을 시도할 때 영향을 미친다.

3가지 상태가 존재한다.

  • IfNotPresent : 현재 local 에 image 가 존재하지 않을때만 pull
  • Always : kubelet 이 container 를 시작하기 전에 매 번 container image registry 에 가지고 있는 image name 을 [digest](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier) 에 대해 확인한다. 만약 로컬에 가진 이미지와 registry 에 존재하는 이미지가 다를 경우, 확인된 digest 에 대해 새 image 를 pull 받고, container 에 올린다.
  • Never : image 를 fetch 하는 것을 시도하지 않는다. image 가 local 에 존재할 경우 container 를 시작하고, 아닐 경우 시작이 실패한다.

Pod 를 포함하는 object 를 생성할 때 명시하지 않을 경우 , 해당 pod 내의 모든 container 는 IfNotPreset 상태를 가지게 된다.

그리고 이 새 Pod 를 API server 에 올리면, cluster 는 상태에 따라 다른 imagePullPolicy 를 가진다.

  • imagePullPolicy 를 명시하지 않았고, container image 의 tag 가 :latest 일 경우, 자동으로 Always
  • imagePullPolicy 를 명시하지 않았고, container image 의 tag 또한 명시하지 않았을 경우, 자동으로 Always
  • imagePullPolicy 를 명시하지 않았고, container image tag 를 :latest 가 아닌 것으로 명시했을 경우, 자동으로 IfNotPreset

이 3가지 상황을 고려해서 강제로 image 를 pull 하고 싶을 경우 Always 상태로 set 하도록 설정할 수 있다.

💡 Argo CD 가 상태를 확인하고 image registry 에서 image 를 pull 받게 하기 위해, Always 로 set 한다.

  • 문서를 참고해서, replica 의 갯수, image name, image version 을 values.yaml 파일에 작성하고, deployment 에 적용한다. (적용 후 명령어로 확인해보기)
    • values.yaml
      replicaCount: 1
      
      image:
        repository: ghcr.io/cloud-club/gitops-ajaebot
        tag: sha-7fcbb88
        pullPolicy: Always
      
    • deployment manifest
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: ju-ajae-deployment# deployment이름
      labels:
          app: ajae-bot
      spec:
        replicas: {{.Values.replicaCount}}# pod 1개
      selector:
          matchLabels:
            app: ajae-bot
        template:
          metadata:
            labels:
              app: ajae-bot
          spec:# Pod spec
      containers:
            - name: ajae-container
              image: {{ .Values.image.repository}}:{{.Values.image.tag }}# version명시 하지 않을 경우 deault로 `latest`로 인식한다.
      imagePullPolicy: {{.Values.image.pullPolicy}}
              env:# slackbot token환경 변수로 넣어주기
      - name: SLACK_BOT_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: juyoung-slack# k8s secret명
      key: token
                      optional: false#반드시 있어야 실행
      imagePullSecrets:# image pull받기 위한 github token file (secret)
      - name: juyoung-github# github credentials로 생성한 secret
      

3. cluster 에 올려보기

  1. chart 가 문제 없는지 확인:
helm lint <chart dir 경로>
  • helm template <chart 경로> 명령어를 통해 생성된 모든 yaml 파일을 확인할 수 있다.
  1. chart 를 실행해 생성하기
helm install <chart명> <chart dir 경로>
  • deployment,pod,replicaset,secret,sealedsecret 모두 생성된다.
  1. chart 실행 취소
helm uninstall <chart명>
  • helm chart 로 생성했던 모든 object 가 삭제된다.

🚫 생성한 sealed-secret 파일을 template/ 폴더에 그대로 넣었더니 sealed-secret-controllerimagePullBackOff 된다. 이유가 뭘까?!!!!

  • sealed-secret-controller log 확인

  • image registry login 오류 → ImagePullBackOff

  • slack toekn 오류(환경 변수 오류) → CreateContainerConfigError


참고

Pods and PodTemplates

Images

0개의 댓글