2024年10月02日
連載 第11回 Helmを利用した
パブリックアプリケーションの
インストール
JENNIFERクバネティスのログモニタリング
今回はクバネティス環境でアプリケーションを簡単にインストールできるHelmを確認します。
Helmはクバネティス環境のアプリケーションパッケージ管理ツールで、アプリケーションを簡単にインストール、配布、アップグレード、ロールバックできるオープンソースです。 Helmは Chart (チャート)というパッケージでアプリケーションを構成して、テンプレート化されたリソースと一緒に配布可能な単位でアプリケーションを定義します。また、Linux環境の yum や apt などのパッケージ管理ツールと同様にアプリケーションの実行に必要な様々な要素をパッケージ形態で管理します。一括でインストールできるため、ソフトウェアパッケージのインストールと管理を簡単にしてくれる強力なツールです。筆者はクバネティス環境の全てのアプリケーションをHelmで管理しています。
前にインストールしたArgoCD、AWS LB Controller、External DNS ControllerとこれからインストールするKafkaなどの全てのアプリケーションは Helmでインストールして管理できます。
主な内容:
• Helmの3つの構成要素(Helmチャート、テンプレート、バリューファイル)の確認
• Helmを利用したアプリケーションのインストール段階での整理
実習課題:
• Helmを利用したRedisアプリケーションのインストール
• ArgoCDを利用したHelmアプリケーションのインストール
今回の実習で使用するソースファイルのGitHubディレクトリは次の通りです。
• https://github.com/junghoon2/k8s-class/tree/main/redis
1. Helmの3つの構成要素(チャート、テンプレートディレクトリ、 バリューファイル)
Helmはチャート、テンプレートディレクトリ、 バリューファイルの3つの要素で構成されていますが、これらを次に確認します。
先ず、チャートは Helmのデフォルトパッケージで、クバネティスアプリケーションをインストールやアップグレード、削除するための全てのリソースが含まれています。一般的にチャートとは、図表やグラフを意味しますが、Helmでは詳細な記録情報の束を意味します。
クバネティスでアプリケーションをインストールするときにRedis Helmチャート、Kafka Helmチャートを利用すると言われていますが、アプリケーションのインストールに必要な全ての要素が含まれたリソースを Helmチャートといいます。チャートは一連のディレクトリで構成されていて、 Chart.yamlファイルを含みます。Chart.yamlはチャートのメタデータ情報を含んでいます。一般的にチャートディレクトリは テンプレートディレクトリとvalues.yamlファイルを含んでいます。
下記は今回の実習で使用するRedis Helmチャートディレクトリの構成です。 Chart.yamlファイル、values.yamlファイル、templatesディレクトリを確認できます。チャートには Redisというアプリケーションのインストールに必要な全ての構成要素を含みます。
1. $ (⎈ |switch-singapore-test:default) tree -L 2 redis-17.8.5
2. redis-17.8.5
3. ├── Chart.lock
4. ├── Chart.yaml
5. ├── README.md
6. ├── charts
7. │ └── common
8. ├── ci
9. │ └── my-values.yaml
10. ├── img
11. │ ├── redis-cluster-topology.png
12. │ └── redis-topology.png
13. ├── templates
14. │ ├── NOTES.txt
15. │ ├── _helpers.tpl
16. (省略)
17. ├── values.schema.json
18. └── values.yaml
19.
20. 9 directories, 25 files
Chart.yamlファイル情報です。
Chart.yaml
1. annotations:
2. category: Database
3. licenses: Apache-2.0
4. apiVersion: v2
5. appVersion: 7.0.9
6. dependencies:
7. - name: common
8. repository: https://charts.bitnami.com/bitnami
9. tags:
10. - bitnami-common
11. version: 2.x.x
12. description: Redis(R) is an open source, advanced key-value store. It is often referred
13. to as a data structure server since keys can contain strings, hashes, lists, sets
14. and sorted sets.
15. home: https://github.com/bitnami/charts/tree/main/bitnami/redis
16. icon: https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png
17. keywords:
18. - redis
19. - keyvalue
20. - database
21. maintainers:
22. - name: Bitnami
23. url: https://github.com/bitnami/charts
24. name: redis
25. sources:
26. - https://githu
Redis Helmチャートのメタ情報とデータに関する情報を含んでいます。主にHelmチャートの アプリケーションのバージョン情報、Helmチャート自体のバージョン情報を照会する目的で使用します。
上記の例はRedisのバージョンは7.0.9、Helmチャートバージョンは 17.8.5を表しています。また、 Bitnami社がこのHelmチャートをメンテナンス(maintenance)中ということです。
次に、テンプレートディレクトリには Helmチャートに含まれたクバネティスリソースが列挙されています。テンプレートファイルは 拡張子が .yamlで、テンプレートエンジンは Goテンプレートを使用します。 Helmチャートを利用して配布すると、バリューファイルの設定がテンプレートディレクトリのリソースに反映されて配布されます。どのリソースが配布されるか、リソースのテンプレート変数はどのように設定されているかを確認する目的でテンプレートディレクトリ内のファイルを使用します。
前述のRedis Helmチャートのテンプレートディレクトリの詳細情報は下記の通りです。
1. $ (⎈ |switch-singapore-test:default) tree -L 1 templates
2. templates
3. ├── NOTES.txt
4. ├── _helpers.tpl
5. ├── configmap.yaml
6. ├── extra-list.yaml
7. ├── headless-svc.yaml
8. ├── health-configmap.yaml
9. ├── master
10. ├── metrics-svc.yaml
11. ├── networkpolicy.yaml
12. ├── pdb.yaml
13. ├── prometheusrule.yaml
14. ├── replicas
15. ├── role.yaml
16. ├── rolebinding.yaml
17. ├── scripts-configmap.yaml
18. ├── secret.yaml
19. ├── sentinel
20. ├── serviceaccount.yaml
21. ├── servicemonitor.yaml
22. └── tls-secret.yaml
Helmチャートで配布されるクバネティスのリソースがテンプレートディレクトリに保存されました。
ConfigMap、Service(SVC)、Secretなどを確認できます。実際、テンプレートディレクトリのファイルを確認すると、Helmバリューファイルの変数で動的に値が入る部分を表示するテンプレート構文があります。リソースの名前、レプリカ数、ポート番号などのようなパラメータをHelm バリューファイルを利用してカスタマイズできます。
1. $ (⎈ |switch-singapore-test:default) cat templates/configmap.yaml
2. (省略)
3. sentinel.conf: |-
4. dir "/tmp"
5. port {{ .Values.sentinel.containerPorts.sentinel }}
6. (省略)
.Values.sentinel.containerPorts.sentinel
バリューファイルに入力したport情報が変数に入力されます。テンプレートファイルで実装され、状況により様々な変数を入力できます。 Goテンプレートを使用して if、range関数などもサポートします。
最後に Helm バリューファイルは Helmチャートで使用するパラメータを定義します。 Helmチャートはデフォルト設定でvalues.yamlを提供します。筆者は原本の values.yamlをコピーして環境に合わせて特定のパラメータを変更して、新しいファイル(例: ci/my-values.yaml)に名前を変更して保存します。
バリューファイルはデフォルト値を使用するか、または管理者が必要な値で上書きする目的で使用されます。ユーザはバリューファイルを変更してアプリケーションを各自の環境に合わせて構成できます。筆者はデフォルトのバリューファイルで変更できない部分は削除して、変更部分のみを残す方法でバリューファイルを管理します。
デフォルト設定で変更された部分のみを保存すると、変更事項を素速く確認できて見易いためメンテナンス作業では大きなメリットです。下記は実際に使用するRedis Helmチャートのバリューファイルです。
ci/my-values.yaml
1. architecture: replication
2. auth:
3. enabled: false
4. master:
5. count: 1
6. replica:
7. replicaCount: 2
8. sentinel:
9. enabled: false
10. metrics:
11. enabled: true
12. sysctl:
13. enabled: true
デフォルトのバリューファイルで筆者が求める Redis 1ea Master、2ea Replicasアーキテクチャーで構成できるようにデフォルトのバリューファイルを変更しました。
初めて、Helmチャートを確認すると様々なファイルがあって抵抗がありますが、上記の3つの主な構成要素を中心に把握するとそれ程難しくないです。ほぼ全ての Helmチャートが同じ構成であるため、直ぐに慣れると思います。
2. Helmアプリケーションのインストールプロセス
今回は Helmを利用してアプリケーションをインストールします。 Helmはローカル PCに Helmチャートをダウンロードせず、インターネットに公開されたチャートをそのまま利用してインストールできます。例えば、 Redisチャートは下記のようなコマンドでインストールできます。
1. helm install my-release oci://registry-1.docker.io/bitnamicharts/redis
しかし、筆者は Helmのチャートのバージョンとバリューファイルを管理するためにローカルにHelmチャートをダウンロードします。ローカルに Helmチャートをダウンロードして必要な部分だけを変更します。変更した部分は内部 Gitの保存場所に保存して GitOps基盤で管理します。
では、Redisチャートを基にHelmをインストールする手順を確認します。Helmチャートを保存するディレクトリを作成して、そのディレクトリに移動します。
1. $ (⎈ |switch-singapore-test:default) mkdir redis && cd redis
helm pullコマンドを使用して必要な Helmチャートをローカルにダウンロードします。コマンドに–versionオプションを含めると、必要なバージョンのチャートを指定してダウンロードができます。versionオプションを指定しないと、最新バージョンのチャートをダウンロードします。筆者は複数のクラスタを運用しますが、クラスタ毎に同じバージョンのチャートを使用するため、特定のバージョンを指定してダウンロードします。読者の皆さんも実習のバージョンを使用する場合は、同じバージョンをダウンロードしてください。最新バージョンを使用してもインストールに特段問題はありません。
1. $ (⎈ |switch-singapore-test:default) helm pull oci://registry-1.docker.io/bitnamicharts/redis --version 17.8.5
2. Pulled: registry-1.docker.io/bitnamicharts/redis:17.8.5
3. Digest: sha256:ba8f53e173fda949e0539604cea71ecf71d6dadf99916ffe5ff741376ce64dcf
圧縮ファイル(tgz)が確認できます。
1. $ (⎈ |switch-singapore-test:default) ls -lrt
2. total 184
3. -rw-r--r-- 1 jerry staff 90679 Jul 24 05:56 redis-17.8.5.tgz
圧縮ファイルを解凍して、圧縮ファイルは削除します。解凍されたディレクトリはバージョン管理のため、バージョン情報をディレクトリ名に追加します。後でディレクトリ名だけでバージョン情報を確認できるので便利です。
1. $ (⎈ |switch-singapore-test:default) tar xvfz redis-17.8.5.tgz
2. $ (⎈ |switch-singapore-test:default) rm -rf redis-17.8.5.tgz
3. $ (⎈ |switch-singapore-test:default) mv redis redis-17.8.5
Helmチャートが含まれた Redisディレクトリへ移動して、values.yamlを新しく作成したCIディレクトリにコピーします。
1. $ (⎈ |switch-singapore-test:default) cd redis-17.8.5
2. $ (⎈ |switch-singapore-test:default) mkdir ci
3. $ (⎈ |switch-singapore-test:default) cp values.yaml ci/
4. $ (⎈ |switch-singapore-test:default) ls ci
5. values.yaml
デフォルト values.yamlファイルと区別するため、クラスタ毎に区別できる名前でバリューファイルの名前を変更します。筆者は singapore-test-valuesファイルに変更しました。
1. $ (⎈ |switch-singapore-test:default) cd ci
2. $ (⎈ |switch-singapore-test:default) mv values.yaml singapore-test-values.yaml
以降は上記の手順を繰り返して Helmチャートを管理します。アプリケーションをインストールする時に、同じプロセスを続けて行います。さて、準備が完了してHelm バリューファイルのみを変更すると、クバネティス環境にアプリケーションをインストールできます。
3. Helmチャートを利用した Redisのインストール
今回準備したRedis Helmチャートでアプリケーションをインストールします。
VSCodeなどを利用して Helm バリューファイルの内容を確認すると多くの変数を確認できます。各自で必要な Redisインストールの要求事項に従い変数を変更します。インストールの要求事項に合わせて、バリューファイルを変更することは重要で、それなりの経験と知識が要求されます。しかし、一般的に多くのユーザに共通する要求事項のため、検索すると簡単に必要な構成を探すことができます。
Redisと関連するSentinel、Master、Replication、Configurationなどの多くの設定事項をバリューファイルで変更すると構成できます。既存の使用中のredis.confファイルを参照して変更するか、Best Practice基盤で設定を変更します。
筆者は上記で共有した1ea Masterと2ea Replicaの設定を変更しました。
my-values.yaml
1. architecture: replication
2. auth:
3. enabled: false
4. master:
5. count: 1
6. replica:
7. replicaCount: 2
8. sentinel:
9. enabled: false
10. metrics:
11. enabled: true
12. sysctl:
13. enabled: true
以下のバリューファイルでRedis Helmチャートをインストールします。インストールに使用するコマンドは helm installです。コマンドは Redis Helmチャートをダウンロードしたディレクトリで実行します。
1. $ (⎈ |switch-singapore-test:default) pwd
2. /Users/jerry/private/redis/redis-17.8.5
1. $ (⎈ |switch-singapore-test:redis) helm install redis -f ci/my-values.yaml --create-namespace -n redis .
2. NAME: redis
3. LAST DEPLOYED: Mon Jul 24 09:06:09 2023
4. NAMESPACE: redis
5. STATUS: deployed
6. REVISION: 1
7. TEST SUITE: None
8. NOTES:
9. CHART NAME: redis
10. CHART VERSION: 17.8.5
11. APP VERSION: 7.0.9
12. (省略)
. helm install redis
Helmチャートの名前を指定します。任意に指定できますが管理上、redisを使用することを推奨します。
. –create-namespace -n redis
ネームスペース名を指定します。もし、redisというネームスペースがない場合は、ネームスペースを新規に生成します。
正常にインストールされるとRedis Podと PVCが確認できます。
1. $ (⎈ |switch-singapore-test:redis) k ns redis
2. Context "jerry-test" modified.
3. Active namespace is "redis".
4.
5. $ (⎈ |switch-singapore-test:redis) k get pod,pvc
6. NAME READY STATUS RESTARTS AGE
7. pod/redis-master-0 2/2 Running 0 2m26s
8. pod/redis-replicas-0 2/2 Running 0 2m26s
9. pod/redis-replicas-1 2/2 Running 0 104s
10.
11. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
12. persistentvolumeclaim/redis-data-redis-master-0 Bound pvc-452dc0e3-5a72-4662-80d2-f4b6faf2b4fa 8Gi RWO ebs-sc 2m26s
13. persistentvolumeclaim/redis-data-redis-replicas-0 Bound pvc-d11ecd0e-32e1-494f-9b6f-70363fead5ef 8Gi RWO ebs-sc 2m26s
14. persistentvolumeclaim/redis-data-redis-replicas-1 Bound pvc-6395d2ee-caf3-4582-ba68-1bb04552ecce 8Gi RWO ebs-sc 104s
k get-all ユーティリティで、 Helmチャートでインストールされた全体リソースをリストで確認します。
1. $ (⎈ |switch-singapore-test:redis) k get-all -n redis
2. NAME NAMESPACE AGE
3. configmap/kube-root-ca.crt redis 7d21h
4. configmap/redis-configuration redis 3m26s
5. configmap/redis-health redis 3m26s
6. configmap/redis-scripts redis 3m26s
7. endpoints/redis-headless redis 3m26s
8. endpoints/redis-master redis 3m26s
9. endpoints/redis-metrics redis 3m26s
10. endpoints/redis-replicas redis 3m26s
11. persistentvolumeclaim/redis-data-redis-master-0 redis 3m26s
12. persistentvolumeclaim/redis-data-redis-replicas-0 redis 3m26s
13. persistentvolumeclaim/redis-data-redis-replicas-1 redis 2m44s
14. pod/redis-master-0 redis 3m26s
15. pod/redis-replicas-0 redis 3m26s
16. pod/redis-replicas-1 redis 2m44s
17. secret/sh.helm.release.v1.redis.v1 redis 3m26s
18. serviceaccount/default redis 7d21h
19. serviceaccount/redis redis 3m26s
20. service/redis-headless redis 3m26s
21. service/redis-master redis 3m26s
22. service/redis-metrics redis 3m26s
23. service/redis-replicas redis 3m26s
24. controllerrevision.apps/redis-master-f876867b redis 3m26s
25. controllerrevision.apps/redis-replicas-556c66d4df redis 3m26s
26. statefulset.apps/redis-master redis 3m26s
27. statefulset.apps/redis-replicas redis 3m26s
28. endpointslice.discovery.k8s.io/redis-headless-55q6q redis 3m26s
29. endpointslice.discovery.k8s.io/redis-master-cj25v redis 3m26s
30. endpointslice.discovery.k8s.io/redis-metrics-xzvj5 redis 3m26s
31. endpointslice.discovery.k8s.io/redis-replicas-zsp9w redis 3m26s
ServiceAccount、ConfigMap、Secretなどの多くのリソースがインストールされたことを確認できます。上記のリソースを1つずつインストールするとかなりの時間がかかりますが、Helmチャートでインストールすると、1つのコマンドで関連するリソースを全てインストールできます。削除も同様です。
全体リソースリソースを確認する k get-all ユーティリティは k krewでインストールでき、主にネームスペースの基準でインストールされているリソース全体を表示します。デフォルトで提供する k get all コマンドはリソース全体を表示しないため、k get-all ユーティリティの使用をお勧めします。
Helmチャートはこのように helm install コマンドでインストールできますが、実務ではコマンドでインストールするよりは、ArgoCDを利用してインストールします。何故でしょうか?
コマンドでインストールしたアプリケーションは状態(Ops)が Gitに保存されたソースコード(Git)と一致していることを確認できます。また、任意に変更した場合、インストールオプションをどのように使用したかの記録を残すことが難しいです。つまり、 GitOps基盤で運用することは難しいので、ArgoCDを利用して再度配布することをお勧めします。
1. $ (⎈ |switch-singapore-test:redis) helm delete redis
2. release "redis" uninstalled
では、ArgoCD Applicationファイルを生成します。
redis-application.yaml
1. apiVersion: argoproj.io/v1alpha1
2. kind: Application
3. metadata:
4. name: redis
5. namespace: argocd
6. finalizers:
7. - resources-finalizer.argocd.argoproj.io
8. spec:
9. destination:
10. namespace: redis
11. server: {{ .Values.spec.destination.server }}
12. project: default
13. source:
14. path: redis/redis-17.8.5
15. helm:
16. valueFiles:
17. - ci/singapore-test-values.yaml
18. repoURL: {{ .Values.spec.source.repoURL }}
19. targetRevision: {{ .Values.spec.source.targetRevision }}
20. syncPolicy:
21. automated:
22. prune: true
23. selfHeal: true
24. syncOptions:
25. - CreateNamespace=true
26. - RespectIgnoreDifferences=true
. spec.syncPolicy.automated
環境により automatedオプションは使用しなくても大丈夫です。筆者も開発/ステージング環境では利便性のために automatedオプションを使用しますが、運用環境は automatedオプションを使用しません。
以下の redis-application.yamlファイルを適用します。
1. $ (⎈ |switch-singapore-test:argocd) k apply -f redis-application.yaml
ArgoCD UIで確認すると、正常にRedisが配布されました。
このように Helmでインストール検証が終わったアプリケーションは少し面倒ですが削除して、ArgoCDで再度配布することを推奨します。 GitOpsポリシーを守るためには努めて意識することが必要です。
以上で、今回はクバネティス環境で Helmを利用してアプリケーションをインストールする方法を確認しました。次回は In-Houseカスタマイズアプリケーションを Helmでインストールする方法を確認します。
課題
. Helmを利用して Kafkaをインストールする。
1.最近ではCRDを使用するOperatorを使用したアプリケーションをインストールできます。
オペレーターハブ(https://operatorhub.io/)のサイトで、オペレーターでインストールできる多くのアプリケーションのリストが確認できます。
2. k krew install get-all コマンドでインストールできます。