JUST WRITE

Helm도 git처럼 diff가 가능하다고?! - Helm Plugin 설치 본문

MLOps/Kubernetes

Helm도 git처럼 diff가 가능하다고?! - Helm Plugin 설치

천재보단범재 2023. 7. 19. 18:44

Helm Plugin 설치

Helm도 git처럼 diff가 가능하다고?!

요즘 Kubernetes Cluster를 통해 시스템 구성을 많이 하고 있습니다.

Kubernetes 개념과 사용법이 복잡하지만 명령어를 통해 쉽게 관리할 수 있게 하는 Tool이 있습니다.

바로 Helm입니다.

Helm을 통해 Kubernets에 Package를 쉽게 배포/관리할 수 있습니다.

Helm으로 Package를 배포하면 values.yaml에 있는 값들을 수정하고 배포합니다.

upgrade command로 수정한 것을 재배포 가능합니다.

$ helm upgrade ...

다만 여러 번 수정을 하다 보면 설정값들이 관리가 안될 수 있습니다.

저도 이런 문제를 겪어서 반영한 히스토리를 알 수 없을까? 차이를 알 수 없을까? 고민하였습니다.

그러다가 발견한 것이 Diff Plugin입니다.

이번 포스팅에서는 Helm Diff Plugin의 설치와 간단한 사용법을 정리하였습니다.

Diff 플러그인 설치

Helm diff Plugin Github에서 최신 Release를 다운로드합니다.

$ wget https://github.com/databus23/helm-diff/releases/download/v3.8.1/helm-diff-linux-amd64.tgz

다운로드한 plugin은 Helm plugin path에 놓습니다.

Helm 환경변수

Helm plugin path는 어디일까요?

Helm help command에서 힌트를 얻을 수 있습니다.

Helm과 관련된 환경변수들을 알 수 있습니다.

cache, 설정, registry 관련 파일들의 path를 설정할 수 있습니다.

$ helm help

...
| Name                               | Description                                                                       |
|------------------------------------|-----------------------------------------------------------------------------------|
| $HELM_CACHE_HOME                   | set an alternative location for storing cached files.                             |
| $HELM_CONFIG_HOME                  | set an alternative location for storing Helm configuration.                       |
| $HELM_DATA_HOME                    | set an alternative location for storing Helm data.                                |
| $HELM_DEBUG                        | indicate whether or not Helm is running in Debug mode                             |
| $HELM_DRIVER                       | set the backend storage driver. Values are: configmap, secret, memory, sql.       |
| $HELM_DRIVER_SQL_CONNECTION_STRING | set the connection string the SQL storage driver should use.                      |
| $HELM_MAX_HISTORY                  | set the maximum number of helm release history.                                   |
| $HELM_NAMESPACE                    | set the namespace used for the helm operations.                                   |
| $HELM_NO_PLUGINS                   | disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins.                        |
| $HELM_PLUGINS                      | set the path to the plugins directory                                             |
| $HELM_REGISTRY_CONFIG              | set the path to the registry config file.                                         |
| $HELM_REPOSITORY_CACHE             | set the path to the repository cache directory                                    |
| $HELM_REPOSITORY_CONFIG            | set the path to the repositories file.                                            |
| $KUBECONFIG                        | set an alternative Kubernetes configuration file (default "~/.kube/config")       |
| $HELM_KUBEAPISERVER                | set the Kubernetes API Server Endpoint for authentication                         |
| $HELM_KUBECAFILE                   | set the Kubernetes certificate authority file.                                    |
| $HELM_KUBEASGROUPS                 | set the Groups to use for impersonation using a comma-separated list.             |
| $HELM_KUBEASUSER                   | set the Username to impersonate for the operation.                                |
| $HELM_KUBECONTEXT                  | set the name of the kubeconfig context.                                           |
| $HELM_KUBETOKEN                    | set the Bearer KubeToken used for authentication.                                 |

Helm stores cache, configuration, and data based on the following configuration order:

- If a HELM_*_HOME environment variable is set, it will be used
- Otherwise, on systems supporting the XDG base directory specification, the XDG variables will be used
- When no other location is set a default location will be used based on the operating system

By default, the default directories depend on the Operating System. The defaults are listed below:

| Operating System | Cache Path                | Configuration Path             | Data Path               |
|------------------|---------------------------|--------------------------------|-------------------------|
| Linux            | $HOME/.cache/helm         | $HOME/.config/helm             | $HOME/.local/share/helm |
| macOS            | $HOME/Library/Caches/helm | $HOME/Library/Preferences/helm | $HOME/Library/helm      |
| Windows          | %TEMP%\helm               | %APPDATA%\helm                 | %APPDATA%\helm          |
...
...

그중에서 plugin path인 HELM_PLUGINS를 설정합니다.

$ mkdir ~/helm/plugins

$ vi ~/.profile
...
export HELM_PLUGINS=$HOME/helm/plugins

