
Before you begin
- Labs create a Google Cloud project and resources for a fixed time
- Labs have a time limit and no pause feature. If you end the lab, you'll have to restart from the beginning.
- On the top left of your screen, click Start lab to begin
Scale Up Hello App
/ 30
Create node pool
/ 30
Managing a Regional Cluster
/ 20
Simulate Traffic
/ 20
Google Kubernetes Engine クラスタの基盤となるインフラストラクチャは、それぞれが Compute VM インスタンスであるノードで構成されます。このラボでは、クラスタのインフラストラクチャを最適化することで費用を抑え、アプリケーションのアーキテクチャをより効率的なものにする方法を説明します。
ワークロードの例に適切な構成のマシンタイプを選択することで、貴重なインフラストラクチャ リソースを最大限に活用する(そして、十分に活用されない事態を防ぐ)うえで役立つ戦略を学びます。使用するインフラストラクチャの種類だけでなく、インフラストラクチャの物理的な地理的位置も費用に影響します。この演習では、可用性の高いリージョン クラスタを管理するために費用対効果に優れた戦略を立てる方法を学習します。
このラボでは、次の方法について学びます。
こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。
このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウでリンクを開く] を選択します)。
ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
[ラボの詳細] パネルでも [ユーザー名] を確認できます。
[次へ] をクリックします。
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
[ラボの詳細] パネルでも [パスワード] を確認できます。
[次へ] をクリックします。
その後次のように進みます。
その後、このタブで Google Cloud コンソールが開きます。
このラボでは、小規模なクラスタを作成して使用します。クラスタのプロビジョニングには、2~5 分程度かかります。
[ラボを開始] ボタンを押した後で、青い文字の「resources being provisioned
」というメッセージと、読み込み中であることを意味する円アイコンが表示される場合は、クラスタがまだ作成中です。
この待ち時間の間に次の指示と説明を読み始めても構いませんが、リソースのプロビジョニングが完了するまではシェルコマンドを実行できません。
マシンタイプとは、システムメモリ サイズ、仮想 CPU(vCPU)数、永続ディスクの制限など、仮想マシン(VM)インスタンスで使用できる仮想ハードウェア リソースのセットのことです。マシンタイプはさまざまなワークロード向けにファミリー単位でグループ化され、キュレートされます。
ノードプールのマシンタイプを選択する場合、一般的に、汎用マシンタイプ ファミリーがさまざまなワークロードで優れたコスト パフォーマンスを発揮します。汎用マシンタイプは、N シリーズと E2 シリーズで構成されます。
マシンタイプの違いがアプリにとって有益なこともあれば、そうでないこともあります。一般的に、E2 は N1 に近いパフォーマンスを持っていますが、費用を重視して最適化されています。通常は E2 マシンタイプを使用するだけでも、費用を抑えられます。
ただし、クラスタの場合、使用するリソースがアプリケーションのニーズに基づいて最適化されることが特に重要です。大幅にスケールする必要がある大規模なアプリケーションまたは Deployment の場合、ワークロードを多数の汎用マシンに分散するよりも、少数の最適化されたマシンにスタックする方が費用を抑えられることもあります。
この意思決定を行うには、アプリについて十分に理解する必要があります。アプリに固有の要件がある場合は、それに合わせてマシンタイプを構成できます。
次のセクションでは、デモアプリに注目し、そのアプリを適切な構成のマシンタイプを使用するノードプールに移行します。
ラボの開始時に 2 つの e2-medium(vCPU x 2、メモリ 4GB)ノードを使用して Hello デモクラスタが生成されました。このクラスタは、Hello App という簡単なウェブ アプリケーションのレプリカを 1 つデプロイします。これは Go で記述されたウェブサーバーで、すべてのリクエストに「Hello, World!」メッセージで応答します。
[Kubernetes クラスタ] ウィンドウで [hello-demo-cluster] を選択します。
次のウィンドウで、[ノード] タブを選択します。
クラスタのノードの一覧が表示されます。
クラスタのリソースが GKE でどのように利用されているかを観察します。各ノードからリクエストされた CPU とメモリの量やノードにある割り当て可能な容量がわかります。
[Pod] セクションを見てください。hello-server
Pod が default
Namespace にあることがわかります。hello-server
Pod が表示されない場合は、前に戻ってクラスタの 2 番目のノードを選択します。
hello-server
Pod が 400 mCPU をリクエストしていることがわかります。他にも少数の kube-system
Pod が実行中であることが表示されます。これらは GKE のクラスタ サービス(モニタリングなど)を実行するために読み込まれた Pod です。
Hello-App
の 1 つのレプリカと基本的な kube-system
サービスを実行するには 2 つの e2-medium ノードが必要なことがわかります。また、クラスタの CPU リソースの大半が使用されていますが、割り当て可能なメモリは約 3 分の 1 しか使用されていません。
このアプリのワークロードがまったく変動しない場合は、必要な CPU とメモリの使用量も正確にわかるため、それに合わせてカスタマイズしたマシンタイプを作成することも可能でしょう。マシンタイプをそのようにカスタマイズできると、クラスタ インフラストラクチャ全体で費用を抑えられます。
しかし実際には、GKE クラスタの実行するワークロードは複数あることが多く、ほとんどの場合スケールアップやスケールダウンが必要です。
Hello App にスケールアップが必要な場合、どうすればよいでしょうか。
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。
gcloud
は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
[承認] をクリックします。
出力は次のようになります。
出力:
出力:
出力例:
gcloud
ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。
Hello-Server
をスケールアップします。[進行状況を確認] をクリックして、上記のタスクを実行したことを確認します。
hello-server
に「Does not have minimum availability」というエラー ステータスが表示されます。
Insufficient cpu
」と表示されます。これは予想どおりです。すでに説明したとおり、クラスタに CPU リソースの余裕がほとんどない状態で、hello-server
の別のレプリカでさらに 400m をリクエストしました。
続行するかどうかを確認するメッセージが表示されたら、「y
」と入力して Enter
キーを押します。
コンソールで、hello-server
ワークロードのステータスが「OK」に変わるまで、[ワークロード] ページを更新します。
ワークロードのスケールアップが正常に行われたら、クラスタの [ノード] タブに戻ります。
ノードプールが大きいほど処理の重いワークロードに対応できますが、インフラストラクチャ リソースの使用状況に注目してください。
GKE はクラスタのリソースを最大限に利用しますが、最適化の余地はまだあります。1 つのノードがメモリの大半を使用していますが、2 つのノードでは相当量のメモリが未使用です。
この時点でアプリのスケールアップを続けると、同じようなパターンが見え始めるでしょう。Kubernetes は hello-server
Deployment の新しいレプリカごとにノードを見つけようとしますが、使用できるノードがない場合、CPU が約 600m の新しいノードを作成します。
ビンパッキング問題とは、体積や形状にばらつきがある品目を、数に限りのある、形状の定まった「ビン(容器)」、つまりコンテナに収めなくてはならないという問題です。要するに、ある品目をできる限り少ない数のビンにいかにして効率よく「パッキング」するかという課題です。
これは、実行するアプリケーションに合わせて Kubernetes クラスタを最適化するときに直面する課題と似ています。複数のアプリケーションがあり、リソースの要件(メモリ、CPU など)がそれぞれで異なると仮定します。これらのアプリケーションは、Kubernetes によって管理されるインフラストラクチャ リソース(おそらくはクラスタの費用の大半が費やされる部分)にできる限り効率的に収める必要があります。
Hello デモクラスタは効率よくビンパッキングされていません。このワークロードにもっと適切なマシンタイプを使用するよう Kubernetes で構成すると、費用効率が向上するでしょう。
[進行状況を確認] をクリックして、上記のタスクを実行したことを確認します。
次の手順で Pod を新しいノードプールに移行できます。
node
)内のノードがスケジュール不可に設定されます。スケジュール不可に設定されると、Kubernetes はこれらのノードに新しい Pod をスケジュールしなくなります。node
)のノードで実行されているワークロードが正常に強制排除されます。この時点で、Pod が新しい larger-pool
というノードプールで実行されていることが確認できます。
y
」と入力して Enter
キーを押します。削除に 2 分ほどかかります。その間に次のセクションに目を通してください。
この時点で、3 つの e2-medium
マシンを必要とする同じワークロードを 1 つの e2-standard-2
マシンで実行しています。
そこで、E2 標準マシンタイプと E2 共有コア マシンタイプを使用する 1 時間あたりの費用に注目してみましょう。
標準:
共有コア:
3 つの e2-medium
マシンの費用は 1 時間あたり約 $0.1
ですが、1 つの e2-standard-2
は 1 時間あたり約 $0.067
です。
1 時間あたり $0.04
の削減は小さいと感じるかもしれませんが、実行するアプリケーションのライフサイクルの間、これがずっと積み重なります。もっと規模が大きければ、さらに目に見える違いがあるでしょう。e2-standard-2
マシンはこのワークロードをより効率よくパッキングできるので、未使用の領域が減り、スケールアップの費用が増えるペースが下がります。
これは興味深い事実です。というのも、E2-medium
は共有コア マシンタイプであり、リソースを大量に消費しない小規模なアプリケーションに優れた費用対効果を提供するためのものだからです。ところが、Hello-App
の現在のワークロードについては、より大きなマシンタイプでノードプールを使用することが、結果としてより費用対効果に優れた戦略となります。
Cloud コンソール で、hello-demo クラスタの [ノード] タブがまだ表示されているはずです。このタブを更新し、larger-pool
ノードの [リクエストされた CPU
] と [割り当て可能な CPU
] の各フィールドを確認します。
さらに最適化できる余地があることがわかります。この新しいノードは、別のノードをプロビジョニングしなくても、ワークロードの別のレプリカを含むことができます。またはこの場合でも、アプリケーションで必要とされる CPU とメモリの量に適合するカスタムサイズのマシンタイプを選択すると、さらにリソースの使用を抑えられる可能性があります。
リソースの価格はクラスタのロケーションによって異なることに留意する必要があります。このラボの次のセクションでは、最適なリージョンを選択し、リージョン クラスタを管理する方法を説明します。
クラスタのノードに使用される Compute Engine リソースは、世界各地の複数のロケーションでホストされています。これらのロケーションはリージョンとゾーンからなります。リージョンとは、リソースをホストできる特定の地理的なロケーションです。リージョンには 3 つ以上のゾーンがあります。
仮想マシン インスタンスやゾーン永続ディスクなど、ゾーンを有効範囲とするリソースはゾーンリソースと呼ばれます。静的外部 IP アドレスなど、それ以外のリソースはリージョン リソースです。リージョン リソースは、ゾーンに関係なく、そのリージョン内のどのリソースでも使用できますが、ゾーンリソースは同じゾーン内の他のリソースでのみ使用できます。
リージョンまたはゾーンを選択する場合、次のことに注意してください。
リージョンによる費用の差異はさまざまな要因に左右されます。たとえば、us-west2
リージョンのリソースは、us-central1
のリソースより高価になりがちです。
クラスタで使用するリージョンまたはゾーンを選択する場合は、アプリで実行される処理を確認します。レイテンシの影響を受けやすい本番環境では、ネットワークのレイテンシが短縮され、効率に優れるリージョンまたはゾーンにアプリを配置すると、パフォーマンスと費用の最適なバランスが得られるでしょう。
しかし、レイテンシの影響を受けにくい開発環境では、アプリを廉価なリージョンに配置することで費用を抑えられます。
GKE で使用できるクラスタのタイプには、ゾーン(シングルゾーンまたはマルチゾーン)とリージョンがあります。額面の料金では、シングルゾーンのクラスタが最も廉価です。しかし、アプリケーションに高い可用性を与えるには、クラスタのインフラストラクチャ リソースを複数のゾーンに分散するのが最適です。
多くのケースで、マルチゾーン クラスタまたはリージョン クラスタを使用してクラスタ内の可用性を優先させると、パフォーマンスと費用のバランスが最適なアーキテクチャになります。
複数のゾーンにまたがったクラスタのリソース管理は、やや複雑になります。注意を怠ると、Pod 間での不要なゾーン間通信によって余計な費用が積み重なる可能性があります。
このセクションでは、クラスタのネットワーク トラフィックを観察し、大量のトラフィックを相互に送っている通信量の多い 2 つの Pod を同じゾーンに移動します。
Pod とノードでやり取りされるトラフィックを実際に確認するため、リージョン クラスタ内で 2 つの Pod を別々のノードに作成します。モニタリングできるトラフィックを生成するために、ping
を使用して Pod 間でトラフィックを生成します。
[進行状況を確認] をクリックして、上記のタスクを実行したことを確認します。
作成した Pod は、node-hello
コンテナを使用し、リクエストされたときに Hello Kubernetes
メッセージを出力します。
作成した pod-2.yaml
ファイルを調べると、podAntiAffinity がルールとして定義されていることがわかります。これにより、この Pod は pod-1
と同じノードにスケジュールされないように指定されます。pod-1
の security: demo
ラベルに基づいて matchExpressions のロジックが適用されるためです。podAffinity は Pod が同じノードにスケジュールされるようにし、podAntiAffinity は Pod が同じノードにスケジュールされないようにします。
今回のケースでは、ノード間のトラフィックを可視化するのに podAntiAffinity を使用しますが、podAntiAffinity と podAffinity を賢く使用すれば、リージョン クラスタのリソースをさらに効率よく利用できます。
どちらの Pod も [Running
] ステータスと内部 IP を返します。
出力例:
pod-2
の IP アドレスをメモしておきます。これは次のコマンドで使用します。
pod-1
コンテナへのシェルを取得します。pod-2
に送信します。ここで [POD-2-IP] は、pod-2
のものとして表示された内部 IP アドレスに置き換えます。pod-1
から pod-2
への ping で発生する平均レイテンシをメモしておきます。
pod-1
から pod-2
に ping を実行するときに、クラスタが作成された VPC のサブネットで、トラフィックを観察するためにフローログを有効にすることができます。
default
サブネットを探してクリックします。画面の上部にある [編集] をクリックします。
[フローログ] で [オン] を選択します。
次に、[保存] をクリックします。
次に、[ログ エクスプローラでフローログを表示する] をクリックします。
ログのリストが表示され、いずれかのインスタンスで送信または受信があるたびに大量の情報が示されます。
ログが生成されない場合は、上記のスクリーンショットを参考にして、「vpc_flows」の前にある「/
」を「%2F
」に置き換えます。
このままでは少し読みづらいかもしれません。次に、このログを BigQuery テーブルに書き出して、関連情報をクエリできるようにします。
シンクに「FlowLogsSample
」という名前を付けます。
[次へ] をクリックします。
これ以外はそのままで構いません。
[シンクを作成] をクリックします。
新しく作成したデータセットを確認してみましょう。Cloud コンソールのナビゲーション メニューで、[分析] セクションの [BigQuery] をクリックします。
[完了] をクリックします。
プロジェクト名を選択してから us_flow_logs を選択し、新しく作成されたテーブルを表示します。テーブルが一切表示されていない場合は、作成されるまで画面を更新する必要があります。
us_flow_logs
データセットの下で compute_googleapis_com_vpc_flows_xxx
テーブルをクリックします。
[クエリ] > [新しいタブ] をクリックします。
BigQuery エディタで、SELECT
と FROM
の間に以下のコードを貼り付けます。
先ほどのフローログが、source zone
、source vm
、destination zone
、destination vm
でフィルタされて表示されます。
regional-demo
クラスタ内の 2 つのゾーン間で呼び出しが生成されている行を探します。
フローログを観察すると、異なるゾーン間で頻繁にトラフィックが発生することがわかります。
次に、Pod を同じゾーンに移動し、効果を観察してみましょう。
Cloud Shell に戻り、Ctrl+C キーを押して ping
コマンドをキャンセルします。
exit
コマンドを入力して pod-1
のシェルを終了します。
pod-2
のマニフェストを編集します。podAntiAffinity
ルールを podAffinity
ルールに変更しますが、ロジックは変更しません。これで pod-2
は、pod-1
と同じノードにスケジュールされます。
pod-2
を削除します。pod-2
が削除されたら、新しく編集したマニフェストを使用して再作成します。[進行状況を確認] をクリックして、上記のタスクを実行したことを確認します。
Running
」であることを確認します。出力を見ると、Pod-1
と Pod-2
が同じノードで実行されていることがわかります。
pod-2
の IP アドレスをメモしておきます。これは次のコマンドで使用します。
pod-1
コンテナへのシェルを取得します。pod-2
に送信します。ここで [POD-2-IP] は、先ほどのコマンドで取得した pod-2
の内部 IP に置き換えます。2 つの Pod でやり取りされる ping の平均時間が、かなり短くなったことがわかるでしょう。
この時点で、フローログの BigQuery データセットに戻り、最新のログをチェックして、望ましくないゾーン間通信がなくなったことを確認できます。
Google Cloud 内の VM 間外向きトラフィックの料金に注目します。
Pod が別々のゾーンから互いに ping を実行すると、1 GB あたり $0.01 の料金が課されます。少額だと思うかもしれませんが、複数のサービスがゾーン間で頻繁に呼び出しを行う大規模なクラスタであれば、たちまち費用がかさみます。
Pod を同じゾーンに移動したので、ping の実行に料金が発生しなくなりました。
ここでは、GKE クラスタの一部である仮想マシンの費用を最適化する方法について学習しました。まず、より適切なマシンタイプのノードプールにワークロードを移行し、次に、異なるリージョンの長所と短所について理解したうえで、最後に、リージョン クラスタ内の通信の多い Pod を通信先の Pod と同じゾーンに配置しました。
このラボでは、GKE VM 向けの費用対効果に優れたツールと戦略を紹介しましたが、仮想マシンを最適化するには、まずアプリケーションとそのニーズを理解する必要があります。実行するワークロードの種類を知り、アプリケーションのニーズを見積もると、GKE クラスタの基盤となる仮想マシンに最適なロケーションとマシンタイプはどれかの判断が変わってきます。
クラスタのインフラストラクチャを効率的に利用することは、費用の最適化に大いに役立ちます。
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2024 年 4 月 30 日
ラボの最終テスト日: 2024 年 4 月 30 日
Copyright 2025 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。
このコンテンツは現在ご利用いただけません
利用可能になりましたら、メールでお知らせいたします
ありがとうございます。
利用可能になりましたら、メールでご連絡いたします
One lab at a time
Confirm to end all existing labs and start this one