본문 바로가기

Helm (헬름)/Helm chart

helm chart 렌더링, 업그레이드, 삭제 및 상태 확인

728x90
반응형

# helm chart 렌더링, 업그레이드 및 삭제와 관련하여 알아보자.

1. helm chart 렌더링

- 렌더링 명령어는 아래와 같다.

- 실제 설치를 수행하는 것이 아니라 values.yaml 파일과 templates 폴더의 파일들의 적용된 YAML 정의서 결과를 확인하고 싶다면 templates 명령을 사용하여 적용될 내용들을 미리 확인 할 수 있다. (kubectl 명령툴의 --dry-run 옵션과 유사하다고 볼 수 있다.)

$ helm template <CAHRT_PATH>

- 아래의 명령어를 통해 미리 실행될 정보를 확인 할 수 있다.

helm template seung ./mychart > seung-output.yaml

- 위의 명령어를 실행하면 아래와 같이 seung-output.yaml 파일이 생성된다. 내용을 보면 아래와 같다.

- 아래의 리소스를 보면 알겠지만, k8s의 서비스를 생성하는 기본 리소스들을 values.yaml에서 가져와 실행을 한다고 볼 수 있다. 

---
# Source: mychart/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: seung-mychart
  labels:
    helm.sh/chart: mychart-0.1.0
    app.kubernetes.io/name: mychart
    app.kubernetes.io/instance: seung
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: seung-mychart
  labels:
    helm.sh/chart: mychart-0.1.0
    app.kubernetes.io/name: mychart
    app.kubernetes.io/instance: seung
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  type: LoadBalancer
  ports:
    - port: 8080
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: mychart
    app.kubernetes.io/instance: seung
---
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: seung-mychart
  labels:
    helm.sh/chart: mychart-0.1.0
    app.kubernetes.io/name: mychart
    app.kubernetes.io/instance: seung
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: mychart
      app.kubernetes.io/instance: seung
  template:
    metadata:
      labels:
        app.kubernetes.io/name: mychart
        app.kubernetes.io/instance: seung
    spec:
      serviceAccountName: seung-mychart
      securityContext:
        {}
      containers:
        - name: mychart
          securityContext:
            {}
          image: "nginx:1.16.0"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {}
---
# Source: mychart/templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
  name: "seung-mychart-test-connection"
  labels:
    helm.sh/chart: mychart-0.1.0
    app.kubernetes.io/name: mychart
    app.kubernetes.io/instance: seung
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
  annotations:
    "helm.sh/hook": test
spec:
  containers:
    - name: wget
      image: busybox
      command: ['wget']
      args: ['seung-mychart:8080']
  restartPolicy: Never

- 이를 통해 YAML 파일이 어떤 형태로 만들어져 설치가 진행 되는지 디버깅하는 용도로도 사욜 할 수 있다.

2. chart 업그레이드

- chart 업그레이드 명령어는 아래와 같다. 이미 설치한 chart에 대해 values.yaml 값을 수정하고 업데이트 할 수 있다. Service 타입을 기존의 LoadBalancer에서 NodePort로 변경 후 업그레이드를 통해 배포해보자.

$ helm upgrade <CHART_NAME> <CHART_PATH>

- 아래의 정보를 수정하여 values.yaml 파일의 내용을 수정 후 배포해보자.

...
service:
  type: NodePort # 기존에는 LoadBalancer로 되어 있었음.
  port: 8080
...

- 수정한 chart를 upgrade 명령어를 통해 재 배포 해보자.

$ helm upgrade seung ./mychart

- upgrade 명령어를 수행하면 아래와 같이 변경된 정보로 반영이 된다.

$ helm upgrade seung ./mychart
Release "seung" has been upgraded. Happy Helming!
NAME: seung
LAST DEPLOYED: Tue Feb 21 01:55:14 2023
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 seung-mychart)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

- 그리고 svc 정보를 확인하면 service 타입이 LoadBalacner에서 NodPort로 변경된 것을 확인 할 수 있다.

/helm-test-seung $ kubectl get svc
NAME            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   172.20.0.1    <none>        443/TCP          74d
seung-mychart   NodePort    172.20.6.61   <none>        8080:30769/TCP   55m

- 그리고 helm list를 통해 리스트를 조회하면 REVISION 숫자가 2로 올라간 것을 확인 할 수 있는데 이것은 업그레이드 된 버전이라고 생각하면 쉽다. 그리고 chart를 업데이트 할때마다 해당 REVISION 숫자가 올라간다.

/helm-test-seung $ helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
efs-provisioner default         1               2023-01-09 00:58:00.174011084 +0000 UTC deployed        efs-provisioner-0.13.2  v2.4.0     
seung           default         2               2023-02-21 01:55:14.034241111 +0000 UTC deployed        mychart-0.1.0           1.16.0

3. chart 배포상태 확인

$ helm status <CHART_NAME>

- helm list를 통해서 조회한 chart 이름이 seung 이므로 helm status seung 라는 명령어를 통해 chart status의 정보를 확인 할 수 있다.

$ helm status seung
NAME: seung
LAST DEPLOYED: Tue Feb 21 01:55:14 2023
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 seung-mychart)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

4. chart 삭제

- chart 삭제는 간단하다 아래의 명령어를 통해 chart를 삭제 할 수 있다.

helm delete <CHART_NAME>

- 위의 명령어를 통해 삭제를 해보자.

$ helm delete seung
release "seung" uninstalled

- helm list를 통해 조회를 해보면 삭제가 된것을 확인 할수 있다.

$ helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
efs-provisioner default         1               2023-01-09 00:58:00.174011084 +0000 UTC deployed        efs-provisioner-0.13.2  v2.4.0
728x90
반응형