Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Helm/Helmfileについて

 Helm/Helmfileについて

かとじゅん

June 24, 2020
Tweet

More Decks by かとじゅん

Other Decks in Technology

Transcript

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

    View Slide

  2. 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

    View Slide

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

    View Slide

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

    View Slide

  5. $ 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

    View Slide

  6. ⾃前アプリケーションの
    Helm

    Helm/Helmfile
    について
    6 / 26

    View Slide

  7. 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

    View Slide

  8. 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

    View Slide

  9. 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

    View Slide

  10. 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

    View Slide

  11. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. Helmfile
    Helm/Helmfile
    について
    15 / 26

    View Slide

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

    View Slide

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

    View Slide

  18. その他のコマンド
    #
    差分を確認
    $ 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

    View Slide

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

    View Slide

  20. 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

    View Slide

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

    View Slide

  22. 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

    View Slide

  23. 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

    View Slide

  24. 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

    View Slide

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

    View Slide

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

    View Slide