Slide 1

Slide 1 text

Helm/Helmfile について かとじゅん (@j5ik2o) 1 / 26

Slide 2

Slide 2 text

kubernetes へのデプロイ どうやってます か? Pod を⼀つ⽴てるぐらいならkubectl run $ kubectl run nginx --image nginx $ kubectl expose deployments nginx --port 80 --type=LoadBalancer もう少しちゃんとするなら kubectl + yaml $ kubectl apply -f dir/* --record 複数のコマンドを実⾏するので煩雑になりがち。ロールバックも可能だが⾯倒(kubectl rollout undo でロールバックでき るが、deployments/daemonsets/statefulsets を意識する必要がある) Helm/Helmfile について 2 / 26

Slide 3

Slide 3 text

事故らないように Helm を使いましょう Helm/Helmfile について 3 / 26

Slide 4

Slide 4 text

Helm とは https://helm.sh/ kubernetes のパッケージマネージャ マニフェストの管理 マニフェストファイルを束ねてパッケージ化できる(Chart) アニフェストファイルはテンプレート機能が使える アップデートとロールバックが簡単(kubectl より簡単) Chart を簡単に共有できる Chart 間の依存関係も定義できる kubeapps https://kubeapps.com/ Helm/Helmfile について 4 / 26

Slide 5

Slide 5 text

$ helm search repo wordpress NAME CHART VERSION APP VERSION DESCRIPTION bitnami/wordpress 9.3.14 5.4.2 Web publishing platform for building blogs and ... $ helm install bitnami/wordpress --generate-name LAST DEPLOYED: Tue Jun 23 22:27:18 2020 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: ... $ helm list NAME NAMESPACE REVISION UPDATED STATUS CHA wordpress-1592918836 default 1 2020-06-23 22:27:18.885762 +0900 JST deployed wor $ helm delete wordpress-1592918836 release "wordpress-1592918836" uninstalled $ helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION Helm/Helmfile について 5 / 26

Slide 6

Slide 6 text

⾃前アプリケーションの Helm 化 Helm/Helmfile について 6 / 26

Slide 7

Slide 7 text

Chart を作る $ helm create example Creating example example $ ls -al drwxr-xr-x 7 j5ik2o staff 224 6 23 22:32 . drwxr-xr-x 7 j5ik2o staff 224 6 23 22:32 .. -rw-r--r-- 1 j5ik2o staff 349 6 23 22:32 .helmignore -rw-r--r-- 1 j5ik2o staff 1098 6 23 22:32 Chart.yaml drwxr-xr-x 2 j5ik2o staff 64 6 23 22:32 charts drwxr-xr-x 10 j5ik2o staff 320 6 23 22:32 templates -rw-r--r-- 1 j5ik2o staff 1797 6 23 22:32 values.yaml Helm/Helmfile について 7 / 26

Slide 8

Slide 8 text

Chart.yaml apiVersion: v2 name: example description: A Helm chart for Kubernetes type: application version: 0.1.0 appVersion: 1.16.0 Helm/Helmfile について 8 / 26

Slide 9

Slide 9 text

values.yaml デフォルトの設定を記述する # Default values for example. # This is a YAML-formatted file. # Declare variables to be passed into your templates. replicaCount: 1 image: repository: nginx pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart version. tag: "" # ... 環境毎に設定値を上書きしたい場合は-f を使う必要がある。 $ helm install [RELEASE] [CHART] -f prod-values.yaml -f common-values.yaml Helm/Helmfile について 9 / 26

Slide 10

Slide 10 text

templates templates $ ls -al drwxr-xr-x 10 j5ik2o staff 320 6 23 22:32 . drwxr-xr-x 7 j5ik2o staff 224 6 23 22:32 .. -rw-r--r-- 1 j5ik2o staff 1581 6 23 22:32 NOTES.txt -rw-r--r-- 1 j5ik2o staff 1820 6 23 22:32 _helpers.tpl -rw-r--r-- 1 j5ik2o staff 1828 6 23 22:32 deployment.yaml -rw-r--r-- 1 j5ik2o staff 908 6 23 22:32 hpa.yaml -rw-r--r-- 1 j5ik2o staff 1052 6 23 22:32 ingress.yaml -rw-r--r-- 1 j5ik2o staff 361 6 23 22:32 service.yaml -rw-r--r-- 1 j5ik2o staff 320 6 23 22:32 serviceaccount.yaml drwxr-xr-x 3 j5ik2o staff 96 6 23 22:32 tests deployment.yaml service.yaml 詳しくはこちら参照 → Chart Template Guide - Getting Started Helm/Helmfile について 10 / 26

Slide 11

Slide 11 text

helm package パッケージングせずに、Chart ディレクトリを指定して、install できる $ helm install wordpress-1592921428 . $ helm package . Successfully packaged chart and saved it to: /Users/j5ik2o/Sources/slides/helm-and-helmfile/example/exam Helm/Helmfile について 11 / 26

Slide 12

Slide 12 text

CD でよく使うコマンド Chart のInstall or Upgrade $ helm upgrade [RELEASE] [CHART] -i -f values.yaml デプロイのロールバック。直前のリビジョンに戻る $ helm rollback [RELEASE] 便利だけど、これらのコマンドを駆使するシェルスクリプト( ある意味でhelm ラッパー) が作れて秘伝の タレになってしまう。 Helm/Helmfile について 12 / 26

Slide 13

Slide 13 text

⾃前 Helm ラッパーの問題 実際にはシェルスクリプトでラップしCD などがから実⾏する。シェルスクリプトの秘伝のタレ化が問題 $ helm upgrade --install podinfo sp/podinfo -f prod-values.yaml Helm/Helmfile について 13 / 26

Slide 14

Slide 14 text

Helmfile を使いましょう Helm/Helmfile について 14 / 26

Slide 15

Slide 15 text

Helmfile Helm/Helmfile について 15 / 26

Slide 16

Slide 16 text

Helmfile とは Helm ベースの宣⾔的デプロイツール https://github.com/roboll/helmfile 2020 年5 ⽉現在 2.1K Github スター Helm/Helmfile について 16 / 26

Slide 17

Slide 17 text

helmfile で冪等性を担保する helmfile releases: - name: podinfo chart: sp/podinfo values: - values.yaml $ helmfile apply Helm/Helmfile について 17 / 26

Slide 18

Slide 18 text

その他のコマンド # 差分を確認 $ helmfile -e prod diff --context 3 # diff を使うには以下が必要 # helm plugin install https://github.com/databus23/helm-diff --version # デプロイの特定 $ helmfile -e prod -l name=write-api apply # k8s マニフェストを⽣成させてkubectl でデプロイも可能 $ helmfile -e prod template | kubectl apply -f - Helm/Helmfile について 18 / 26

Slide 19

Slide 19 text

その他の機能 バージョンロック Secret 管理 Values Provider(AWS SecretsManager などと連携) インストール・アンインストール順番を決めるDAG 機能(needs を使う) デバッグ⽀援 Helm/Helmfile について 19 / 26

Slide 20

Slide 20 text

helmfile を分割す例 (1/6) ディレクトリ構成 ├── helmfile.yaml ├── read-api-server │ ├── environments │ │ └── test-values.yaml │ ├── helmfile.yaml │ └── values.yaml.gotmpl └── write-api-server ├── environments │ └── test-values.yaml ├── helmfile.yaml └── values.yaml.gotmpl Helm/Helmfile について 20 / 26

Slide 21

Slide 21 text

helmfile を分割する例 (2/6) helmfile.yaml environments: {{ .Environment.Name }} helmfiles: - path: write-api-server - path: read-api-server Helm/Helmfile について 21 / 26

Slide 22

Slide 22 text

helmfile を分割する例 (3/6) write-api-server/helmfile.yaml environments: {{ .Environment.Name }}: values: - environments/{{ .Environment.Name }}-values.yaml releases: - name: write-api-server namespace: messaging-service chart: ../../charts/write-api-server values: - values.yaml.gotmpl Helm/Helmfile について 22 / 26

Slide 23

Slide 23 text

helmfile を分割する例 (4/6) write-api-server/values.yaml.gotmpl # Default values for sagrada. # This is a YAML-formatted file. # Declare variables to be passed into your templates. prodEnabled: {{ .Values.prodEnabled }} replicaCount: {{ .Values.replicaCount }} image: repository: {{ .Values.image.repository }} tag: latest pullPolicy: Always # ... Helm/Helmfile について 23 / 26

Slide 24

Slide 24 text

helmfile を分割する例 (5/6) write-api-server/environments/test-values.yaml # Default values for sagrada. # This is a YAML-formatted file. # Declare variables to be passed into your templates. prodEnabled: true replicaCount: 3 image: repository: XXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/app/write-api-server tag: latest pullPolicy: Always Helm/Helmfile について 24 / 26

Slide 25

Slide 25 text

helmfile を分割する例 (6/6) 環境名を指定してデプロイする $ helmfile -e test apply 環境名を指定してデプロイ対象を絞る $ helmfile -e test -l name=write-api apply Helm/Helmfile について 25 / 26

Slide 26

Slide 26 text

おわり Helm/Helmfile について 26 / 26