Slide 1

Slide 1 text

忙しい⼈のためのGitOps⼊⾨ @Open Developers Conference 2019 技術本部 伊藤⻯⼀ (@amaya382) 2019/8/24

Slide 2

Slide 2 text

⾃⼰紹介 伊藤⻯⼀ しごと • 所属: さくらインターネット株式会社 技術本部 • 新規プロジェクト×2でKubernetesを導⼊中 • 1つはAPIサーバのデプロイ先、バッチ処理実⾏環境として • 1つはスケーラブルなデータ処理基盤として こじん • Twitter: @amaya382 • Kubernetesに関する同⼈誌を書いたり • 技術書典7もKubernetes関係で執筆中✏ • お08C「かいていどうくつ」 2

Slide 3

Slide 3 text

対象者とゴール 前提 • Docker・Gitの基本的な概念 対象者 • k8s上にアプリをデプロイするイメージを掴みたい⼈ ゴール • 「k8sでアプリデプロイ」→「GitOps」という選択肢を知る • なぜ必要なのか、導⼊するとどうなるのか NOTゴール • k8s・GitOpsの仕組み、実際のツール、導⼊に必要な物事 3

Slide 4

Slide 4 text

もう少し詳しく知りたい⽅は… • k8sの概念をもう少し知りたい → https://speakerdeck.com/amaya382/kubernetestutehe- gadekirufalse-dounatuterufalse • GitOpsの仕組み、導⼊⽅法まで知りたい (本資料のLong版) → https://speakerdeck.com/amaya382/kuberneteswozui- da-xian-nihuo-kasutamefalsegitopsru-men 4

Slide 5

Slide 5 text

GitOpsの概要とゴール k8sを前提としたGitを中⼼に据えたCI/CD⼿法 • 原典: https://www.weave.works/technologies/gitops/ ストレスフリーな爆速デプロイ 全てのサービスの状態・設定をコード化、Gitで管理 • 属⼈化したHackを防ぐ • デプロイ状態の確認を容易に • 開発だけでなく、運⽤作業もGitの操作で統⼀ 適切な関⼼の分離 • 権限の分離 • セキュリティリスクの抑制 5 ほぼ⼿放しで安定

Slide 6

Slide 6 text

GitOpsの概要とゴール k8sを前提としたGitを中⼼に据えたCI/CD⼿法 • 原典: https://www.weave.works/technologies/gitops/ ストレスフリーな爆速デプロイ 全てのサービスの状態・設定をコード化、Gitで管理 • 属⼈化したHackを防ぐ • デプロイ状態の確認を容易に • 開発だけでなく、運⽤作業もGitの操作で統⼀ 適切な関⼼の分離 • 権限の分離 • セキュリティリスクの抑制 6 例えば… Git Revertでサービス巻き戻し

Slide 7

Slide 7 text

GitOpsの概要とゴール k8sを前提としたGitを中⼼に据えたCI/CD⼿法 • 原典: https://www.weave.works/technologies/gitops/ ストレスフリーな爆速デプロイ 全てのサービスの状態・設定をコード化、Gitで管理 • 属⼈化したHackを防ぐ • デプロイ状態の確認を容易に • 開発だけでなく、運⽤作業もGitの操作で統⼀ 適切な関⼼の分離 • 権限の分離 • セキュリティリスクの抑制 7 CIの権限は最低限に

Slide 8

Slide 8 text

Kubernetes超速おさらい そもそも読み⽅がよく分からん • Kubernetes: クーバーネィティス (諸説あり) • k8s: ケーエイツ (ケーハチエス) • kube*: キューブ* コンテナオーケストレーションシステム • コンテナ間のネットワークの管理 • 計算機リソースの分配 • ⾃動的なスケール・障害時復旧 • etc. ※Docker以外にも対応しているが、殆どの場合Dockerと利⽤される 8 コンテナベースのアプリを 本番運⽤するに必要な機能群 どこで 動かそう?

Slide 9

Slide 9 text

k8s と Infrastructure as Code • k8sの特徴: リソースをManifestと呼ばれるファイルで管理可能 9 • アプリAを1つ • バージョンは2.1で • アプリBを4つ • ⾃動でスケールして欲しい • ロードバランサが必要 Manifest

Slide 10

Slide 10 text

k8s と Infrastructure as Code • k8sの特徴: リソースをManifestと呼ばれるファイルで管理可能 10 • アプリAを1つ • バージョンは2.1で • アプリBを4つ • ⾃動でスケールして欲しい • ロードバランサが必要 kubectl apply Manifest k8sのCLI

Slide 11

Slide 11 text

k8s と Infrastructure as Code • k8sの特徴: リソースをManifestと呼ばれるファイルで管理可能 11 • アプリAを1つ • バージョンは2.1で • アプリBを4つ • ⾃動でスケールして欲しい • ロードバランサが必要 Manifest k8sのCLI kubectl apply 良しなにManifest と同じ状態に調整

Slide 12

Slide 12 text

