
始める前に
- ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
- ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
- 画面左上の [ラボを開始] をクリックして開始します
Create Pods and services to test DNS resolution
/ 10
Deploy a sample workload and a ClusterIP service
/ 10
Convert the service to use NodePort
/ 20
Create static public IP addresses using GCP Networking
/ 20
Deploy a new set of Pods and a LoadBalancer service
/ 20
Deploy an Ingress resource
/ 20
このラボでは、Pod の Deployment を 2 つ作成し、Ingress リソースを含む 3 種類の Service を操作します。また、GKE 内の Kubernetes Service に Google Cloud ネットワーク ロードバランサを関連付ける方法を学習します。
このラボでは、次のタスクの実行方法について学びます。
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
Qwiklabs にシークレット ウィンドウでログインします。
ラボのアクセス時間(例: 1:15:00
)に注意し、時間内に完了できるようにしてください。
一時停止機能はありません。必要な場合はやり直せますが、最初からになります。
準備ができたら、[ラボを開始] をクリックします。
ラボの認証情報(ユーザー名とパスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。
[Google Console を開く] をクリックします。
[別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。
利用規約に同意し、再設定用のリソースページをスキップします。
最初のログイン手順を完了すると、プロジェクト ダッシュボードが表示されます。
このラボのほとんどの作業は Cloud Shell で行います。
プロビジョニングされると、Cloud Shell プロンプトが表示されます。
このタスクでは、ラボの GKE クラスタに接続し、クラスタ内の Pod セット用の Deployment マニフェストを作成した後、マニフェストを使って Pod 名と Service 名の DNS 解決をテストします。
dns-demo-1
と dns-demo-2
という 2 つのサンプル アプリケーション Pod を持つ dns-demo
という Service を作成します。
Kubernetes Service を介したネットワーク接続のテストに使用する Pod は、ソース リポジトリに用意されている dns-demo.yaml
マニフェスト ファイルを使ってデプロイされます。後でこれらの Pod を使用して、Kubernetes クラスタ内のシステムからさまざまな Service を経由する接続をテストします。
また、Cloud Shell を使用して、外部アドレスからの接続もテストします。Cloud Shell でこれを行えるのは、Cloud Shell が Kubernetes クラスタ ネットワークから完全に分離したネットワーク上にあるためです。
出力は次の例のようになります。
出力:
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
bash
へのインタラクティブなセッションを開きます。これで、クラスタ内のコンテナに入りました。以降のコマンドはこのコンテキストから実行されます。後のタスクでここからさまざまなターゲットに ping してネットワーク接続をテストしますが、コンテナに ping ツールがまだ入っていないため、まず ping
コマンドをインストールする必要があります。
apt-get
を更新し、ping
ツールをインストールします。この ping が成功すると、ターゲットの IP アドレスが先ほど確認した dns-demo-2
Pod のアドレスであることが確認できます。
dns-demo
Service の FQDN に ping します。この ping も成功しますが、2 つの demo-dns Pod のうち一方の FQDN からの応答が返されます。この Pod は、demo-dns-1
または demo-dns-2
のいずれかです。
アプリケーションをデプロイすると、アプリケーション コードはクラスタ内のコンテナで実行されるため、FQDN を使用して他の Service にアクセスできます。この方法は、IP アドレスや Pod 名を使用する方法よりシンプルです。IP アドレスや Pod 名は FQDN に比べて変更される可能性が高いためです。
このタスクでは、クラスタ内の Pod セット用の Deployment マニフェストを作成し、ClusterIP Service を使用して公開します。
このタスクでは、hello-v1.yaml
マニフェスト ファイル内にすでに作成されている次のマニフェストを使用して、ポート 8080 で HTTP サーバーをリッスンするサンプル ウェブ アプリケーションのコンテナ イメージをデプロイします。
2 つ目の Cloud Shell セッションが Cloud Shell ウィンドウに表示されます。メニューバーでセッションをクリックすると、セッションが切り替わります。
hello-v1.yaml
ファイルから Deployment を作成します。出力は次の例のようになります。
出力:
このタスクでは、すでに作成されている hello-svc.yaml
サンプル マニフェストを使用して、ClusterIP タイプの Service をデプロイします。
このマニフェストでは ClusterIP Service を定義し、セレクタに対応する Pod に適用します。この場合、デプロイした hello-v1 Pod にマニフェストが適用されます。この Service は、name: hello-v1
というラベルが付いた他の Deployment に自動的に適用されます。
実際の IP アドレスは出力例とは異なる場合があります。
出力:
この Service に外部 IP は割り当てられていません。Kubernetes クラスタの IP アドレスにはデフォルトでは外部からアクセスできないため、この Service を作成しても、クラスタの外部からはアプリケーションにアクセスできません。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
この Service はクラスタの外部に公開されていないため、接続は失敗します。
出力:
dns-demo-1
Pod 上で実行されているインタラクティブな shell を使用してクラスタ内から Service をテストします。
dns-demo-1
Pod の stdin と stdout に対応しています。curl
をインストールします。この接続は成功し、以下の出力のような応答が返されます。実際のホスト名は出力例とは異なる場合があります。
出力:
Kubernetes Engine クラスタの内部 DNS を使用して ClusterIP を解決できるため、正常に接続されます。
このタスクでは、既存の ClusterIP Service を NodePort Service に変換し、クラスタの内部と外部から Service へのアクセスを再テストします。
Service のタイプを NodePort に変更する hello-nodeport-svc.yaml
というファイル(hello-svc.yaml ファイルの変更バージョン)がすでに作成されています。
hello-svc
の Service タイプを NodePort に変更するマニフェストをデプロイします。このマニフェストでは、hello-svc
を NodePort Service として再定義し、その Service のクラスタの各ノードにポート 30100 を割り当てます。
実際の IP アドレスは出力例とは異なる場合があります。
出力:
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
この Service はクラスタの外部に公開されていないため、接続は失敗します。
出力:
別の Pod から Service をテストします。
この接続は成功し、以下の出力のような応答が返されます。実際のホスト名は出力例とは異なる場合があります。
出力:
GKE クラスタの内部 DNS を使用して ClusterIP を解決できるため、正常に接続されます。
Google Cloud コンソールのナビゲーション メニューで、[ネットワーキング] > [VPC ネットワーク] > [IP アドレス] の順に移動します。
[静的外部アドレスを予約] をクリックします。
[名前] には「regional-loadbalancer
」と入力します。
その他のオプションを確認します。ただし、設定はデフォルトのままにします。デフォルトのタイプが [リージョン] であることに注意してください。
[予約] をクリックします。
regional-loadbalancer
という名前で予約した外部 IP アドレスをメモしておきます。後のタスクでこれを使用します。
[静的外部アドレスを予約] をクリックします。
[名前] に「global-ingress
」と入力します。
[タイプ] を [グローバル] に変更します。
その他の設定はデフォルトのままにします。
[予約] をクリックします。
global-ingress
という名前で予約した外部 IP アドレスをメモしておきます。後のタスクでこれを使用します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
2 つの Service を簡単に区別できるように、違うバージョンのアプリケーションを実行する Pod セットをデプロイします。その後、新しい Pod を LoadBalancer Service として公開し、クラスタの外部から Service にアクセスします。
hello-v2.yaml
という 2 つ目の Deployment マニフェストが作成されています。このマニフェストでは、ポート 8080 でサンプル hello アプリケーションのバージョン 2 を実行する新しい Deployment が作成されます。
hello-v2
Deployment を作成するマニフェストをデプロイします。出力は次の例のようになります。
出力:
このタスクでは、すでに作成されている hello-lb-svc.yaml
サンプル マニフェストを使用して、LoadBalancer Service をデプロイします。
sed コマンドを使用して、このロードバランサ yaml ファイル内のプレースホルダ アドレス 10.10.10.10 を、先ほどロードバランサ用に予約した静的アドレスに置き換えます。
引き続き 2 つ目の Cloud Shell ウィンドウを使用していることを確認してください。このウィンドウは、dns-test Pod の stdin と stdout には接続されていません。
Cloud Shell に次のコマンドを入力し、先ほど作成したリージョン静的 IP アドレスを環境変数の中に保存します。
Cloud Shell に次のコマンドを入力し、プレースホルダ アドレスをリージョン静的 IP アドレスに置き換えます。
loadBalancerIP
が、先ほど regional-loadbalancer
という名前で静的 IP アドレスを予約したときにメモしたアドレスと一致するはずです。
このマニフェストによって定義される LoadBalancer Service は、Google Cloud ネットワーク ロードバランサをデプロイし、外部からのアクセスを可能にします。この Service は、name: hello-v2
セレクタを持つ Pod にのみ適用されます。
実際の IP アドレスは出力例とは異なる場合があります。
出力:
regional-loadbalancer
という名前で予約したアドレスが、新しい LoadBalancer Service の外部 IP アドレスとして表示されることに注意してください。GKE 環境では、LoadBalancer Service 用の外部ロードバランサは Google Cloud ロードバランサを使用して実装され、作成に数分かかります。この外部 IP アドレスによって、クラスタの外部から Service にアクセスできるようになります。
1 つのターゲット プール バックエンドと 2 つのインスタンスを持つ TCP ロードバランサが表示されるはずです。
これはリージョン TCP ロードバランサで、先ほど regional-loadbalancer
という名前で予約した静的 IP アドレスを使用しているはずです。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
この Service 名はクラスタの外部に公開されていないため、接続は失敗します。
出力:
外部 IP アドレスがこのホスト名で登録されていないため、このような結果になります。
[external_IP]
は、Service の外部 IP アドレスに置き換えます。例:
LoadBalancer の外部 IP アドレスには Google Cloud の外部からアクセスできるため、今回の接続は失敗しません。
出力:
dns-demo-1
Pod の stdin と stdout に対応しています。この接続は成功し、以下の出力のような応答が返されます。実際のホスト名は出力例とは異なります。
出力:
内部 DNS 名は Pod 内で使用できます。また、外部 IP アドレスを使用して、クラスタの外部から同じバージョン 2 のアプリケーションにアクセスしていることを確認できます。
[external_IP]
は、Service の外部 IP アドレスに置き換えます。例:
出力:
外部 IP はクラスタ内で実行されている Pod の中からも使用可能で、同じバージョン 2 のアプリケーションから結果が返されます。
これで Cloud Shell のコマンド プロンプトに戻ります。
クラスタ内に hello アプリケーション用の 2 つの Service があります。1 つは NodePort Service を使用してバージョン 1.0 をホストしており、もう 1 つは LoadBalancer Service を使用してバージョン 2.0 をホストしています。ユーザーが入力した URL に基づいてトラフィックを両方の Service に転送する Ingress リソースをデプロイします。
Ingress は、外部 HTTP(S) トラフィックを内部 Service にルーティングするためのルールと構成の集合をカプセル化する Kubernetes リソースです。
GKE では、Ingress は Cloud Load Balancing を使用して実装されます。クラスタで Ingress リソースを作成すると、GKE では HTTP(S) ロードバランサが作成され、トラフィックをアプリケーションにルーティングするように構成されます。
Ingress リソースを構成する hello-ingress.yaml
というサンプル マニフェストがあらかじめ作成されています。
この構成ファイルでは、先ほどのステップで作成した global-ingress
静的 IP アドレスに関連付けられる Ingress リソースが定義されます。この Ingress リソースによって作成されるグローバル HTTP(S) ロードバランサは、入力されたパスに基づいてトラフィックをウェブサービスに転送します。
アノテーション kubernetes.io/ingress.global-static-ip-name
により、Ingress リソースが自身用の Google Cloud グローバル HTTP(S) ロードバランサの作成時に使用する予約済み IP アドレスの名前を指定できます。
このマニフェストをデプロイすると、Kubernetes によってクラスタに Ingress リソースが作成されます。また、クラスタで実行中の Ingress コントローラによって HTTP(S) ロードバランサが作成されます。このロードバランサにより、すべての外部 HTTP トラフィック(ポート 80)はウェブに公開済みの NodePort Service と LoadBalancer Service にルーティングされます。
Google Cloud コンソールで、[ネットワーキング] > [ネットワーク サービス] > [負荷分散] の順に移動します。今回は HTTP(S) ロードバランサも表示されるはずです。
名前をクリックして詳細ページを開きます。これがグローバル HTTP(S) ロードバランサであること、また先ほど global-ingress
という名前で予約した静的 IP アドレスを使用していることが示されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
出力の一部:
数分おきにコマンドを実行して、Ingress リソースの初期化が終了したかどうかを確認します。Google Cloud グローバル HTTP(S) ロードバランサの作成と初期化が完了していれば、外部 IP アドレスが表示されます。このアドレスは先ほど global-ingress
という名前で予約したグローバル静的 IP アドレスと一致します。
[external_IP]
は、Ingress リソースの外部 IP アドレスに置き換えます。URL パスに必ず /v1 を含めてください。例:
出力:
hello-ingress.yaml
の中で、バージョン 1 の URL は、バージョン 1 のアプリケーション Pod にトラフィックを転送する hello-svc
NodePort Service を参照するように構成されます。
[external_IP]
は、Ingress リソースの外部 IP アドレスに置き換えます。URL パスに必ず /v2 を含めてください。hello-ingress.yaml
の中で、バージョン 2 の URL は、バージョン 2 アプリケーション Pod にトラフィックを転送する hello-lb-svc
LoadBalancer Service を参照するように構成されます。
例:
出力:
今回はロードバランサが 2 つ表示されます。
1 つは hello-lb-svc
Service 用に最初に作成されたリージョン ロードバランサです。これは UID 形式の名前を持ち、TCP ポート 80 のトラフィックをクラスタノードに負荷分散するように構成されています。
もう 1 つは Ingress オブジェクト用に作成されたもので、Ingress の構成と一致するホストとパスのルールが含まれる完全な HTTP(S) ロードバランサです。名前には hello-ingress
が含まれます。
hello-ingress
が含まれるロードバランサをクリックします。Ingress リソース用に作成された Google Cloud グローバル HTTP(S) ロードバランサのプロトコル、ポート、パス、バックエンド サービスに関する要約情報が表示されます。
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。
このコンテンツは現在ご利用いただけません
利用可能になりましたら、メールでお知らせいたします
ありがとうございます。
利用可能になりましたら、メールでご連絡いたします
1 回に 1 つのラボ
既存のラボをすべて終了して、このラボを開始することを確認してください