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

GitOps_Kubernetes

capsmalt
April 26, 2019

 GitOps_Kubernetes

Presentation: GitOps Kubernetes
Speaker: Kazufumi Saito(@capsmalt), Soto Sugita(@sotoiwa)
Location: IBM Cloud Community Summit2019

capsmalt

April 26, 2019
Tweet

More Decks by capsmalt

Other Decks in Technology

Transcript

  1. IBM Cloud Community Summit 2019 Kazufumi Saito @capsmalt Soto Sugita

    @sotoiwa Kubernetesアプリケーション運⽤基礎
  2. @capsmalt 15 kubectl apply –f deploy-nginx.yaml Worker Node (OS: Ubuntu)

    レプリカ数を指定 (replicas: 2) nginx:1.15.12
  3. @capsmalt 16 kubectl apply –f deploy-nginx.yaml Worker Node (OS: Ubuntu)

    イメージタグ(バージョン)を変更 nginx:1.15.8
  4. @capsmalt 17 kubectl apply –f deploy-nginx.yaml Worker Node (OS: Ubuntu)

    イメージタグ(バージョン)を変更 nginx:1.15.8
  5. @capsmalt 18 Worker Node (OS: Ubuntu) Kubernetes 管理下のコンテナ環境 Worker Node

    (OS: Ubuntu) Worker Node (OS: Ubuntu) Kubernetes クラスター 複数Nodeで Kubernetesクラスターを構成 コンテナ 正確にはPodですが,説明簡略化のためコンテナとします。
  6. @capsmalt 19 Worker Node (OS: Ubuntu) Worker Node (OS: Ubuntu)

    Worker Node (OS: Ubuntu) Kubernetes クラスター あるコンテナに問題があれば,別Nodeで新コンテナとして動作 Kubernetes 管理下のコンテナ環境 コンテナ 正確にはPodですが,説明簡略化のためコンテナとします。
  7. @capsmalt 20 Worker Node (OS: Ubuntu) Worker Node (OS: Ubuntu)

    Worker Node (OS: Ubuntu) Kubernetes クラスター あるNodeに問題があれば,別Nodeで新コンテナとして動作 Kubernetes 管理下のコンテナ環境 コンテナ 正確にはPodですが,説明簡略化のためコンテナとします。
  8. @capsmalt 24 Worker Node (OS: Ubuntu) nginx:1.15.8 node:10.15.3 kubectl apply

    –f xxx.yaml Kubernetes クラスター上の アプリケーション や 構成 をリポジトリ管理する
  9. @capsmalt 25 Worker Node (OS: Ubuntu) nginx:1.15.8 node:10.15.3 kubectl apply

    –f xxx.yaml もしK8sクラスターが壊れても・・・
  10. @capsmalt 26 Worker Node (OS: Ubuntu) nginx:1.15.8 node:10.15.3 kubectl apply

    –f xxx.yaml リポジトリに “正しい構成” があるから, それを反映させればOK 復活︕
  11. @capsmalt 30 CI/CD Overview Code Build Test Release Unit Integration

    CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery
  12. @capsmalt 31 CI/CD Overview - Kubernetes Code Build Test Release

    Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery Dev, Stage Production
  13. @capsmalt 32 CI/CD Overview - Kubernetes Code Build Test Release

    Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml
  14. @capsmalt 33 CI/CD Overview - Kubernetes Code Unit Integration CI

    Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml CI Pipeline CD Pipeline Build Test Release CIツールが命令して 処理を流す(⾃動化) 例えば Jenkins CI と CD を両⽅やるケース (=CIOps)
  15. @capsmalt 34 CI/CD Overview - Kubernetes Code Unit Integration CI

    Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry CD のフェーズ
  16. @capsmalt 35 CI/CD Overview - Kubernetes Code Unit Integration CI

    Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry CD のフェーズ 打ちっぱなし ならOKな気がする
  17. @capsmalt 37 CI/CD Overview - Kubernetes Code Unit Integration CI

    Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry ・CIツール⽤のSecret(Registry) ・Service Accountにパッチ ・etc. クレデンシャル情報の管理 (セキュリティリスク)
  18. @capsmalt 38 CI/CD Overview - Kubernetes Code Unit Integration CI

    Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry 全てのデプロイ先を考慮した 設定やパイプラインが必要 デプロイ先ごとに異なるマニフェストファイルを作成して・・・ Dev2 たくさんのyaml
  19. @capsmalt 39 CI/CD Overview - Kubernetes Code Unit Integration CI

    Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry イマのK8sクラスターの状態は 本当にあるべき姿なのか︖ パイプラインの中で実⾏したマニフェストファイルはどれ︖︖ 誰かが勝⼿に kubectl set/edit/applyしてない︖︖ kubectl set xxx kubectl edit xxx 失敗 直接イメージ変更
  20. @capsmalt 41 What is GitOps ・「Weaveworks」社によって提唱された CD (Continuous Delivery) の⼿法

    ・アプリコードとマニフェストは別に管理する (CI と CD を分離) ・全てのオペレーションは,Gitで⾏う (Pull Requestを起点にする) ・Gitリポジトリ上のK8sマニフェストと実際のK8sクラスターの構成を⼀致させる (GitOps OperatorがK8sコントローラとして担う)
  21. @capsmalt 42 GitOps Overview - Kubernetes Code Build Test Release

    Unit Integration Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI マニフェストファイルのアプリ更新 (e.g. イメージタグ更新) PR K8sマニフェスト
  22. 44 デモ環境 Developer Travis CI App Repo IBM Cloud Container

    Registry IBM Cloud Kubernetes Service Manifest Repo Weave Flux GitHub Sync Build Commit Push Watch Pull
  23. 45 デモ① • Kubernetesクラスター上で動くチャットボットをGitOpsをつかってリリース - マニフェストは⼿動で更新することもできるが,⾃動化した⽅がベター - CIツールが⾃動的にマニフェストを更新してプルリクエストを作成 Cluster Developer

    CI Tool App Repo Image Registry 1. Pull Requestのマージ 2. イメージのビルドとPush Manifest Repo GitOps operator 3. Pull Requestの⾃動作成 5. イメージの デプロイ 4. マニフェストの更新の検知 6. Pull 4. Pull Requestのマージ
  24. 46 デモ② • GitOpsとChatOpsを使い,カナリアリリースを⾏う • カナリアリリースとは • 新しい機能を⼀部のユーザー(カナリア)へ先⾏してリリース • リリースのスピード感と,不具合による影響の低減を両⽴するためのリリース⽅法

    v1 v2 80% 20% ⼀定の割合のユーザーを 新しいバージョンへ振り分け v1 v2 特定のユーザーを 新しいバージョンへ振り分け Beta版テストに 同意したユーザーなど 今回のデモでは 振り分けにIstio を使ってます
  25. 47 デモ② • 評価が良ければ全体へ公開 • 問題が発⽣したらロールバック(カナリアをクローズ) Manifest Repo IBM Cloud

    Kubernetes Service GitOps Operator chatbot 1. 対応を bot と会話 2. botがリポ ジトリを更新 3. Operatorが クラスターを 更新 ChatOps GitOps 1. 対応を bot と会話
  26. 49 代表的なGitOpsツール • Weave Flux - helmに対応 - イメージの更新を検知する機能がある -

    削除には未対応 - どちらかと⾔えばクラスター全体の設定を管理するイメージ • Argo CD - Web UIがある - いろいろなフォーマットに対応 • helm,ksonnet,kustomizeなど - 削除にも対応 - どちらかといえば個々のアプリケーション単位で管理するイメージ • 他にも・・・ - Spinnaker,Jenkins X - kubectl diff,kubectl applyを使って⾃前スクリプトで実装することも可能
  27. 50 Cluster Weave FluxのAuto Deploy機能 • Weave Fluxがイメージレジストリを監視し,新しいイメージが登録されたら,⾃動的に クラスターにデプロイし,マニフェストも更新してリポジトリに登録する •

    アプリ毎に有効/無効が選択可能 Developer CI Tool App Repo Image Registry 1. Pull Requestのマージ 2. イメージのビルドとPush Manifest Repo Weave Flux 3. 新しいイメージの検知 5. イメージの デプロイ 4. マニフェストの更新 6. Pull
  28. 51 GipOpsをやる上での考慮点 • 使⽤するツールの選定 - Weave Flux,Argo CD,Jenkins X,SpinnakerなどのGitOpsツール -

    差分検知を⾏うkubediffや,kubectl applyを使って作り込むことも可能 • レプリカ数 - Horizontal Pod Autoscaler(HPA)を利⽤している場合は注意が必要 • 機密情報 - SecretをGit管理するのは適切ではない - SealedSecretやクラウドが提供するKMSを利⽤して保護する • リソースの削除や名前変更 - 削除には未対応 - GitOpsツールによって対応しているものもある - 変更できないリソースや属性に注意 - 名前を変えてしまうと重複してしまったり・・・ • 環境毎にブランチ/ディレクトリ/リポジトリをどのように分けるのか,リポジトリの運⽤とクラス ターへのデプロイ戦略をよく考える必要がある
  29. 54 ChatOpsの適⽤レベル 適⽤前︓ 臨機応変に直接, ⼈同⼠でコミュ ニケーション レベル1: Slackを使うよう になる。重⼤情 報専⽤のチャネ

    ルを作る。コラ ボレーション ツールで作業を 可視化するよう になる。 レベル2a︓ モニタリング ツールがコラボ レーションツー ルへ通知を⾏う ようになる • イベントの⾃動通 知,インシデント の解決時に通知 レベル2b: ⼿動でコラボ レーションツー ルからモニタリ ングツールの情 報を参照できる ようになる • 構成管理DB (CMDB)の検索, チケットシステム の検索,メトリッ クの検索 レベル3: コラボレーショ ンツール経由で モニタリング ツール同⼠が⾃ 動で連携するよ うになる • チケットやイベン トのステータスの 更新,runbookを実 ⾏して応答を表⽰ レベル4 Botが⼈間やツー ルとコラボレー ションツール内 でやり取りする ようになる • 会話をチケットシ ステムへ繋ぐ, キーワードをモニ ターして更新を返 す,ナレッジベー スの更新など レベル5︓ 認知機能のある 賢いBotになる • 履歴やナレッジを 元にした解決策の 提⽰を⾏う
  30. 55 ChatOpsとGitOpsのすすめ • ChatOpsとGitOpsは相性が良い - テキスト処理とGitリポジトリへの操作というお決まりのパターンの操作だけでアプリのデプロイや設定変更ができる • 普段アプリを開発しない⼈にもおすすめのチャットボット開発 - チャットのUIを利⽤するため,UIの開発の必要がなく,処理の内容に集中できる

    - チャットボットフレームワークを利⽤し,⾃動化したい処理⾃体はシェルスクリプトでも記載可能 • いろいろなところで動かせるチャットボット - Kubernetes上で動くPodとして - Serverless - Cloud FoundryやHerokuなどのPaaS - VMやベアメタル chatbot レンジャー
  31. 57 CKA/CKAD • Certified Kubernetes Administrator (CKA) 受験ログ - https://qiita.com/sotoiwa/items/3509ca3d18d1bed00dee

    • Certified Kubernetes Application Developer (CKAD) 受験ログ - https://qiita.com/sotoiwa/items/70cf93ebe2718a3be6b3
  32. 60 GitOps︓Kubernetesを使い始めて感じた悩み・・・ • Kubernetesでは1つのアプリをデプロイするのに⼤量の yaml(Kubernetesマニフェスト)が必要 • yamlを書いてkubectl applyしたけど,このyamlはどこで 管理しよう︖ •

    アプリのソースコードと⼀緒にyamlをGitリポジトリで管 理しよう︕ • CIツール(Jenkinsなど)からアプリをデプロイできるよ うにしよう︕ kind: PersistentVolume kind: PersistentVolumeClaim kind: ConfigMap kind: Secret kind: Ingress kind: Service kind: Deployment apiVersion: apps/v1 metadata: name: liberty spec: selector: matchLabels: app: liberty replicas: 1 ・・・
  33. 61 CIOps( ≠ GitOps)では解決しない悩み • CIツールが直接Kubernetesへアプリをデプロイする - だれかが⼿動で設定変更しているかもしれない - リポジトリのマニフェストがクラスターに適⽤済みかわからない

    →リポジトリのマニフェスト=クラスターの状態を保証できない - CIツールが強⼒な権限を持っていてセキュリティリスクとなる - マニフェストを少し変更しただけなのに,アプリのビルドが⾛る Developer CI Tool App & Manifest Repo Image Registry Cluster RW RO RW RO RW RW CI/CD
  34. 62 GitOps︓Weaveworks社が提唱するKubernetesにおけるContinuous Deliveryのプラクティス • CIとCDを分離する - アプリのリポジトリとマニフェストのリポジトリを分ける - GitOps operatorがリポジトリのマニフェストとクラスターの状態を⼀致させる(Gitリポジトリが正)

    - ⼿動/CIツールによるkubectl apply(アプリの変更)は⾏わない - 変更はGit上でPull requestオペレーションにより⾏う - CIツールはクラスターへのwrite権限を持たない - マニフェストの変更ではアプリのビルドは⾛らない Developer CI Tool App Repo Image Registry Cluster RW RO RW RO RW Manifest Repo RW GitOps operator RO RW CI CD
  35. 63 デモ準備 • Slack - #ise-devops-demoチャンネルを開く • ターミナル - Kialiをポートフォワードする

    - 正常リクエスト - エラーリクエスト - チャットボットリポジトリ - Webアプリリポジトリ • ブラウザ - Chromeをデフォルトブラウザにする - リポジトリ - Kialiをいい感じに表⽰しておく - Webアプリ開いとく