k8s と Infrastructure as Code • k8sの特徴: リソースをManifestと呼ばれるファイルで管理可能 12 • アプリAを1つ • バージョンは2.1で • アプリBを2つ • ⾃動でスケールして欲しい • ロードバランサが必要 Manifest Manifest通りの状態 kubectl apply アプリA アプリB

Slide 13

Slide 13 text

CI/CD超速おさらい CI/CDの⽬的は? • 変更があった際に必要な処理の⾃動化 CIとCDは似ているが、役割が少し異なる • CI(ContinuousIntegration) • ⾃動的なテスト実⾏・ビルド成果物 (DockerImage、npmパッケージ等)アップロード • CD(ContinuousDelivery/Deployment) • ⾃動的なアプリデプロイ ※2つまとめてCIと呼ぶことも多い 13 Push Hook ビルド・テスト実⾏ コード変更 Hook デプロイ実⾏ 開発者 Deploy

Slide 14

Slide 14 text

14 + CI/CD

Slide 15

Slide 15 text

kubectlと従来のCI/CD 「CI/CDでkubectlすればいいじゃん」 サービスの世代管理が困難 意図したデプロイ状況になっているか分からない 属⼈化したHackが発⽣ パワフルな権限を持つCI ※GitOpsと対⽐して、従来のCI/CDをCIOpsと呼ぶ • Push型 15 Apply 開発環境 本番環境 Apply

Slide 16

Slide 16 text

kubectlと従来のCI/CD 「CI/CDでkubectlすればいいじゃん」 サービスの世代管理が困難 意図したデプロイ状況になっているか分からない 属⼈化したHackが発⽣ パワフルな権限を持つCI ※GitOpsと対⽐して、従来のCI/CDをCIOpsと呼ぶ • Push型 16 Apply 開発環境 本番環境 Apply 変更をデプロイするだけ 状態を管理できるわけではない

Slide 17

Slide 17 text

kubectlと従来のCI/CD 「CI/CDでkubectlすればいいじゃん」 サービスの世代管理が困難 意図したデプロイ状況になっているか分からない 属⼈化したHackが発⽣ パワフルな権限を持つCI ※GitOpsと対⽐して、従来のCI/CDをCIOpsと呼ぶ • Push型 17 Apply 開発環境 本番環境 Apply 誰も触れない秘伝のタレ

Slide 18

Slide 18 text

kubectlと従来のCI/CD 「CI/CDでkubectlすればいいじゃん」 サービスの世代管理が困難 意図したデプロイ状況になっているか分からない 属⼈化したHackが発⽣ パワフルな権限を持つCI ※GitOpsと対⽐して、従来のCI/CDをCIOpsと呼ぶ • Push型 18 Apply 開発環境 本番環境 Apply ⾼セキュリティリスク

Slide 19

Slide 19 text

GitOpsとは k8sを前提としたGitを中⼼に据えたCI/CD⼿法 • SingleSourceofTruthとして、サービスの状態を1つのGitリポジトリで持つ • 関⼼ (CI/CD) の分離 • 権限の分離 19 SingleSourceofTruth (Manifestファイル群) Pull型同期 • アプリAを1つ • バージョンは2.1で • アプリBを4つ • ⾃動でスケールして欲しい • ロードバランサが必要 CDツール サービスの状態

Slide 20

Slide 20 text

Docker Registry GitOpsとは k8sを前提としたGitを中⼼に据えたCI/CD⼿法 • SingleSourceofTruthとして、サービスの状態を1つのGitリポジトリで持つ • 関⼼ (CI/CD) の分離 • 権限の分離 20 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) アプリソースコード CIツール CDツール

Slide 21

Slide 21 text

Docker Registry GitOpsとは k8sを前提としたGitを中⼼に据えたCI/CD⼿法 • SingleSourceofTruthとして、サービスの状態を1つのGitリポジトリで持つ • 関⼼ (CI/CD) の分離 • 権限の分離 21 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) CI Hook アプリイメージ更新 開発者(Dev) アプリソースコード CIツール CDツール

Slide 22

Slide 22 text

Docker Registry GitOpsとは k8sを前提としたGitを中⼼に据えたCI/CD⼿法 • SingleSourceofTruthとして、サービスの状態を1つのGitリポジトリで持つ • 関⼼ (CI/CD) の分離 • 権限の分離 22 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) CD アプリソースコード CIツール CDツール

Slide 23

Slide 23 text

Docker Registry GitOpsとは k8sを前提としたGitを中⼼に据えたCI/CD⼿法 • SingleSourceofTruthとして、サービスの状態を1つのGitリポジトリで持つ • 関⼼ (CI/CD) の分離 • 権限の分離 23 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) アプリソースコード CIツール CDツール CD CI

Slide 24

Slide 24 text

Docker Registry GitOpsとは k8sを前提としたGitを中⼼に据えたCI/CD⼿法 • SingleSourceofTruthとして、サービスの状態を1つのGitリポジトリで持つ • 関⼼ (CI/CD) の分離 • 権限の分離 24 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) アプリソースコード CIツール CDツール デプロイ実⾏

