あるコンテナの話 - Google Kubernetes Engine
Google Cloud Japan Team
※この投稿は米国時間 2021 年 7 月 28 日に、Google Cloud blog に投稿されたものの抄訳です。
Sam さん(システム管理者)と Erin さん(開発者)は、休憩用のカプセルベッドを販売する架空の会社「Mindful Containers」に勤務しています。ある日 Sam さんは、Erin さんが開発したアプリケーションがデプロイ中にクラッシュしたため彼女に見に来てもらいましたが、Erin さんのワークステーションではそのアプリケーションは正常に動作していました。二人はログを確認して、デバッグを行った結果、バージョンの不整合があることを見つけました。適切な依存関係が本番環境にインストールされていなかったのです。二人は一緒に、リスクのあるロールバックを実行した後、必要な依存関係をインストールすることにしましたが、これ以外で問題が起こらないようにしたいと考えました。そこで、Erin さんと Sam さんは使用中のすべてのコンテナについて、根本的な問題を徹底的に修正することにしました。
コンテナを選ぶ理由
コンテナはよく仮想マシン(VM)と比較されます。すでにご存じかもしれませんが、VM は Linux や Windows などのゲスト オペレーティング システムをホスト オペレーティング システム上で実行し、基盤となるハードウェアへの仮想アクセスを提供します。コンテナも仮想マシンと同様にライブラリや他の依存関係とアプリケーションをまとめてパッケージ化し、ソフトウェア サービスの実行用に独立した環境を提供します。ただし類似点はここまでで、コンテナは、以下の図に示すように、開発者と IT 運用チームがうまく連携できるように、多くのメリットを備えたさらに軽量なユニットを提供します。
コンテナでは、仮想マシン方式のようなハードウェア スタックの仮想化を行わず、オペレーティング システム レベルで仮想化して、複数のコンテナを OS カーネル上で直接実行します。そのため、コンテナは非常に軽量となります。OS カーネルを共有するため、OS 全体を起動する場合と比較して起動が非常に速く、ほんのわずかのメモリしか使用しません。
コンテナを利用すると、ポータビリティ、共有可能性、デプロイ速度、再利用性などさまざまな機能を強化できます。Erin さんと Sam さんにとってさらに重要なことに、コンテナを利用すると、「マシンレベルで生じる」問題を解決できます。
Kubernetes を選ぶ理由
実際のところ、Sam さんは Erin さん以外の開発者に対しても責任を担っています。
次の点でソフトウェアのロールアウトについて苦心しています。
ソフトウェアはすべてのマシンで正常に動作するか
正常に動作しない場合、どうすべきか
トラフィックが急増したらどうなるか(Sam さんは万一に備えてオーバー プロビジョニングすることにしています)
現在は多くのデベロッパーがアプリをコンテナ化しているため、Sam さんはデベロッパーが発送するすべてのコンテナをオーケストレーションする方法を改善する必要があります。その解決策が Kubernetes です。
Kubernetes の優れた点
Mindful Container チームは多数のサーバーを使用していました。そして、同じマシンで実行した場合に競合することが明らかなアプリケーションに基づいて、各サーバーで実行するアプリケーションを手動で決めていました。うまくいくときは、ソフトウェアのロールアウトになんらかのスクリプト システムを使用できましたが、多くの場合、各マシンに SSH 接続することが必要でした。現在はコンテナを利用することで分離を確保できるため、ほとんどの場合で、2 つのアプリケーションで同一マシンのリソースを公平に共有できることに確信を持てるようになりました。
また、Kubernetes を利用することで、アプリケーションを実行するマシンを決めるためのコントロール プレーンを導入できました。さらに、Kubernetes ではアプリケーションを単に静的に配置するのではなく、各マシンの状態を継続して監視できるうえ、実際に指定したことが生じるようにマシンの状態を調整できます。Kubernetes は、1 つのコントロール プレーンを使って、多数のノード上で実行できます。各ノードに kubelet と呼ばれるソフトウェアをインストールすると、kubelet からマスターノードに状態が報告されます。
仕組みは次のとおりです。
マスターノードがクラスタを制御します。
ワーカーノードが Pod を実行します。
Pod は一連のコンテナを保持しています。
Pod は、構成とハードウェアで許容される限り効率的にバイナリパックされます。
コントローラは、Pod が仕様に沿って動作するように予防対策を施します(調整ループ)。
すべてのコンポーネントを高可用性モードでデプロイし、複数のゾーンやデータセンターに分散できます。
Kubernetes は以下の機能に対応しており、マシンのフリートにわたってコンテナのオーケストレーションを行います。
コンテナのデプロイとレプリケーションの自動化
コンテナのオンラインでのスケールインとスケールアウト
複数のコンテナ グループにわたる負荷分散
アプリケーション コンテナのローリング アップグレード
失敗したコンテナの自動再スケジュール(コンテナ インスタンスの自己修復)による復元性
クラスタ外のシステムに対するネットワーク ポートの公開の制御
Kubernetes について知っておくべきことが他にもいくつかあります。
ユーザーは手動で操作するのではなく、自動操作をプログラムします。目的の状態を宣言すると、Kubernetes がそれを実現して、その状態を維持します。
元々、Kubernetes は、データセンターを効率的に稼働するために Google のツールに基づいて設計されました。
Kubernetes は前例のないコミュニティ アクティビティを実現し、現在は GitHub で最大規模のプロジェクトとなっています。Google は変わらずトップのコントリビューターです。
Kubernetes の魔法が力を発揮され始めるのは、システム管理者に意思決定させる仕組みをなくしたときです。代わりに、ビルドとデプロイのパイプラインを実現します。ビルドが成功して、すべてのテストに合格し、承認されると、そのビルドを段階的、Blue / Green、または即時の方法で、クラスタに自動的にデプロイできます。
Kubernetes The Hard Way
Kubernetes(K8s)を使用する際の最大で唯一の障害とは、まちがいなく、独自のクラスタをインストールして管理する方法の習得でしょう。チュートリアルの「Kubernetes The Hard Way」が用意されていますので、これを K8s クラスタをインストールする際の手順ガイドとしてご利用ください。検討すべきタスクとしては、次のようなものがあります。
クラウド プロバイダかベアメタルかの選択
マシンのプロビジョニング
OS とコンテナ ランタイムの選択
ネットワークの構成(Pod の P の範囲、SDN、LB など)
セキュリティの設定(証明書の生成、暗号化の構成など)
DNS、ロギング、モニタリングといったクラスタ サービスの起動
これらすべてを整えると、K8s の使用を開始して、最初のアプリケーションをデプロイできます。ここまでくればかなりの達成感です。また、K8s の素晴らしさを実感していただけるでしょう。ただし、更新のロールアウトは行わなくてはなりません...?
Mindful Containers では、1 回クリックするだけでクラスタを起動し、すべてのクラスタとワークロードを 1 つの画面で確認できるようになりました。そして、Google がクラスタを継続的に管理して、スケーリングや正常性の維持を行います。素晴らしいことです。
GKE とは
Google Kubernetes Engine(GKE)は、安全なフルマネージド Kubernetes サービスです。Google のインフラストラクチャを使用して、コンテナ化されたアプリケーションのデプロイ、管理、スケーリングを行える使いやすい環境を提供します。
Mindful Containers は、GKE を使用して、デベロッパーとソフトウェアにリリース能力を委ねることで、セルフサービスの開発を実現することにしました。
GKE を選ぶ理由
本番環境に対応しており、人による操作が不要な Autopilot の運用モードを備えている
ファースト パーティとサードパーティのツールに対して安定したサポートを提供する最高水準のデベロッパー ツール
独自の BeyondProd セキュリティ アプローチを使用するコンテナ ネイティブのネットワーキングを提供
最もスケーラブルな Kubernetes サービス: 15,000 のノードクラスタを実行できるのは GKE のみ(最大 15 倍の並外れた競争力)
Kubernetes API、4 方向自動スケーリング、リリース チャンネル、マルチクラスタのフルサポートを実装するフルマネージドの Kubernetes サービスを業界で初めて提供
GKE の仕組み
GKE コントロール プレーンは、Google SRE(サイト信頼性エンジニアリング)チームが全面的に運用し、可用性の管理、セキュリティ パッチの適用、アップグレードを行います。Google SRE チームは、K8s の優れた運用知識を持っているだけでなく、数万ものクラスタの管理によって、発生しうる問題に対する分析情報を早期に得られるという独自の強みがあります。これは、セルフマネージドの K8s では実現不可能です。GKE は、自動プロビジョニング、セキュリティ パッチの適用、自動アップグレードの有効化、修復、スケーリングといった、ノードに対する包括的な管理も提供します。そのうえ GKE は、プライベート ネットワーキングやハイブリッド ネットワーキングといったエンドツーエンドのコンテナ セキュリティも提供します。
GKE によってスケーリングが簡単になる仕組み
Mindful Containers に対する需要が増すにつれ、同社ではサービスのスケーリングが必要になってきました。可用性と信頼性を高めるために Kubernetes クラスタを手動でスケーリングすることは、複雑で時間がかかる可能性があります。GKE は、サービスのリソース使用量に基づいて、Pod とノードの数を自動的にスケーリングします。
垂直 Pod オートスケーラー(VPA)によって、Deployment のリソース使用状況を監視し、リクエストされる CPU と RAM を調整してワークロードを安定させます。
ノード自動プロビジョニングによって、拡張バージョンのクラスタ自動スケーリングでクラスタ リソースを最適化します。
GKE が提供するフルマネージドのコントロール プレーンに加え、Autopilot の運用モードを使用することで、業界のベスト プラクティスを自動的に適用して、すべてのノード管理操作の排除、クラスタの効率の最大化、より強固なセキュリティ体制を実現できます。
まとめ
Mindful Containers は、VM → コンテナ → セルフマネージドの Kubernetes → GKE のように移行しましたが、同じように長い道を経る必要はありません。GKE から始めれば、コンテナや Kubernetes クラスタを自分で管理する時間と労力を節約できます。Kubernetes における Google のリーダーシップ、そしてデベロッパーの生産性、リソースの効率性、自動運用における Google の最新イノベーションを活用することによって、製品化までの時間を短縮できると同時にインフラストラクチャの費用を削減できます。そうすれば、ビジネスの速度、スケール、セキュリティ、可用性のニーズを簡単に管理して解決できます。GKE の詳細については、ドキュメントをご覧ください。
Kubernetes に関する実践経験を得ることに関心をお持ちの場合は、Google のスキル チャレンジの Kubernetes トラックにご参加ください。登録すると、30 日間無料でラボを利用でき、完了時には Google Cloud のスキルバッジを獲得できます。
#GCPSketchnote をさらにご覧になるには、GitHub リポジトリをフォローしてください。同様のクラウド コンテンツについては、Twitter で @pvergadia をフォローしてください。thecloudgirl.dev もぜひご覧ください。
-Google デベロッパー アドボケイト Priyanka Vergadia