Study Note

쿠버네티스 helm - [Kubernetes, k8s] 본문

Kubernetes

쿠버네티스 helm - [Kubernetes, k8s]

moreLearn 2021. 8. 8. 12:30

helm

helm은 apt, yum, pip와 비슷하게 플랫폼의 패키지를 관리하는 쿠버네티스 패키지 매니저입니다.  helm 패키지는 YAML 형식으로 구성되어 있는 chart를 사용합니다.

helm chart 구조

쿠버네티스틑 helm을 이용하여 프로세스(Pod), 네트워크(Service), 저장소(PersistentVolume) 등 어플리케이션에 필요한 모든 자원들을 외부에서 가져올 수 있습니다.

  • values.yaml : 사용자가 원하는 값을 설정하는 파일입니다.
  • templates/ 디렉토리 : 설치할 리소스 파일들이 존재하는 디렉토리입니다. 디렉토리 안에는 Deployment, Service 같은 쿠버네티스 리소스가 YAML 파일 형태로 저장되어 있으며 각 파일의 설정값은 비워져 있고(placeholder) values.yaml 설정값들로 채워집니다. 

helm 설치

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash -s -- --version v3.2.2

chart 생성

다음 명령어를 통해서 chart를 생성할 수 있습니다.

helm create <CHART_NAME>
helm create mychart
#Creating mychart

ls mychart
#Chart.yaml  charts  templates  values.yaml
  • Chart.yaml : chart 이름, 버전 정보와 같은 chart의 전반적인 정보를 담고 있습니다.
  • charts : chart 속에 또 다른 여러 chart들을 넣을 수 있습니다. [기본적으로 비어있습니다.]
  • templates/ : chart의 뼈대가 되는 쿠버테니스 리소스가 들어있는 디렉토리입니다.
  • values.yaml : 사용자가 지정한 설정값을 가진 YAML 파일 입니다.
더보기

 서비스 포트를 수정해서 실행해 보겠습니다.

ls mychart/templates
#NOTES.txt  _helpers.tpl  deployment.yaml  hpa.yaml  ingress.yaml  service.yaml  serviceaccount.yaml  tests
#cat ./mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    {{- include "mychart.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    {{- include "mychart.selectorLabels" . | nindent 4 }}

values.yaml 파일의 service.type과 service.port를 다음과 같이 변경합니다.

#cat ./mychart/values.yaml
replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart version.
  tag: ""

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

...
service:
  type: LoadBalancer # 기존 ClusterIP
  port: 8080 # 기존 80
...

chart 설치

chart는 다음과 같은 명령어 형태를 통해 설치가 가능합니다.

helm은 다른 패키지 매니저와 다르게 모든 라이브러리 종속성이 컨테이너 안에서 해결되기 때문에 helm에서 실제 사용할 프로세스만 생성됩니다.

helm install <CHART_NAME> <CHART_PATH>
더보기
helm install foo ./mychart
#NAME: foo
#LAST DEPLOYED: Sun Aug  8 02:11:03 2021
#NAMESPACE: default
#STATUS: deployed
#REVISION: 1
#NOTES:
#1. Get the application URL by running these commands:
#     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
#           You can watch the status of by running 'kubectl get --namespace default svc -w foo-mychart'
#  export SERVICE_IP=$(kubectl get svc --namespace default foo-mychart --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
#  echo http://$SERVICE_IP:8080
kubectl get svc
#NAME          TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
#kubernetes    ClusterIP      10.43.0.1      <none>        443/TCP          16d
#foo-mychart   LoadBalancer   10.43.216.54   172.31.1.47   8080:32443/TCP   46s

chart 리시트 조회

다음 명령어로 통해 helm chart 리스트를 조회할 수 있습니다. 이때 -n(namespace) 옵션을 이용하여 조회할 수도 있습니다.

helm list
helm list -n <NAMESPACE>

chart 랜더링

실제 설치가 되는것이 아닌 values.yaml 파일과 templates 디렉토리 안의 파일들이 합쳐진 YAML 결과를 확인할 때 사용하는 방법입니다. helm은 이 방법을 rendering한다고 표현하며 kubectl의 --dry-run 옵션과 유사합니다.

helm template <CHART_PATH>
더보기

template 결과물을 보면 이전의 리소스 YAML과 크게 다르지 않습니다.

helm template foo ./mychart > foo-output.yaml
cat foo-output.yaml

#apiVersion: v1
#kind: ServiceAccount
#metadata:
#  name: foo-mychart
#  labels:
#    helm.sh/chart: mychart-0.1.0
#    app.kubernetes.io/name: mychart
#    app.kubernetes.io/instance: foo
#    app.kubernetes.io/version: "1.16.0"
#    app.kubernetes.io/managed-by: Helm
...
#spec:
#  containers:
#    - name: wget
#      image: busybox
#      command: ['wget']
#      args: ['foo-mychart:8080']
...

