Slide 1

Slide 1 text

KubernetesでGitOpsデプロイ

Slide 2

Slide 2 text

⾃⼰紹介 © 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

Slide 3

Slide 3 text

2 © 2019 Hacobu Inc. All rights reserved. | 物流の現状

Slide 4

Slide 4 text

3 © 2019 Hacobu Inc. All rights reserved. | 物流クライシス

Slide 5

Slide 5 text

4 © 2019 Hacobu Inc. All rights reserved. | 物流の三重苦

Slide 6

Slide 6 text

5 © 2019 Hacobu Inc. All rights reserved. | 物流の三重苦を解決したい→MOVO開発

Slide 7

Slide 7 text

6 © 2019 Hacobu Inc. All rights reserved. | MOVO = 複数のプロダクトの集合体

Slide 8

Slide 8 text

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 フロントエンド バックエンド

Slide 9

Slide 9 text

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 フロントエンド バックエンド 今⽇はこの部分を話します

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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タグ更新

Slide 13

Slide 13 text

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タグ更新

Slide 14

Slide 14 text

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タグ更新

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

リリース⽤タグ (セマンティックバージョニング) 例 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

Slide 17

Slide 17 text

リリース⽤タグ (セマンティックバージョニング) 例 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タグ更新

Slide 18

Slide 18 text

リリース⽤タグ (セマンティックバージョニング) 例 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タグ更新

Slide 19

Slide 19 text

リリース⽤タグ (セマンティックバージョニング) 例 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タグ更新

Slide 20

Slide 20 text

リリース⽤タグ (セマンティックバージョニング) 例 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タグ更新

Slide 21

Slide 21 text

リリース⽤タグ (セマンティックバージョニング) 例 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タグ更新

Slide 22

Slide 22 text

CI/CD ‒ Hacobuでの運⽤ • アプリケーションとインフラの境界は、アプリケーションコー ドとk8sマニフェストコード(それぞれ別リポジトリで管理) • CIとCDの境界はECR • k8sマニフェストコードはマイクロサービス単位でリポジトリを 分けている • 各サービス担当ごとにオペレーション権限を与えられるように • Kustomizeを導⼊ • 環境(Dev/Stg/Prod)差分を管理しやすい • リソースやHPA(Horizontal Pod Autoscaler)の設定 © 2020 Hacobu Inc. All rights reserved. | 21

Slide 23

Slide 23 text

GitOps • GitOpsの仕組み? • Hacobuでの運⽤⽅法 © 2020 Hacobu Inc. All rights reserved. | 22 ECR GitOps k8sマニフェスト Gitリポジトリ Pull Request (リリース候補) 承認(マージ) Dev環境 Stg環境 Prod環境

Slide 24

Slide 24 text

GitOps • WeaveWorks社が2017年に提唱したCDのプラクティス • k8sマニフェストはGitに保存してバージョン管理する • アプリケーション開発と同じメリットを享受 • クラスタを監視し、⽬標とする状態(masterブランチ)と⽐較するこ とが可能 • kubectl applyを直接使⽤しない • ⼿デプロイしない • CIツールにCDをやらせない( Kubernetesクラスタの権限を付与する 必要が出てくる) • 独⾃のコントローラでKubernetesの提供する機能を拡張 • Gitリポジトリとクラスタ上の状態の差異を監視 © 2020 Hacobu Inc. All rights reserved. | 23

Slide 25

Slide 25 text

独⾃のコントローラ • 独⾃のコントローラとしての要件 これだとk8sマニフェストのイメージタグは⼿で書き換えることになる そこも⾃動化したい も要件に加え、それが実現できる仕組みを調査 © 2020 Hacobu Inc. All rights reserved. | 24 • Gitリポジトリとクラスタ上の状態の差異を監視 • ECR上のイメージタグの追加を監視 • k8sマニフェストのイメージタグを更新 • リリース⽤タグではリリース承認⽤にPull Requestを⾃動⽣成

Slide 26

Slide 26 text

独⾃のコントローラ © 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

Slide 27

Slide 27 text

CD = ArgoCD + 独⾃GitOpsコントローラ FluxCDは有望だったが、 • Gitリポジトリごとにデーモンを起動する必要がある • ArgoCDのUIが優れている • GitHubへの⾃動Pull Request作成をやりたかった • やるならどのみちコントローラを作る必要がある © 2020 Hacobu Inc. All rights reserved. | 26 ArgoCD + GitOpsコントローラを⾃作 イメージ 監視 イメージ タグGit更新 Pull Request 作成 Git差異 監視 クラスタ ⾃動更新 UI

Slide 28

Slide 28 text

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 イメージタグ 更新 イメージタグ 更新

Slide 29

Slide 29 text

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上の各種操作を⾏う

Slide 30

Slide 30 text

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とクラスタの差異を監視 クラスタへの⾃動更新を⾏う

Slide 31

Slide 31 text

ArgoCDとGitOpsコントローラの連携 © 2020 Hacobu Inc. All rights reserved. | 30 ArgoCDとGitOpsコントローラ の境界はGit

Slide 32

Slide 32 text

ArgoCDのデプロイフロー ArgoCD Kubernetes RDS Slack GitHub WebHook master push © 2020 Hacobu Inc. All rights reserved. | 31 GitHubへのpushイベントをWebHookで受け取る

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

まとめ • アプリケーションとインフラの境界は、アプリ ケーションコードとk8sマニフェスト • CIとCDの境界はECR • CDにおけるArgoCDとGitOpsコントローラの境界 はGit ☆責務を定義する境界選びは⼤事☆ © 2020 Hacobu Inc. All rights reserved. | 37

Slide 39

Slide 39 text

⼀緒にプロダクト開発しましょう https://movo.co.jp/recruit © 2020 Hacobu Inc. All rights reserved. | 38 社会インフラである物流を 効率化したくてたまらないけど、 ⼈が⾜りなくて困っています (´-`).。oO (助けてください)

Slide 40

Slide 40 text

ありがとうございました © 2020 Hacobu Inc. All rights reserved. | 39