Slide 25

Slide 25 text

Docker Registry GitOpsの全体像 25 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) デプロイ実⾏(PR承認) 運⽤者(Ops) アプリソースコード CIツール CDツール 1. コードをPush version: 2.1 ⼿動 ⾃動

Slide 26

Slide 26 text

Docker Registry GitOpsの全体像 26 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) デプロイ実⾏(PR承認) 運⽤者(Ops) アプリソースコード CIツール CDツール 2. CI動作開始 version: 2.1 ⼿動 ⾃動

Slide 27

Slide 27 text

Docker Registry GitOpsの全体像 27 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) デプロイ実⾏(PR承認) 運⽤者(Ops) アプリソースコード CIツール CDツール 2.1. ビルド・テスト version: 2.1 ⼿動 ⾃動

Slide 28

Slide 28 text

Docker Registry GitOpsの全体像 28 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) デプロイ実⾏(PR承認) 運⽤者(Ops) アプリソースコード CIツール CDツール 2.2. ビルド成果物 をアップロード version: 2.1 ⼿動 ⾃動

Slide 29

Slide 29 text

Docker Registry GitOpsの全体像 29 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) デプロイ実⾏(PR承認) 運⽤者(Ops) アプリソースコード CIツール CDツール 2.3. 更新を反映する PRを作成 version: 2.1 ⼿動 ⾃動

Slide 30

Slide 30 text

デプロイ要求PullRequestの例 30 • アプリAを1つ • バージョンは2.1で • アプリBを4つ • ⾃動でスケールして欲しい • ロードバランサが必要 • アプリAを1つ • バージョンは2.2で • アプリBを4つ • ⾃動でスケールして欲しい • ロードバランサが必要 更新前 更新後 ※実際にはManifestに含まれるDockerImageタグの更新

Slide 31

Slide 31 text

Docker Registry GitOpsの全体像 31 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) デプロイ実⾏(PR承認) 運⽤者(Ops) アプリソースコード CIツール CDツール 3. End-to-Endテスト version: 2.1 ⼿動 ⾃動

Slide 32

Slide 32 text

Docker Registry GitOpsの全体像 32 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) デプロイ実⾏(PR承認) 運⽤者(Ops) アプリソースコード CIツール CDツール 4. 更新を確認・承認 version: 2.1 ⼿動 ⾃動

Slide 33

Slide 33 text

Docker Registry GitOpsの全体像 33 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) デプロイ実⾏(PR承認) 運⽤者(Ops) アプリソースコード CIツール CDツール 5. SSoTが更新 version: 2.1 ⼿動 ⾃動

Slide 34

Slide 34 text

Docker Registry GitOpsの全体像 34 SingleSourceofTruth (Manifestファイル群) アプリの更新 デ プ ロ イ要 求 (PR作 成 ) Hook アプリイメージ更新 開発者(Dev) デプロイ実⾏(PR承認) 運⽤者(Ops) アプリソースコード CIツール CDツール 6. SSoTの更新を検知・反映 version: 2.2 ⼿動 ⾃動

Slide 35

Slide 35 text

GitOpsの全体像 SingleSourceofTruthとして、サービスの状態を1つのGitリポジトリで持つ • コードベースでリソース管理できるk8sと相性⭕ CIとCDの分離 • CI • テストやビルドに注⼒ • Push型 • 実⾏環境への権限は不要 • CD • デプロイに注⼒ • Pull型 • ⾃⾝の実⾏環境への権限のみ持つ 35 apiVersion: apps/v1 kind: Deployment metadata: labels: app: debugkit name: debugkit spec: replicas: 1 selector: matchLabels: app: debugkit template: metadata: labels: app: debugkit spec: containers: - image: amaya382/k8s-debugkit name: k8s-debugkit YAML形式

Slide 36

Slide 36 text

GitOpsの全体像 SingleSourceofTruthとして、サービスの状態を1つのGitリポジトリで持つ • コードベースでリソース管理できるk8sと相性 CIとCDの分離 • CI • テストやビルドに注⼒ • Push型 • 実⾏環境への権限は不要 • CD • デプロイに注⼒ • Pull型 • ⾃⾝の実⾏環境への権限のみ持つ 36 CD CI

Slide 37

Slide 37 text

まとめ k8sを前提としたGitを中⼼に据えたCI/CD⼿法 特徴 • SingleSourceofTruthとして、デプロイ状態を1つのGitリポジトリで管理 • 関⼼ (CI/CD) の分離 得られるもの • ストレスフリーな爆速デプロイ • アジャイル • 全ての設定をコード化、Gitで管理 • 属⼈化したHackを防ぐ • Gitリポジトリの状態 == デプロイの状態 • 開発だけでなく、運⽤作業もGitの操作で統⼀ • 適切な関⼼の分離 • 権限の分離 • セキュリティリスクの抑制 37 運⽤者(Ops) 開発者(Dev)