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

KubernetesでGitOpsデプロイ.pdf

Yuki Toida
September 25, 2020

 KubernetesでGitOpsデプロイ.pdf

Yuki Toida

September 25, 2020
Tweet

More Decks by Yuki Toida

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 © 2020 Hacobu Inc. All rights reserved. | 1

    • ⼾井⽥ 裕貴 (37歳) • 奥様 (45歳) • 娘様 (7歳) • 趣味特技 :サッカー / 映画 / ⿇雀 • 好きな⾔語:Golang / C# / Elixir • 苦⼿な⾔語:Cascading Style Sheets • やってきたこと • ソーシャルゲーム系スタートアップ 約6年 • 動画系スタートアップ 約1.5年 • 物流スタートアップ 約2年(いまここでCTOやってます) https://www.facebook.com/yuki.toida https://twitter.com/yuki_toida
  2. 6 © 2019 Hacobu Inc. All rights reserved. | MOVO

    = 複数のプロダクトの集合体
  3. Lambda MOVOのインフラ構成 © 2020 Hacobu Inc. All rights reserved. |

    7 CloudFront ALB Target Group S3 ECR EKS Worker Node Target Group Auto Scaling Group WAF Worker Node Worker Node Auto Scaling Group Worker Node Aurora Kinesis DynamoDB フロントエンド バックエンド
  4. MOVOのインフラ構成 © 2020 Hacobu Inc. All rights reserved. | 8

    Lambda CloudFront ALB Target Group S3 ECR EKS Worker Node Target Group Auto Scaling Group WAF Worker Node Worker Node Auto Scaling Group Worker Node Aurora Kinesis DynamoDB フロントエンド バックエンド 今⽇はこの部分を話します
  5. CI/CD ‒ Dev環境 © 2020 Hacobu Inc. All rights reserved.

    | 9 アプリケーションコード Gitリポジトリ Pull Request マージ CircleCI App Build Test Docker Build Docker Push アプリケーションコードがmasterにマージされると、CircleCIの開発⽤パイプラインが実⾏される 開発⽤パイプライン CI CD
  6. CI/CD ‒ Dev環境 © 2020 Hacobu Inc. All rights reserved.

    | 10 アプリケーションコード Gitリポジトリ Pull Request マージ CircleCI App Build Test Docker Build Docker Push ECR CircleCIのアーティファクトとなるDocker Imageに開発⽤タグを付けてECRにpushされる 開発⽤タグ (シリアルNo.+ハッシュ値) 例 dev-100-fcc0d726bc29f62c8bd635e8b34d7d781d15971e 開発⽤パイプライン CI CD
  7. CI/CD ‒ Dev環境 © 2020 Hacobu Inc. All rights reserved.

    | 11 アプリケーションコード Gitリポジトリ Pull Request マージ CircleCI App Build Test Docker Build Docker Push ECR ECRへ開発⽤タグがpushされたことををGitOpsの仕組みが検知、Dev環境のImageタグが更新される 開発⽤タグ (シリアルNo.+ハッシュ値) 例 dev-100-fcc0d726bc29f62c8bd635e8b34d7d781d15971e 開発⽤パイプライン CI CD GitOps k8sマニフェスト Gitリポジトリ Imageタグ更新
  8. CI/CD ‒ Dev環境 © 2020 Hacobu Inc. All rights reserved.

    | 12 アプリケーションコード Gitリポジトリ Pull Request マージ CircleCI App Build Test Docker Build Docker Push ECR 再度GitOpsの仕組みでk8sマニフェストの変更を検知してDev環境へ反映、開発者は動作を確認できる 開発⽤タグ (シリアルNo.+ハッシュ値) 例 dev-100-fcc0d726bc29f62c8bd635e8b34d7d781d15971e Dev環境 開発者 開発⽤パイプライン CI CD GitOps k8sマニフェスト Gitリポジトリ Imageタグ更新
  9. CI/CD ‒ Dev環境 © 2020 Hacobu Inc. All rights reserved.

    | 13 アプリケーションコード Gitリポジトリ Pull Request マージ CircleCI App Build Test Docker Build Docker Push ECR さらにアプリケーションコードへの修正を⾏い、継続的なデプロイのサイクルが⾏われる 開発⽤タグ (シリアルNo.+ハッシュ値) 例 dev-100-fcc0d726bc29f62c8bd635e8b34d7d781d15971e Dev環境 開発者 開発⽤パイプライン masterブランチの状態に追随して 継続的にデプロイされる CI CD 修正 GitOps k8sマニフェスト Gitリポジトリ Imageタグ更新
  10. CI/CD ‒ Stg/Prod環境 © 2020 Hacobu Inc. All rights reserved.

    | 14 アプリケーションコード Gitリポジトリ バージョンタグ push CircleCI App Build Test Docker Build Docker Push バージョンタグがpushされると、CircleCIのプロダクション⽤パイプラインが実⾏される プロダクション⽤パイプライン CI CD
  11. リリース⽤タグ (セマンティックバージョニング) 例 v1.0.0 CI/CD ‒ Stg/Prod環境 © 2020 Hacobu

    Inc. All rights reserved. | 15 アプリケーションコード Gitリポジトリ バージョンタグ push CircleCI App Build Test Docker Build Docker Push ECR CircleCIのアーティファクトとなるDocker Imageにリリース⽤タグを付けてECRにpushされる プロダクション⽤パイプライン CI CD
  12. リリース⽤タグ (セマンティックバージョニング) 例 v1.0.0 CI/CD ‒ Stg/Prod環境 © 2020 Hacobu

    Inc. All rights reserved. | 16 アプリケーションコード Gitリポジトリ バージョンタグ push CircleCI App Build Test Docker Build Docker Push ECR ECRへリリース⽤タグがpushされたことををGitOpsの仕組みが検知、Stg環境のImageタグが更新される あわせてProd環境のImageタグを更新したPull Requestを⽣成 GitOps プロダクション⽤パイプライン CI CD k8sマニフェスト Gitリポジトリ Pull Request (リリース候補) Imageタグ更新
  13. リリース⽤タグ (セマンティックバージョニング) 例 v1.0.0 CI/CD ‒ Stg/Prod環境 © 2020 Hacobu

    Inc. All rights reserved. | 17 アプリケーションコード Gitリポジトリ バージョンタグ push CircleCI App Build Test Docker Build Docker Push ECR 再度GitOpsの仕組みでk8sマニフェストの変更を検知してStg環境へ反映、QAエンジニアは動作を確認できる Stg環境 GitOps QA プロダクション⽤パイプライン CI CD k8sマニフェスト Gitリポジトリ Pull Request (リリース候補) Imageタグ更新
  14. リリース⽤タグ (セマンティックバージョニング) 例 v1.0.0 CI/CD ‒ Stg/Prod環境 © 2020 Hacobu

    Inc. All rights reserved. | 18 アプリケーションコード Gitリポジトリ バージョンタグ push CircleCI App Build Test Docker Build Docker Push ECR QAの結果、不具合がある場合は開発者に差し戻し、再度修正のためのデプロイフローが⾏われる Stg環境 GitOps QA プロダクション⽤パイプライン OK? no 修正 CI CD k8sマニフェスト Gitリポジトリ Pull Request (リリース候補) Imageタグ更新
  15. リリース⽤タグ (セマンティックバージョニング) 例 v1.0.0 CI/CD ‒ Stg/Prod環境 © 2020 Hacobu

    Inc. All rights reserved. | 19 アプリケーションコード Gitリポジトリ バージョンタグ push CircleCI App Build Test Docker Build Docker Push ECR QAが完了すると、管理者により最後のPull Requestがマージされる Stg環境 GitOps QA プロダクション⽤パイプライン OK? yes no 修正 CI CD k8sマニフェスト Gitリポジトリ 承認(マージ) Pull Request (リリース候補) QAにてリリースOK となったバージョンのみ 適切なタイミングにて 管理者が実⾏ Imageタグ更新
  16. リリース⽤タグ (セマンティックバージョニング) 例 v1.0.0 CI/CD ‒ Stg/Prod環境 © 2020 Hacobu

    Inc. All rights reserved. | 20 アプリケーションコード Gitリポジトリ バージョンタグ push CircleCI App Build Test Docker Build Docker Push ECR 再度GitOpsの仕組みでk8sマニフェストの変更を検知してProd環境へ反映、⼀連の継続的デリバリーが完了する Stg環境 GitOps QA Prod環境 プロダクション⽤パイプライン OK? yes no 修正 CI CD k8sマニフェスト Gitリポジトリ Pull Request (リリース候補) 承認(マージ) QAにてリリースOK となったバージョンのみ 適切なタイミングにて 管理者が実⾏ Imageタグ更新
  17. CI/CD ‒ Hacobuでの運⽤ • アプリケーションとインフラの境界は、アプリケーションコー ドとk8sマニフェストコード(それぞれ別リポジトリで管理) • CIとCDの境界はECR • k8sマニフェストコードはマイクロサービス単位でリポジトリを

    分けている • 各サービス担当ごとにオペレーション権限を与えられるように • Kustomizeを導⼊ • 環境(Dev/Stg/Prod)差分を管理しやすい • リソースやHPA(Horizontal Pod Autoscaler)の設定 © 2020 Hacobu Inc. All rights reserved. | 21
  18. GitOps • GitOpsの仕組み? • Hacobuでの運⽤⽅法 © 2020 Hacobu Inc. All

    rights reserved. | 22 ECR GitOps k8sマニフェスト Gitリポジトリ Pull Request (リリース候補) 承認(マージ) Dev環境 Stg環境 Prod環境
  19. GitOps • WeaveWorks社が2017年に提唱したCDのプラクティス • k8sマニフェストはGitに保存してバージョン管理する • アプリケーション開発と同じメリットを享受 • クラスタを監視し、⽬標とする状態(masterブランチ)と⽐較するこ とが可能

    • kubectl applyを直接使⽤しない • ⼿デプロイしない • CIツールにCDをやらせない( Kubernetesクラスタの権限を付与する 必要が出てくる) • 独⾃のコントローラでKubernetesの提供する機能を拡張 • Gitリポジトリとクラスタ上の状態の差異を監視 © 2020 Hacobu Inc. All rights reserved. | 23
  20. 独⾃のコントローラ • 独⾃のコントローラとしての要件 これだとk8sマニフェストのイメージタグは⼿で書き換えることになる そこも⾃動化したい も要件に加え、それが実現できる仕組みを調査 © 2020 Hacobu Inc.

    All rights reserved. | 24 • Gitリポジトリとクラスタ上の状態の差異を監視 • ECR上のイメージタグの追加を監視 • k8sマニフェストのイメージタグを更新 • リリース⽤タグではリリース承認⽤にPull Requestを⾃動⽣成
  21. 独⾃のコントローラ © 2020 Hacobu Inc. All rights reserved. | 25

    Git差異 監視 クラスタ ⾃動更新 イメージ 監視 イメージ タグGit更新 Pull Request 作成 Git差異 監視 クラスタ ⾃動更新 イメージ 監視 イメージ タグGit更新 Pull Request 作成 Git差異 監視 クラスタ ⾃動更新 イメージ 監視 イメージ タグGit更新 Pull Request 作成 要件に合うものを検証 ×インストールとデプロイ設定の保存いずれも命令的 ×動作が重い、構造が複雑、ちょっと怖い △Pull Request作成はできないが、Manual Judgement機能はある 〇インストールが容易、宣⾔的 〇イメージの監視ができる ×アプリケーションごとに1デーモン起動しなければならない 〇インストールが容易、宣⾔的 〇優れたUIを持ち、UI上でもオペレーションが可能 〇アプリケーション設定がCRDでコード化でき宣⾔的 ×イメージの監視はできない UI UI UI FluxCD ArgoCD Spinnaker
  22. CD = ArgoCD + 独⾃GitOpsコントローラ FluxCDは有望だったが、 • Gitリポジトリごとにデーモンを起動する必要がある • ArgoCDのUIが優れている

    • GitHubへの⾃動Pull Request作成をやりたかった • やるならどのみちコントローラを作る必要がある © 2020 Hacobu Inc. All rights reserved. | 26 ArgoCD + GitOpsコントローラを⾃作 イメージ 監視 イメージ タグGit更新 Pull Request 作成 Git差異 監視 クラスタ ⾃動更新 UI
  23. ArgoCDとGitOpsコントローラの連携 © 2020 Hacobu Inc. All rights reserved. | 27

    overlays/prod overlays/stg overlayss/dev Pull Request 管理者によるマージ GitOps Controller ECR 新規イメージタグの監視 Prod環境 Stg環境 Dev環境 ArgoCD Git差異 監視 クラスタ ⾃動更新 Kustomize 開発⽤タグ追加 リリース⽤タグ追加 master master master overlays/prod Pull Request 作成 release イメージタグ 更新 apiVersion: gitops.hacobu.co.jp/v1 kind: GitOps metadata: name: hacobu-hoge-api namespace: xxx spec: git_branch: master git_paths: - overlays/prod/kustomization.yaml git_release_branch: release git_release_candidate_branch: releases git_repo: ’https://github.com/xxx/hacobu-hoge-api.git’ image_path: xxx.dkr.ecr.ap-northeast- 1.amazonaws.com/xxx/hacobu_hoge_api image_tag_format: semantic イメージタグ 更新 イメージタグ 更新
  24. ArgoCDとGitOpsコントローラの連携 © 2020 Hacobu Inc. All rights reserved. | 28

    overlays/prod overlays/stg overlayss/dev Pull Request 管理者によるマージ GitOps Controller ECR 新規イメージタグの監視 Prod環境 Stg環境 Dev環境 ArgoCD Git差異 監視 クラスタ ⾃動更新 Kustomize 開発⽤タグ追加 リリース⽤タグ追加 master master master overlays/prod Pull Request 作成 release イメージタグ 更新 apiVersion: gitops.hacobu.co.jp/v1 kind: GitOps metadata: name: hacobu-hoge-api namespace: xxx spec: git_branch: master git_paths: - overlays/prod/kustomization.yaml git_release_branch: release git_release_candidate_branch: releases git_repo: ’https://github.com/xxx/hacobu-hoge-api.git’ image_path: xxx.dkr.ecr.ap-northeast- 1.amazonaws.com/xxx/hacobu_hoge_api image_tag_format: semantic イメージタグ 更新 イメージタグ 更新 GitOps ControllerはECRの新規イメージタグを監視 Git上の各種操作を⾏う
  25. ArgoCDとGitOpsコントローラの連携 © 2020 Hacobu Inc. All rights reserved. | 29

    overlays/prod overlays/stg overlayss/dev Pull Request 管理者によるマージ GitOps Controller ECR 新規イメージタグの監視 Prod環境 Stg環境 Dev環境 ArgoCD Git差異 監視 クラスタ ⾃動更新 Kustomize 開発⽤タグ追加 リリース⽤タグ追加 master master master overlays/prod Pull Request 作成 release イメージタグ 更新 apiVersion: gitops.hacobu.co.jp/v1 kind: GitOps metadata: name: hacobu-hoge-api namespace: xxx spec: git_branch: master git_paths: - overlays/prod/kustomization.yaml git_release_branch: release git_release_candidate_branch: releases git_repo: ’https://github.com/xxx/hacobu-hoge-api.git’ image_path: xxx.dkr.ecr.ap-northeast- 1.amazonaws.com/xxx/hacobu_hoge_api image_tag_format: semantic イメージタグ 更新 イメージタグ 更新 ArgoCDはGitとクラスタの差異を監視 クラスタへの⾃動更新を⾏う
  26. ArgoCDのデプロイフロー ArgoCD Kubernetes RDS Slack GitHub WebHook master push ©

    2020 Hacobu Inc. All rights reserved. | 31 GitHubへのpushイベントをWebHookで受け取る
  27. ArgoCDのデプロイフロー ArgoCD Kubernetes RDS Slack デプロイ開始通知 Job PreSync hook GitHub

    WebHook master push © 2020 Hacobu Inc. All rights reserved. | 32 ArgoCDのPreSyncをhookして、デプロイの開始をSlack通知
  28. ArgoCDのデプロイフロー ArgoCD Kubernetes RDS Slack DBマイグレート Job Sync hook PreSync

    hook GitHub WebHook master push © 2020 Hacobu Inc. All rights reserved. | 33 ArgoCDのSyncをhookして、データベースのマイグレーションを実施 デプロイ開始通知 Job
  29. ArgoCDのデプロイフロー ArgoCD Kubernetes RDS Slack Sync Sync hook PreSync hook

    apply GitHub WebHook master push © 2020 Hacobu Inc. All rights reserved. | 34 ArgoCDによるクラスタ同期が実⾏される DBマイグレート Job デプロイ開始通知 Job
  30. ArgoCDのデプロイフロー ArgoCD Kubernetes RDS Slack Sync デプロイ完了通知 Job Sync hook

    PreSync hook PostSync hook apply GitHub WebHook master push © 2020 Hacobu Inc. All rights reserved. | 35 最後にArgoCDのPostSyncをhookして、デプロイの完了をSlack通知 DBマイグレート Job デプロイ開始通知 Job
  31. ArgoCDのデプロイフロー ArgoCD Kubernetes RDS Slack Sync Sync hook PreSync hook

    PostSync hook apply GitHub WebHook master push クラスタと 差分がある 場合のみ実⾏ © 2020 Hacobu Inc. All rights reserved. | 36 (これらはGitとクラスタの差分がある場合のみ実⾏される) デプロイ完了通知 Job DBマイグレート Job デプロイ開始通知 Job
  32. ⼀緒にプロダクト開発しましょう https://movo.co.jp/recruit © 2020 Hacobu Inc. All rights reserved. |

    38 社会インフラである物流を 効率化したくてたまらないけど、 ⼈が⾜りなくて困っています (´-`).。oO (助けてください)