Kubernetes で実践するクラウドネイティブ DevOps / Cloud Native DevOps with Kubernetes (DevOps, CloudNative and GitOps)

Kubernetes で実践するクラウドネイティブ DevOps / Cloud Native DevOps with Kubernetes (DevOps, CloudNative and GitOps)

コンテナと Kubernetes の到来によりソフトウェアをデプロイおよび運用する方法は大きく変わりました。ソフトウェアはコンテナ化された分散システムとなり、Kubernetes(または類似の基盤)の上で自動化を通じて動的に管理されるものになっています。そうしたアプリケーションを開発し、本番(プロダクション)に高頻度でデプロイしながらも安定した運用を実現することが今求められています。

本セッションでは Kubernetes でのアプリケーションの開発、デプロイにおける継続的インテグレーションや継続的デプロイから、運用、監視におけるメトリクスやオブザーバビリティまで DevOps のプラクティスを実践する方法と具体的に利用できるツールを紹介します。

OpenShift Meetup Tokyo #9 - DevOps/GitOps編 (2020/5/29) https://openshift.connpass.com/event/174426/

9f9df80ab6551776b49c4ad9432ba1b7?s=128

Kazuki Suda

May 29, 2020
Tweet

Transcript

  1. 1.
  2. 2.

    @superbrothers Kazuki Suda / @superbrothers ▶ ソフトウェアエンジニア ▶ Kubernetes Meetup

    Tokyo, Prometheus Meetup Tokyo ほか、共同主催者 ▶ CNCF Ambassador ▶ 「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書 ▶ 「⼊⾨ Prometheus」、「Kubernetes で実践するクラウドネイティブ DevOps」監訳書 2
  3. 6.

    @superbrothers 旧来の開発と運⽤ ▶ ソフトウェアの開発と運⽤は本質的に2種類の異なる仕事 + 開発者(Dev)の職責: ソフトウェアを実装する + 運⽤者(Ops)の職責: 現実のユーザがソフトウェアを利⽤できるようにする

    ▶ 2つの部⾨は⽬標や動機が⼤きく異なっており、対⽴することが少なくない + 開発者(Dev)の⽬標: 新しい機能をできるだけ早くリリースしたい + 運⽤者(Ops)の⽬標: サービスの⻑期的な安定性や信頼性を実現したい 6
  4. 7.

    @superbrothers DevOps の夜明け ▶ クラウドの登場 + システムの運⽤に必要となる専⾨事項をシステムの設計、アーキテクチャ、実装から切り離し て考えることが容易ではなくなってきた ▶ システムは⾃分のソフトウェアだけでは成り⽴たない

    + クラウドサービス、ネットワークリソース、ロードバランサ、ファイアウォール、DNS など幅 広い要素で構成される上、これらすべてが緊密に相互作⽤され、相互に依存し合っている いかに早く成果をユーザに届けフィードバックを得られるかがビジネスの成功を左右する。 ⼀⽅で、ユーザは信頼性の⾼い安定したサービス提供で望んでいる。 7
  5. 9.

    @superbrothers DevOps がもたらすもの ⾼い品質を確保しつつ、システムへの変更をコミットしてから通常の運⽤に移るまでの時間を 短縮することを⽬的とした⼀連のプラクティス ▶ ⾃動化・セルフサービス化された信頼性の⾼いインフラやツール ▶ 開発から運⽤までエンドツーエンドで⽀える CI/CD

    パイプライン ▶ 継続的な学びや素早いリカバリにつながるフィードバックループ ▶ モダンな開発⼿法をインフラに取り⼊れた Infrastructure as Code ▶ 開発者のコードがインフラにおよぼす影響の把握 ▶ 本番環境におけるモニタリングやトラブルシューティング 9
  6. 10.

    @superbrothers クラウドネイティブ / Cloud Native クラウドネイティブ技術は、パブリッククラウド、プライベートクラウド、ハイブリッドクラウド などの近代的でダイナミックな環境において、スケーラブルなアプリケーションを構築および実⾏ するための能⼒を組織にもたらします。 このアプローチの代表例に、コンテナ、サービスメッ シュ、マイクロサービス、イミュータブルインフラストラクチャ、および宣⾔型APIがあります。

    これらの⼿法により、回復性、管理⼒、および可観測性のある疎結合システムが実現します。 これ らを堅牢な⾃動化と組み合わせることで、エンジニアはインパクトのある変更を最⼩限の労⼒で頻 繁かつ予測どおりに⾏うことができます。 Cloud Native Computing Foundationは、オープンソースでベンダー中⽴プロジェクトのエコシステ ムを育成・維持して、このパラダイムの採⽤を促進したいと考えてます。 私たちは最先端のパター ンを⺠主化し、これらのイノベーションを誰もが利⽤できるようにします。 10 “ CNCF Cloud Native Definition v1.0 / https://github.com/cncf/toc/blob/master/DEFINITION.md
  7. 11.

    @superbrothers こういった専⾨⽤語の例に漏れず⼈により定義は異なるが、ほとんどの⼈に同意してもらえるだろう クラウドネイティブなシステムの特性は次のとおりです。 11 ⾃動化可能 アプリケーションを⼈間の代わりにマシン、ソフトウェアによってデプロイおよび管理する ポータブル ディスクなどの物理リソースやマシンに関する詳細な知識から切り離すことで、 マシンやクラスタ間、さらにはクラウド間で容易に移動できる 分散化

    コードを単⼀のエンティティ(モノリスと呼ばれます)としてデプロイする代わりに、協調して動作す る複数の分散化されたマイクロサービスから構成される傾向がある スケーラブル 分散化されたアプリケーションは、冗⻑性や優雅な劣化(グレースフル・デグラデーション)を通じて ⾼度な可⽤性を実現する ダイナミック コピーを数多く実⾏して⾼可⽤性を実現することや、ローリングアップデートを実施して、 トラフィックを取りこぼすことなくサービスを円滑にアップグレードできる 観測可能 分散システムの性質上、プロファイリングやデバッグが難しくなるため、オブザーバビリティ (可観測性)が重要な要件になる クラウドネイティブとは! インパクトのある変更を最小限の労力で頻繁かつ予測どおりに行い、 開発した成果をできる限り早く本番に届け、かつ安定した運用を実現するため!
  8. 13.

    @superbrothers ”Kubernetes で実践する”クラウドネイティブ DevOps ▶ GitOps: クラウドネイティブな継続的デリバリ ▶ 頻繁なデプロイに耐えうるワークロードの実⾏ ▶

    オブザーバビリティ: アプリケーション、インフラを観測可能にする 13 このセッションでは3つのトピックをお話したかったんですが、 GitOps だけになっちゃいました;; クラウドネイティブという新たな世界における
 DevOps の実践
  9. 15.

    @superbrothers GitOps とは 継続デリバリの⼿法の1つで宣⾔型なインフラとアプリケーションの信頼できる情報源 (source of truth)として Git を使⽤し、Git に加えられた変更からインフラ、アプリケーションの

    更新を検出して展開する 15 短いサイクルでソフトウェアを開発し、最新バージョンがすぐにでも
 リリース可能な状態を維持する手法です Git オーケストレータ オーケストレータ側からGit の変更を監視して
 自身に適用する「プルモデル」を採用することが特徴のひとつ! プル
  10. 17.

    @superbrothers GitOps を Kubernetes で実践する 1. Git リポジトリに Kubernetes リソース設定(マニフェストファイル)の全てを格納する

    2. Git リポジトリの更新は(必要なら)プルリクエストを通じて⾏う 3. ⼀度 Git リポジトリが更新されたら直ちに⾃動的にクラスタに変更を適⽤する 4. リポジトリに格納された現在の状態が望ましい状態と⼀致していない場合、 望ましい状態に⼀致するように正すか、GitOps ツールがアラートで通知する 17 コンフィグ repo もう少しはっきりいうと!
  11. 18.

    @superbrothers GitOps の CI/CD パイプライン 18 CI コード repo コンフィグ

    repo イメージ レジストリ 継続的インテグレーション(CI) 継続的デリバリ(CD) 開発者
  12. 19.

    @superbrothers GitOps の開発者(Dev)への恩恵 Git を⽤いたソフトウェア開発プロセスによるインフラの管理 ▶ Infrastructure-as-Code ▶ セルフサービス ▶

    コードレビュー ▶ プルリクエスト / マージリクエスト 19 コンフィグ repo 開発者 ソフトウェア開発のノウハウを取り込める! レビュア
  13. 20.

    @superbrothers 予測可能な信頼性の⾼いシステムの構築 ▶ 宣⾔的でイミュータブル ▶ 信頼できる情報源(source of truth) ▶ ロールバック

    ▶ 問題があった場合にいつ誰がどんな⽬的で加えた変更なのかを追跡できる GitOps の運⽤者(Ops)への恩恵 20 20 コンフィグ repo 運⽤者 ! 信頼できる情報源と 差分があることを アラートとして通知もできる ロールバックは以前のリビジョンに戻すだけ (ツール自体がロールバックに対応している場合もあります) git revert
  14. 21.

    @superbrothers GitOps と CIOps 旧来の CI システムからデプロイする CI/CD パイプラインは、「CIOps」と呼称され、 GitOps

    と⽐較して問題点が指摘されている。  CIOps は、CI システムはデプロイに必要なクレデンシャルを与える必要がある   GitOps は、プル型なのでクレデンシャルを外部に出すことがない  CIOps は、デプロイ先を管理する必要があるため、パイプラインが複雑になる   GitOps、デプロイ先となるシステム側からプルするのでスケールしやすい   21 CI RW CIOps RO GitOps
  15. 22.

    @superbrothers 代表的な GitOps ツール for Kubernetes 22 ツール 概要 主な開発

    ライセンス Flux GitOps を提供した Weaveworks 社が開発するシンプルな ツール。新しいコンテナイメージが利⽤可能になると マニフェストを更新する機能なども持つ。 CNCF Sandboxプロジェクト。 Weaveworks 社 Apache 2.0 Argo CD マルチテナントに対応し、複数のアプリケーションを管理で きる。Argo プロジェクトの1コンポーネントだが単体でも 使⽤できる。CNCF Incubating プロジェクト。 Intuit 社 Apache 2.0 Jenkins X イメージのビルドとプッシュといった CI ツールとしての 機能も持ち、開発サイクルのより広い範囲をカバーし、 プレビュー環境を⾃動で作成するなどの機能を持つ。 Continuous Delivery Foundation (CDF) プロジェクト。 Cloudbees 社 Apache 2.0
  16. 23.

    @superbrothers デモ / Flux・Get started 23 Get Started - Flux

    https://docs.fluxcd.io/en/latest/get-started/
  17. 25.

    @superbrothers 実践 GitOps 1. 環境管理 ・Namespace /クラスタ編 2. 環境管理・マニフェスト編 3.

    シークレット管理 4. Git 戦略 5. デプロイ戦略 6. セキュリティ 25
  18. 26.
  19. 27.

    @superbrothers マニフェストの環境差異をどのように管理するか 環境管理・マニフェスト編 27 ConfigMap Kubernetes の標準リソースで設定をアプリケーションから分離する。 Helm Kubernetes パッケージマネージャで、チャートというパッケージとしてアプリケーションを管理

    する。テンプレートからマニフェストを⽣成する。 Kustomize パッチなどを使⽤してマニフェストをカスタマイズするテンプレートフリーなツール。kubectl に ビルトインされてもいる。 Jsonnet JSONテンプレート⾔語。JSON を拡張し演算や関数、ライブラリ等が使えるようになっている。 Google が開発している。 Kpt Kubernetes パッケージツールで、設定をコード(テンプレートや DSL)ではなくデータとして扱 うことで⼈間とマシンの双⽅から扱いやすくしている。Google が開発している。 cbk8s AWS CDK の概念を適⽤し、TypeScript や Python といった使い慣れたプログラミング⾔語を使⽤ してマニフェストを⽣成する。頻出パターンをライブラリとして共有もできる。 最初からツールを手を出さずに
 ConfigMap でやっていくのがオススメ! いくつかの GitOps ツールは、
 これらのツールをネイティブでサポートしてます
  20. 28.

    @superbrothers シークレット管理の戦略 どこにどのように管理するか(場所、⽅法、ローテーション) ▶ ⼿動で Secret オブジェクトを作成し、クラスタに保存 ▶ データを暗号化してマニフェストとして Git

    リポジトリに保存 + github.com/mozilla/sops ▶ リモートの専⽤の機密情報管理ツールに保存 + Hashicorp Vault、Keywhiz、AWS Secrets Manager、Azure KeyVault、GCP Secret Manager + github.com/godaddy/kubernetes-external-secrets + github.com/GoogleCloudPlatform/berglas + github.com/kubernetes-sigs/secrets-store-csi-driver 28 ちなみに「Encrypting Secret Data at Rest」を使えば
 Kubernetes オブジェクトを保存時に暗号化できます!
  21. 29.

    @superbrothers Git 戦略 環境ごとにどのようにブランチを管理するか ▶ シングルブランチ(複数ディレクトリ) + master ブランチに全環境のマニフェストが格納されている +

    各環境の差分をパッチで管理できる kustomize が有効 ▶ マルチブランチ + 個々のブランチが各環境(開発や QA、本番など)に相当する + 複雑になりやすいが各環境への変更が容易にトラックできる 29 シングルブランチ戦略は GitHub flow, 
 マルチブランチ戦略は GitLab flow になるのかな? ソフトウェア開発のプラクティスですね! master stage production デプロイ デプロイ
  22. 30.

    @superbrothers Git 戦略 / コードとマニフェストでリポジトリを分ける ▶ GitOps ツールにコードを取得させる必要はない。セキュリティリスクになる。 ▶ デプロイに関連しないコミット履歴が監査上のノイズになる。

    ▶ ⼈間の権限の分離。コードの編集権限と本番へのデプロイ権限はしっかり分ける。 30 コード repo コンフィグ repo コード repo に含まれるマニフェストを
 コンフィグ repo に PR する運用はアリだと思います! 開発者 運⽤者
  23. 31.

    @superbrothers Git 戦略 / マイクロサービスとモノレポ マイクロサービスなアプリケーションの全体をどう管理するか ▶ それぞれのリポジトリで管理する + 個々のポリシーを柔軟に設定できる

    ▶ モノレポ: 1つのリポジトリの各ディレクトリで管理する + サービス全体の現在の状態が完全に把握できる + 統⼀されたポリシーを全体に確実に適⽤できる + 中央チームが必要になる 31 app-c app-b app-a app-c app-b app-a これもソフトウェア開発のソレですね。
  24. 32.

    @superbrothers デプロイ戦略 新しいバージョンをどのように展開するか 32 戦略 概要 Pros Cons ⼿段 ローリング

    アップデート 徐々に新しいバージョンに変えていく。 シンプルで簡単に利⽤可能 展開やロールバック に時間がかかる トラフィックの制御 はできない Deployment ブルーグリーン 現バージョン(ブルー) を落とさず、新バー ジョン(グリーン)をデプロイし、問題なけれ ばトラフィックを⼀気に切り替える。 短時間に展開、ロールバック できる 複数バージョンが混在しない ⼀時的に2倍の リソースが必要 Deployment + Service Flagger, Argo Rollouts カナリア 現バージョンを落とさずに新バージョンをデプ ロイするが、トラフィックを徐々に切り替え る。エラー率やパフォーマンスに問題があれば ロールバックする。 問題の影響が最⼩限のうちに ⾼速にロールバックできる 展開やロールバック に時間がかかる Flagger, Argo Rollouts プログレッシブ デリバリ 現バージョンを落とさずに新バージョンをデプ ロイしするが、⼀部のユーザにのみ届けられて 主要なメトリクスの値に問題があるときは⾃動 的にロールバックする。 問題の影響が最⼩限のうちに ⾼速に⾃動的にロールバック できる 展開やロールバック に時間がかかる Flagger, Argo Rollouts
  25. 33.

    @superbrothers DevSecOps? セキュリティを⾃動化して、環境全体とデータ、CI/CD プロセスを守る ▶ 権限管理 + Git リポジトリ +

    コンテナイメージレジストリ + Kubernetes RBAC ▶ シークレット管理 ▶ コンテナイメージスキャン + github.com/quay/clair、github.com/aquasecurity/trivy + GCR Vulnerability scanning、Amazon ECR イメージスキャン、Azure Security Center ▶ マニフェストのバリデーション + conftest、kubeval、Pod Security Policy、OpenPolicyAgent、Gatekeeper、Grafeas + Kritis CI 33 セキュリティ セキュリティをアプリケーション開発の隅々まで組み込む!
  26. 36.

    @superbrothers まとめ ▶ DevOps: 開発と運⽤がともに学び、システムの信頼性とソフトウェアの正確性に関する責任を 共有する⽂化であり、協⼒的な取り組み ▶ クラウドネイティブ: クラウドネイティブなシステムの特性は、「⾃動化可能で」「ポータブル で」、「分散化でき」「スケーラブルで」「ダイナミックで」「観測可能」

    + インパクトのある変更を最⼩限の労⼒で頻繁かつ予測どおりに⾏い、開発した成果をできる限 り早く本番に届け、かつ安定した運⽤を実現するため! ▶ GitOps: Gitを信頼できる情報源(source of truth)として、Git に加えられた変更からインフラ、 アプリケーションの更新を検出して展開する継続的デリバリの⼿法の1つ + メリットに、ソフトウェア開発プロセスによるインフラの管理や予測可能な信頼性の⾼いシス テムの構築が実現できることがある 36
  27. 39.

    @superbrothers そのほかのトピック ▶ コンテナと Kubernetes の基本的な使い⽅ ▶ Kubernetes 環境の選択 ▶

    サーバレスプラットフォームへの理解 ▶ Kubernetes リソースへの理解 ▶ Kubernetes クラスタのコスト最適化 ▶ Kubernetes クラスタの運⽤ ▶ Kubernetes のツール郡 ▶ Pod の⾼度なスケジューリング ▶ Kubernetes コントローラとオペレータ ▶ Kubernetes クラスタのバックアップ ▶ オブサーバビリティとメトリクス監視 39
  28. 41.

    @superbrothers 参考資料 ▶ GitOps - Operations by Pull Request https://www.weave.works/blog/gitops-operations-by-pull-request

    ▶ "GitOps": WeaveworksがCI/CD実践に使⽤する開発者モデルを公開 https://www.infoq.com/jp/news/2018/11/gitops-weaveworks/ ▶ GitOpsで絶対に避けて通れないブランチ戦略 - ⽔底 https://amaya382.hatenablog.jp/entry/2019/12/02/192159 ▶ Kubernetes anti-patterns: Let's do GitOps, not CIOps! https://www.weave.works/blog/kubernetes-anti-patterns-let-s-do-gitops-not-ciops ▶ DevOps チェックリスト - Azure Design Review Framework | Microsoft Docs https://docs.microsoft.com/ja-jp/azure/architecture/checklist/dev-ops ▶ Guide To GitOps https://www.weave.works/technologies/gitops/ ▶ Introducing Argo Flux - A Weaveworks-Intuit-AWS Collaboration https://www.weave.works/blog/argo-flux-join-forces ▶ Best Practices - Argo CD - Declarative GitOps CD for Kubernetes https://argoproj.github.io/argo-cd/user-guide/best_practices/#separating-config-vs- source-code-repositories ▶ 11 Reasons for Adopting GitOps https://blog.container-solutions.com/11-reasons-for-adopting-gitops ▶ Automate Progressive Deployments to Kubernetes with Flagger and Linkerd https://www.weave.works/blog/automate-progressive-deployments-to- kubernetes-with-flagger-and-linkerd ▶ Six Strategies for Application Deployment ‒ The New Stack https://thenewstack.io/deployment-strategies/ 41