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

k8s ci/cd environment by circleci and helm

k8s ci/cd environment by circleci and helm

D908f01ca71ef80de7e8ba5387790bae?s=128

Kazuhiro Kosaka

May 24, 2019
Tweet

Transcript

  1. と でつくる 環境 オレシカナイト

  2. の どうしてますか?

  3. の どうしてますか? ツール リソース 手段

  4. ツール の どうしてますか? リソース 手段 この組み合わせでベストプラクティスを探る をチラ見しつつ…

  5. 背景 弊社ではすでに が導入済み 面倒な手続きなく利用可能 導入コスト、学習コスト→低い パイプライン( )設定も ( )で管理できる だけで済むなら嬉しい

  6. 背景 原則 マニフェストは 化して管理(チームとしての方針) 本番環境で直接 の実行はできるだけ避けたい(オペミス防止) で漏れなくマニフェストが できる しなければ で即再稼働可能

    プラグインでサブコマンド追加、機能拡張可能
  7. 紆余曲折試行錯誤の末

  8. - 最適化 - 最適化 - 簡易カナリアリリース できました! CircleCI + GHE

    + Shell Scripts で統合
  9. 最適化 な 用リポジトリを用意 ( )ベースでのデプロイ管理 最適化 のデプロイ方法(設定 )を宣言的に記述する で 環境によって異なる設定値を注入

    前に でマニフェストの差分を確認(要 ) 簡易カナリアリリース を利用 特定のラベルがついた を対象(かつ 環境)
  10. 最適化 な 用リポジトリを用意 ( )ベースでのデプロイ管理 最適化 のデプロイ方法(設定 )を宣言的に記述する で 環境によって異なる設定値を注入

    前に でマニフェストの差分を確認(要 ) 簡易カナリアリリース を利用 特定のラベルがついた を対象(かつ 環境)
  11. 最適化 な 用リポジトリを用意 ( )ベースでのデプロイ管理 画像引用元: Introduction to GitLab Flow

    - https://docs.gitlab.com/ee/workflow/gitlab_flow.html 各ブランチが各環境の状態を現す 各サービスの を追加
  12. 最適化 な 用リポジトリを用意 ( )ベースでのデプロイ管理 各ブランチが各環境の状態を現す( を除く) ↓ 『クラスタをゼロ状態から復旧できる』

  13. 最適化 な 用リポジトリを用意 ( )ベースでのデプロイ管理 最適化 のデプロイ方法(設定 )を宣言的に記述する で 環境によって異なる設定値を注入

    前に でマニフェストの差分を確認(要 ) 簡易カナリアリリース を利用 特定のラベルがついた を対象(かつ 環境)
  14. で使われるファイル ※ ファイル名の先頭を にしているのは なファイルと ファイルを区別しやすくする目的 最適化 のデプロイ方法(設定 )を宣言的に記述する で

    環境によって異なる設定値を注入 前に でマニフェストの差分を確認(要 )
  15. --- app: deployment: replicaCount: 1 appImageTag: latest envoyImageTag: v1.10.0 containers:

    app: resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi envoy: resources: limits: cpu: 100m memory: 128Mi ... --- environments: ## 環境ごとの設定、helmfileコマンド実行時に指定 dev: values: - _dev.yaml stg: values: - _stg.yaml prd: values: - _prd.yaml helmDefaults: ## 環境に応じて kubeContext を切り替える tillerNamespace: helm {{if eq .Environment.Name "dev"}} kubeContext: dev-cluster {{else if eq .Environment.Name "stg"}} kubeContext: stg-cluster {{else if eq .Environment.Name "prd"}} kubeContext: prd-cluster {{end}} releases: ## helm設定 - name: stargate-resolver namespace: stargate chart: . values: - _values.yaml.gotmpl ## これに environments の環境設定が注入され                     values.yaml としてhelmに渡される ... 最適化 のデプロイ方法(設定 )を宣言的に記述する で 環境によって異なる設定値を注入 前に でマニフェストの差分を確認(要 ) helmfile.yaml _dev.yaml
  16. --- app: deployment: replicaCount: 1 appImageTag: latest envoyImageTag: v1.10.0 containers:

    app: resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi ... --- app: config: path: config mountPath: /etc/config filename: app_envoy.yaml service: grpc: port: 8000 http: port: 8080 deployment: replicaCount: {{ .Environment.Values | getOrNil "app.deployment.replicaCount" | default 1 }} appImageTag: {{ .Environment.Values | getOrNil "app.deployment.appImageTag" | default "stable" }} envoyImageTag: {{ .Environment.Values | getOrNil "app.deployment.envoyImageTag" | default "stable" }} containers: app: image: ... 最適化 のデプロイ方法(設定 )を宣言的に記述する で 環境によって異なる設定値を注入 前に でマニフェストの差分を確認(要 ) _values.yaml.gotmpl _dev.yaml
  17. --- app: config: path: config mountPath: /etc/config filename: app_envoy.yaml service:

    grpc: port: 8000 http: port: 8080 deployment: replicaCount: 1 appImageTag: latest envoyImageTag: v1.10.0 containers: app: image: ... 最適化 のデプロイ方法(設定 )を宣言的に記述する で 環境によって異なる設定値を注入 前に でマニフェストの差分を確認(要 ) _values.yaml.gotmpl レンダリング結果 tmp/xxxx.yaml
  18. 最適化 のデプロイ方法(設定 )を宣言的に記述する で 環境によって異なる設定値を注入 前に でマニフェストの差分を確認(要 )

  19. 最適化 な 用リポジトリを用意 ( )ベースでのデプロイ管理 最適化 のデプロイ方法(設定 )を宣言的に記述する で 環境によって異なる設定値を注入

    前に でマニフェストの差分を確認(要 ) 簡易カナリアリリース を利用 特定のラベルがついた を対象(かつ 環境)
  20. helm_apply_with_rollout_canary: steps: ... - run: name: ensure canariability # deploymentのlabelをチェック

    command: ./scripts/circleci.sh ensure-canariability ${TARGET_ENV} # TARGET_ENV=prd - run: name: pause rollout-canary-enabled deployments # kubectl rollout pause command: ./scripts/circleci.sh rollout pause ${TARGET_ENV} - run: name: helm apply # helmfile apply no_output_timeout: 30m command: ./scripts/helm.sh apply ${TARGET_ENV} - run: name: rollout canary # kubectl rollout resume && kubectl rollout pause(一瞬だけresumeすることでpodを1台だけ立ち上げる) command: ./scripts/circleci.sh canary ${TARGET_ENV} ... # Slackへ通知 && CircleCIがパイプラインをpauseし、approval(承認ボタン)が押されるのをを待つ (この間にカナリア動作確認) 簡易カナリアリリース を利用 特定のラベルがついた を対象(かつ 環境)
  21. 簡易カナリアリリース を利用 特定のラベルがついた を対象(かつ 環境)

  22. 感想

  23. 感想 ひとまず要件を満たすものはできた 導入も検討していきたい 相当のことを でする必要がありそう(?)だとすると辛い… 当初、 と同じコンセプトのものを独自実装し、ほぼ完成していた 情報収集の難しさを感じた (読み方がわかる) コミュニティ

    事例に関する情報は本当に少ない( の情報が役立つことが多い)
  24. ありがとうございました