chart 업그레이드

이미 설치한 chart에 대해 values.yaml 값을 수정하여 업데이트할 수 있습니다.

helm upgrade <CHART_NAME> <CHART_PATH>
더보기

service 타입을 변경해서 업데이트를 하는 방법입니다.

sudo vim ./mychart/values.yaml

...
#service:
#  type: NodePort # 기존 LoadBalancer
#  port: 8080
...
helm upgrade foo ./mychart
#Release "foo" has been upgraded. Happy Helming!
#NAME: foo
#LAST DEPLOYED: Sun Aug  8 02:27:35 2021
#NAMESPACE: default
#STATUS: deployed
#REVISION: 2
#NOTES:
#1. Get the application URL by running these commands:
#  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services foo-mychart)
#  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
#  echo http://$NODE_IP:$NODE_PORT
kubectl get svc
#NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
#kubernetes    ClusterIP   10.43.0.1      <none>        443/TCP          16d
#foo-mychart   NodePort    10.43.216.54   <none>        8080:32443/TCP   17m

chart를 업그레이드 하면 다음과 같이 REVISION이 놀라갑니다.

helm list
#NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
#foo     default         2               2021-08-08 02:27:35.574862779 +0000 UTC deployed        mychart-0.1.0   1.16.0

chart 배포상태 확인

chart 배포상태는 다음 명령어를 사용해서 확인할 수 있습니다.

helm status <CHART_NAME>
더보기
helm status foo
#NAME: foo
#LAST DEPLOYED: Sun Aug  8 02:27:35 2021
#NAMESPACE: default
#STATUS: deployed
#REVISION: 2
#NOTES:
#1. Get the application URL by running these commands:
#  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services foo-mychart)
#  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
#  echo http://$NODE_IP:$NODE_PORT

chart 삭제

다음 명령어를 사용해서 helm chart를 삭제할 수 있습니다.

helm delete <CHART_NAME>
더보기
helm delete foo
#release "foo" uninstalled

helm list
#NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION

원격 Repository

helm은 chart 원격 저장소인 Repository가 존재합니다. Repository는 chart를 한 곳에 묶어서 보관해놓은 저장소 입니다.

Helm 공식 저장소
Helm Repository 문서
 

Artifact Hub

Find, install and publish Kubernetes packages

artifacthub.io

 

차트 저장소 가이드

헬름 차트 저장소를 만들고 작업하는 방법

helm.sh

Repository추가

다음 명령어를 통해 Repository를 추가할 수 있습니다.

helm repo add <NAME> <URL>
더보기
helm repo add stable https://charts.helm.sh/stable
#"stable" has been added to your repositories

Repository업데이트

추가한 Repository의 인덱스 정보를 최신으로 업데이트합니다.

helm repo update
더보기
helm repo update
#Hang tight while we grab the latest from your chart repositories...
#...Successfully got an update from the "stable" chart repository
#Update Complete. ⎈ Happy Helming!⎈

Repository 조회

helm repo list
더보기
helm repo list
#NAME    URL
#stable  https://charts.helm.sh/stable

Repository내 Chart 조회

helm search repo <REPOSITORY_NAME> <FLAGS>
더보기
helm search repo stable
#NAME                                    CHART VERSION   APP VERSION             DESCRIPTION
#stable/acs-engine-autoscaler            2.2.2           2.1.1                   DEPRECATED Scales worker nodes within agent pools
#stable/aerospike                        0.3.5           v4.5.0.5                DEPRECATED A Helm chart for Aerospike in Kubern...
#stable/airflow                          7.13.3          1.10.12                 DEPRECATED - please use: https://github.com/air...
#stable/ambassador                       5.3.2           0.86.1                  DEPRECATED A Helm chart for Datawire Ambassador
#stable/anchore-engine                   1.7.0           0.7.3                   Anchore container analysis and policy evaluatio...
#stable/apm-server                       2.1.7           7.0.0                   DEPRECATED The server receives data from the El...
#stable/ark                              4.2.2           0.10.2                  DEPRECATED A Helm chart for ark

외부 Chart 설치 (WordPress)

chart install

원격 Repository인 stable Repository의 WordPress chart를 설치해보겠습니다.

helm install wp stable/wordpress \
--version 9.0.3 \
--set service.port=8080
--namespace default
  • --version : chart의 버전을 지정합니다. Chart.yaml의 version 정보를 참조합니다.
  • --set : values.yaml 값을 동적으로 설정할 수 있습니다.
  • --namespace : chart가 설치될 네이스페이스를 지정합니다.

chart fetch

Repository의 chart를 원격에서 바로 설치가 가능하지만 로컬 디렉토리로 다운로드해서 사용할 수 있습니다.

helm fetch --untar stable/wordpress --version 9.0.3
  • --untar 옵션 : 폴더에 압축이 풀어진 상태로 저장합니다.