$ source ~/.profile

$ echo $HELM_PLUGINS
/home/ubuntu/helm/plugins

Diff Plugin Install

plugin path를 설정했으면, 해당 path에 plugin 파일을 옮깁니다.

plugin list로 plugin을 확인합니다.

$ mv helm-diff-linux-amd64.tgz ~/helm/plugins
$ cd ~/helm/plugins
$ tar xzf helm-diff-linux-amd64.tgz

$ helm plugin list
NAME    VERSION DESCRIPTION
diff    3.8.1   Preview helm upgrade changes as a diff

Diff check

Helm Diff Plugin 설치가 끝났습니다.

이제 Helm으로 Chart Release Diff를 확인해 보겠습니다.

helm release도 git처럼 revision 단위로 관리됩니다.

helm history command로 확인 가능합니다.

$ helm history jupyterhub -n jupyterhub
REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
6               Thu Feb  2 15:54:10 2023        superseded      jupyterhub-1.2.0        1.5.0           Upgrade complete
7               Thu Feb  2 16:48:21 2023        superseded      jupyterhub-1.2.0        1.5.0           Upgrade complete
8               Thu Mar 30 16:54:10 2023        failed          jupyterhub-1.2.0        1.5.0           Upgrade "jupyterhub" failed: pre-upgrade hooks failed: timed out waiting for the condition
9               Thu Mar 30 17:07:10 2023        failed          jupyterhub-1.2.0        1.5.0           Upgrade "jupyterhub" failed: pre-upgrade hooks failed: timed out waiting for the condition
10              Thu Mar 30 17:21:14 2023        superseded      jupyterhub-1.2.0        1.5.0           Upgrade complete
11              Wed May 10 13:57:39 2023        failed          jupyterhub-1.2.0        1.5.0           Upgrade "jupyterhub" failed: context canceled
12              Wed May 10 14:00:12 2023        superseded      jupyterhub-1.2.0        1.5.0           Upgrade complete
13              Wed May 10 14:15:47 2023        superseded      jupyterhub-1.2.0        1.5.0           Upgrade complete
14              Wed May 10 14:17:55 2023        superseded      jupyterhub-1.2.0        1.5.0           Upgrade complete
15              Wed May 10 14:43:22 2023        deployed        jupyterhub-1.2.0        1.5.0           Upgrade complete

diff을 revision 기준으로 확인할 수 있습니다.

해당 Package의 모든 리소스에 대해서 Diff를 보여줍니다.

아래 보면 jupyterhub singleuser.memory의 limit, requests가 다른 것을 알 수 있습니다.

$ helm diff revision jupyterhub -n jupyterhub 10 15

....
jupyterhub, user-placeholder, StatefulSet (apps) has changed:
  # Source: jupyterhub/templates/scheduling/user-placeholder/statefulset.yaml
  apiVersion: apps/v1
  kind: StatefulSet
  metadata:
    name: user-placeholder
    labels:
      component: user-placeholder
      app: jupyterhub
      release: jupyterhub
      chart: jupyterhub-1.2.0
      heritage: Helm
  spec:
    podManagementPolicy: Parallel
    replicas: 0
    selector:
      matchLabels:
        component: user-placeholder
        app: jupyterhub
        release: jupyterhub
    serviceName: user-placeholder
    template:
      metadata:
        labels:
          component: user-placeholder
          app: jupyterhub
          release: jupyterhub
      spec:
        schedulerName: jupyterhub-user-scheduler
        nodeSelector: {}
        tolerations:
          - effect: NoSchedule
            key: hub.jupyter.org/dedicated
            operator: Equal
            value: user
          - effect: NoSchedule
            key: hub.jupyter.org_dedicated
            operator: Equal
            value: user
        affinity:
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                preference:
                  matchExpressions:
                    - key: hub.jupyter.org/node-purpose
                      operator: In
                      values: [user]
        terminationGracePeriodSeconds: 0
        automountServiceAccountToken: false
        containers:
          - name: pause
            image: desk-docker.bart.sec.samsung.net/tmp/k8s.gcr.io/pause:3.5
            resources:
              requests:
-               memory: 8G
+               cpu: 0.5
+               memory: 16G
              limits:
-               memory: 8G
+               cpu: 0.5
+               memory: 16G
            securityContext:
              allowPrivilegeEscalation: false
              runAsGroup: 65534
              runAsUser: 65534

오프라인으로 Helm Diff Plugin을 설치하였습니다.

온라인이면 아래 command로 바로 설치가 가능합니다.

$ helm plugin install https://github.com/databus23/helm-diff

Plugin을 사용해 봤지만 가독성이 좋지 않습니다.

Helm Plugin도 있지만 ArgoCD로 Helm Package를 배포하면 Diff도 쉽게 알 수 있습니다.

다음에는 ArgoCD로 Helm Chart를 배포해 보겠습니다.

[참고사이트]

728x90
반응형
Comments