こんにちは。KOUKIです。
とある企業でWebエンジニアをやっています。
前回は、Helmの検証やデバッキングの方法を学びました。
今回は、Chartの作成方法を学びましょう。
<目次>
検証環境
- helm v3
- mac
- minikube
Kubernetesに関しては、こちらも参考にしてください。
Chartの作成
これまでは、NginxのChartを利用してアプリのデプロイを行なっていましたが、実はこのChartは自分で作成可能です。
というか、これが実運用における本来の使い方、なのかもしれません。
最初に、ワークスペースを作成しましょう。
1 2 |
$ mkdir mycharts $ cd mycharts/ |
helm createコマンドを使って、Chartを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ helm create myapp Creating myapp $ ls myapp $ tree myapp -a -L 3 myapp ├── .helmignore ├── Chart.yaml ├── charts ├── templates │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── deployment.yaml │ ├── hpa.yaml │ ├── ingress.yaml │ ├── service.yaml │ ├── serviceaccount.yaml │ └── tests │ └── test-connection.yaml └── values.yaml |
たくさんのファイルが生成されました。
このチャートをhelm installコマンドでデプロイしてみましょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ helm install myapp01 myapp NAME: myapp01 LAST DEPLOYED: Thu Nov 25 05:26:01 2021 $ kubectl get svc,deployment,pod NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d service/myapp01 ClusterIP 10.102.35.11 <none> 80/TCP 76s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/myapp01 1/1 1 1 76s NAME READY STATUS RESTARTS AGE pod/myapp01-6464ccd48-qlzw9 1/1 Running 0 76s |
デプロイされてますね。
ポートフォワーディングして、Podにアクセスしましょう。
1 2 3 |
$ kubectl port-forward myapp01-6464ccd48-qlzw9 8080:80 Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80 |

Nginxのページが表示されました。デフォルトは、Nginxが表示される様ですね。
Chart.yamlの中身
自動生成されたChart.yamlの中身を見てみましょう。尚、コメントは消しています。
1 2 3 4 5 6 7 8 9 |
apiVersion: v2 # 必須 - Helm3の場合はv2, Helm2の場合はv1 name: myapp # 必須 - Chartのタイトル description: A Helm chart for Kubernetes type: application version: 0.1.0 # 必須 - Chartのバージョン appVersion: "1.16.0" # アプリケーションのバージョン |
上記の設定の詳細は、こちらにあります。
appVersionを「1.16.0」->「1.0.0」に変えておきましょう(この微妙なバージョンはなんなんだろう?)。
1 |
appVersion: "1.0.0" # アプリケーションのバージョン |
templatesフォルダの中身
templatesフォルダの中身を確認しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ cd myapp/templates/ $ ls -la total 56 drwxr-xr-x 10 hoge staff 320 11 25 05:21 . drwxr-xr-x 7 <meta charset="utf-8">hoge staff 224 11 25 05:21 .. -rw-r--r-- 1 <meta charset="utf-8">hoge staff 1739 11 25 05:21 NOTES.txt -rw-r--r-- 1 <meta charset="utf-8">hoge staff 1762 11 25 05:21 _helpers.tpl -rw-r--r-- 1 <meta charset="utf-8">hoge staff 1826 11 25 05:21 deployment.yaml -rw-r--r-- 1 <meta charset="utf-8">hoge staff 910 11 25 05:21 hpa.yaml -rw-r--r-- 1 <meta charset="utf-8">hoge staff 2075 11 25 05:21 ingress.yaml -rw-r--r-- 1 <meta charset="utf-8">hoge staff 355 11 25 05:21 service.yaml -rw-r--r-- 1 <meta charset="utf-8">hoge staff 316 11 25 05:21 serviceaccount.yaml drwxr-xr-x 3 <meta charset="utf-8">hoge staff 96 11 25 05:21 tests |
ここに、ingressやservice、deploymentが収められてますね。
service.yamlを開いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: v1 kind: Service metadata: name: {{ include "myapp.fullname" . }} labels: {{- include "myapp.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "myapp.selectorLabels" . | nindent 4 }} |
「{{ include “myapp.fullname” . }}」など見慣れない構文がありますね。Go言語使いならピーンとくるかもしれません。
これは、テンプレート構文です。
以下のようにルールがあります。
- {{}}で囲む(例: {{lower “Hello”}} => hello)
- values.yamlから値を参照できる
- .Valuesの「.」はルートパスを示す
- .Valuesキーワードでvalues.yamlに設定されたパラメーターの値を取得できる
- includeキーワードで、他のテンプレートを埋め込むことができる(二番目の引数は変数のスコープで、dot(.)はルートを示す)
- Helm関数はスペースで区切られた同じ行のパラメータを受け取る
例えば、「{{ .Values.service.port }}」に関しては、values.yamlの以下のパラメータに紐づきます。
1 2 3 |
service: type: ClusterIP port: 80 <<<<<<<< |
Helmのテンプレート構文については、こちらで確認ください。
Helm Chartのパッケージング
もう少し、Chartを掘り下げてみましょう。
一旦、前回作成したmyapp01を削除します。
1 2 |
$ helm uninstall myapp01 release "myapp01" uninstalled |
続いて、variables.yamlに定義されているイメージを変更します。
1 2 3 4 |
# nginx -> nodejsアプリに変更 image: # repository: nginx repository: afakharany/hellonodejs |
再び、アプリケーションをインストールします。
1 2 3 4 5 6 7 |
$ pwd /Users/hoge/Desktop/helm/mycharts/myapp $ helm install myapp01 . $ kubectl get pods NAME READY STATUS RESTARTS AGE myapp01-6c7599ff8c-wxprh 0/1 ContainerCreating 0 39s |
このPodにポートフォワーディングをします。
1 2 3 |
$ kubectl port-forward myapp01-6c7599ff8c-wxprh 8080:80 Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80 |

サクッと切り替わりました。
kubectlコマンドを実行する場合、service.yamlやdeployment.yamlなど個別にファイル名を指定したりしていたので、それに比べればインストールが楽だと思います。
作成したチャートは、helm packageコマンドで固められます。
1 2 |
$ helm package . Successfully packaged chart and saved it to: /Users/hoge/Desktop/helm/mycharts/myapp/myapp-0.1.0.tgz |
ちなみに、.helmignoreファイルができていたと思うのですが、このファイルに記述されたものは上記のpackageには含まれないようになります。
もちろん、このパッケージからインストール可能です。
1 2 3 4 5 6 7 8 9 10 11 |
$ helm install myapp02 myapp-0.1.0.tgz NAME: myapp02 $ kubectl get pods NAME READY STATUS RESTARTS AGE myapp01-6c7599ff8c-ll4r4 1/1 Running 0 6m39s myapp02-7f89c88f84-5qs9r 1/1 Running 0 21s $ kubectl port-forward myapp02-7f89c88f84-5qs9r 8080:80 Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80 |

完璧ですね。
Clean Up
最後に後片付けをして、終わりにしましょう。
1 2 3 |
$ helm uninstall myapp01 myapp02 release "myapp01" uninstalled release "myapp02" uninstalled |
コメントを残す
コメントを投稿するにはログインしてください。