arrow_back

Kubernetes の基礎 v1.6

ログイン 参加
知識をテストして、コミュニティで共有しましょう
done
700 を超えるハンズオンラボ、スキルバッジ、コースへのアクセス

Kubernetes の基礎 v1.6

ラボ 3時間 universal_currency_alt クレジット: 5 show_chart 入門
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
知識をテストして、コミュニティで共有しましょう
done
700 を超えるハンズオンラボ、スキルバッジ、コースへのアクセス

概要

このラボでは、次の方法について学びます。

  • Google Kubernetes Engine を使用して Kubernetes クラスタをプロビジョニングする。
  • kubectl を使用して Docker コンテナをデプロイおよび管理する。
  • Kubernetes の Deployment とサービスを使用してアプリケーションをマイクロサービスに分割する。

Kubernetes Engine と Kubernetes API を使用して、アプリケーションをデプロイ、管理、アップグレードします。「app」という名前のアプリケーションを例として使用し、演習を行います。

設定

ステップ 1

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. Qwiklabs にシークレット ウィンドウでログインします。

  2. ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
    一時停止機能はありません。必要な場合はやり直せますが、最初からになります。

  3. 準備ができたら、[ラボを開始] をクリックします。

  4. ラボの認証情報(ユーザー名パスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。

  5. [Google Console を開く] をクリックします。

  6. [別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
    他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。

  7. 利用規約に同意し、再設定用のリソースページをスキップします。

ステップ 2

Cloud Platform Console で次の API が有効になっていることを確認します。

  • Kubernetes Engine API
  • Container Registry API


ナビゲーション メニューナビゲーション メニュー)で、[API とサービス] をクリックします。

下にスクロールして、目的の API が有効になっていることを確認します。

API が表示されていない場合は、上部にある [API とサービスの有効化] をクリックし、目的の API を見つけてプロジェクトで利用できるようにします。

ステップ 3

Google Cloud Shell の有効化

Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。

Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

    ハイライト表示された Cloud Shell アイコン

  2. [続行] をクリックします。

環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

Cloud Shell ターミナルでハイライト表示されたプロジェクト ID

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  • 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list

出力:

Credentialed accounts: - @.com (active)

出力例:

Credentialed accounts: - google1623327_student@qwiklabs.net
  • 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project =

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: gcloud ドキュメントの全文については、 gcloud CLI の概要ガイド をご覧ください。

ステップ 4

Git リポジトリからサンプルコードを入手します。

git clone https://github.com/googlecodelabs/orchestrate-with-kubernetes.git

ステップ 5

アプリケーションの構成を確認します。

cd orchestrate-with-kubernetes/kubernetes

ls

次の構造が表示されます。

deployments/

Deployment manifests

nginx/

nginx config files

pods/

pod manifests

services/

Services manifests

tls/

TLS certificates

cleanup.sh

Cleanup script

コードの用意ができたので、Kubernetes を使用してみます。

Kubernetes のクイックデモ

Kubernetes クラスタを起動する

ステップ 1

プロジェクトのデフォルトのゾーンを定義します。こうすることで、gcloud コマンドで --zone パラメータを指定する必要がなくなります。

gcloud config set compute/zone us-central1-a

Cloud Shell で次のコマンドを実行して、5 個のノードを実行する bootcamp という Kubernetes クラスタを起動します。

gcloud container clusters create bootcamp --num-nodes 5 --scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"

scopes の引数を指定することで、Project Hosting と、後で使用する Google Cloud Storage API にアクセスできるようになります。

[進捗状況を確認] をクリックして目的を確認します。 Kubernetes クラスタを作成する

ステップ 2

クラスタが作成されたら、kubectl version コマンドを使用して、インストール済みの Kubernetes のバージョンを確認します。

kubectl version

ステップ 3

kubectl cluster-info を使用して、クラスタの詳細な情報を確認します。

kubectl cluster-info

ステップ 4

Cloud Platform Console で実行中のノードを確認します。

[ナビゲーション メニュー] を開き、[Compute Engine] > [VM インスタンス] に移動します。

Bash 補完(省略可)

Kubernetes にはオートコンプリート機能が備わっています。kubectl completion コマンドと組み込みの source コマンドを使用して設定できます。

ステップ 1

次のコマンドを実行します。

source <(kubectl completion bash)

ステップ 2

Tab キーを押して、利用可能なコマンドのリストを表示します。

次の例を試します。

kubectl <TAB><TAB>

35350b93c86e21bc.png

コマンドの一部を入力して補完することもできます。

kubectl co<TAB><TAB>

439b36f031f3e4ed.png

この機能により、kubectl をより簡単に使用できます。

コンテナを実行およびデプロイする

Kubernetes を開始する最も簡単な方法は kubectl create deployment コマンドを使用することです。

ステップ 1

kubectl create deployment を使用して、nginx コンテナのインスタンスを 1 つ起動します。

kubectl create deployment nginx --image=nginx:1.10.0

ステップ 2

kubectl get pods コマンドを使用して、nginx コンテナを実行しているポッドを確認します。

kubectl get pods

ステップ 3

kubectl expose コマンドを使用して、nginx コンテナを Kubernetes の外部に公開します。

kubectl expose deployment nginx --port 80 --type LoadBalancer

ステップ 4

kubectl get コマンドを使用して、新しいサービスを確認します。

kubectl get services

外部 IP が表示されます。この外部 IP を使うと、リモートで nginx コンテナをテストしたりアクセスしたりできます。

ステップ 5

kubectl scale コマンドを使用して、サービスで実行中のバックエンド アプリケーション(ポッド)の数を増やします。

kubectl scale deployment nginx --replicas 3

これは、ウェブ アプリケーションの利用者数が増え、ワークロードを強化したい場合に便利です。

ステップ 6

もう一度ポッドを取得して、Kubernetes によってポッドの数が更新されていることを確認します。

kubectl get pods

ステップ 7

kubectl get services コマンドをもう一度使用して、外部 IP アドレスが変更されていないことを確認します。

kubectl get services

ステップ 8

curl コマンドで外部 IP アドレスを使用して、デモ アプリケーションをテストします。

curl http://<External IP>:80

Kubernetes では、kubectl runexposescale の各コマンドを使用した、事前設定が不要な簡単なワークフローに対応しています。

クリーンアップ

次のコマンドを実行して、nginx をクリーンアップします。

kubectl delete deployment nginx
kubectl delete service nginx

ここまで、Kubernetes について簡単に説明してきました。ここからは、各コンポーネントと抽象化について詳しく説明していきます。

ポッド

ポッドについて詳しく確認します。

ポッドを作成する

ポッドは、ポッド構成ファイルを使用して作成できます。

ステップ 1

kubectl explain コマンドを使用して、組み込みのポッドのドキュメントを確認します。

kubectl explain pods

ステップ 2

monolith ポッド構成ファイルを確認します。

cat pods/monolith.yaml

ステップ 3

kubectl explain コマンドで .spec オプションを使用して、API オブジェクトに関する詳細な情報を確認します。この例では、コンテナについて確認します。

kubectl explain pods.spec.containers

その他の API を確認してから続行します。

ステップ 4

kubectl create を使用して monolith ポッドを作成します。

kubectl create -f pods/monolith.yaml

[進捗状況を確認] をクリックして目的を確認します。 monolith ポッドを作成する

ステップ 5

kubectl get pods コマンドを使用して、デフォルトの名前空間で実行中のすべてのポッドを一覧表示します。

kubectl get pods

ステップ 6

ポッドの実行中に、kubectl describe コマンドを使用して monolith ポッドの詳細情報を取得します。

kubectl describe pods monolith

ポッドの IP アドレスやイベントログなど、monolith ポッドに関する多くの情報を確認できます。この情報はトラブルシューティングの際に役に立ちます。

このように、Kubernetes では、構成ファイルを使ってポッドを作成したり、実行中にポッドの情報を確認したりといった操作を簡単に行えます。この時点で、デプロイに必要なポッドをすべて作成できます。

ポッドの操作

デフォルトでは、ポッドにはプライベート IP アドレスが割り当てられており、クラスタの外部からはアクセスできません。そこで、kubectl port-forward コマンドを使用して、ローカルポートを monolith ポッド内のポートにマッピングします。

2 つのターミナルを使用します。1 つで kubectl port-forward コマンドを実行し、もう 1 つで curl コマンドを実行します。

ステップ 1

Cloud Shell の [+] ボタンをクリックして新しいターミナルを開きます。

d7448996c0310a94.png

ステップ 2

次のコマンドを実行して、ローカルポート 10080 からポッドのポート 80(このポートをコンテナがリッスンします)へのポート転送を設定します。

kubectl port-forward monolith 10080:80

ステップ 3

ポッドにアクセスするには、1 つ目のターミナル ウィンドウに戻り、次の curl コマンドを実行します。

curl http://127.0.0.1:10080

コンテナから「Hello」というメッセージが返されます。

ステップ 4

secure エンドポイントにアクセスするとどうなるかを確認します。

curl http://127.0.0.1:10080/secure

エラーが表示されます。

ステップ 5

ログインして、monolith から auth トークンを取得します。

curl -u user http://127.0.0.1:10080/login

ログイン プロンプトで、パスワードに「password」と入力してログインします。

ステップ 6

Cloud Shell は長い文字列のコピーをうまく処理できないため、トークンを環境変数にコピーします。

TOKEN=$(curl http://127.0.0.1:10080/login -u user|jq -r '.token')

ログイン プロンプトで、パスワードに「password」と入力してログインします。

ステップ 7

secure エンドポイントにもう一度アクセスします。今回は auth トークンを含めます。

curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:10080/secure

ステップ 8

kubectl logs コマンドを使用して、monolith ポッドのログを表示します。

kubectl logs monolith

ステップ 9

ターミナルをもう 1 つ開き、-f フラグを使用してログのストリームをリアルタイムで取得します。

3 つ目のターミナルを作成するには、Cloud Shell の [+] ボタンをクリックし、次のコマンドを実行します。

kubectl logs -f monolith

ステップ 10

ターミナル 1 で curl を使用して、monolith を操作します。ターミナル 3 でログが更新されるのを確認できます。

curl http://127.0.0.1:10080

ステップ 11

kubectl exec コマンドを使用して、monolith ポッド内で対話型シェルを実行します。これは、コンテナ内でトラブルシューティングを行う際に役に立つ場合があります。

kubectl exec monolith --stdin --tty -c monolith /bin/sh

ステップ 12

省略可: シェルで ping コマンドを使用して、外部との(外部に向けた)接続をテストできます。

ping -c 3 google.com

ステップ 13

シェルからログアウトします。

exit

このように、ポッドの操作は kubectl コマンドを使用するのと同じくらい簡単です。リモートでコンテナをテストしたり、ログインシェルを使用したりする必要がある場合、必要なものはすべて Kubernetes に用意されています。

ステップ 14

ターミナル 2 と 3 で kubectl port-forwardkubectl logs を終了するには、Ctrl+C キーを押します。

モニタリングとヘルスチェック

Kubernetes では、readiness プローブと liveness プローブを使用したアプリケーションのモニタリングに対応しています。ヘルスチェックは、ポッド内の各コンテナで実行できます。readiness プローブは、ポッドがトラフィックに対応する「準備ができている」ことを確認するためのもので、liveness プローブは、コンテナが「正常」であることを確認するためのものです。liveness プローブが複数回失敗すると、コンテナは再起動されます。liveness プローブの失敗が続くと、ポッドがクラッシュ ループに陥る原因となります。readiness のチェックが失敗した場合、コンテナは「準備ができていない」とマークされ、すべてのロードバランサから削除されます。

このラボでは、healthy-monolith という名前の新しいポッドをデプロイします。このポッドは、大部分は monolith ポッドに基づいており、readiness プローブと liveness プローブが追加されています。

このラボでは、次の方法について学びます。

  • readiness プローブと liveness プローブのあるポッドを作成します。

  • readiness プローブと liveness プローブが失敗する場合のトラブルシューティングを行います。

liveness プローブと readiness プローブのあるポッドを作成する

ステップ 1

healthy-monolith ポッド構成ファイルを確認します。

cat pods/healthy-monolith.yaml

ステップ 2

kubectl を使用して healthy-monolith ポッドを作成します。

kubectl create -f pods/healthy-monolith.yaml

[進捗状況を確認] をクリックして目的を確認します。 healthy-monolith ポッドを作成する

ステップ 3

readiness プローブから HTTP 200 のレスポンスが返されるまで、ポッドは「準備ができている」とマークされません。kubectl describe コマンドを使用して、healthy-monolith ポッドの詳細を確認します。

kubectl describe pod healthy-monolith

Readiness プローブ

readiness プローブが失敗した場合に Kubernetes がどのようなレスポンスを返すかを確認します。monolith コンテナは、readiness プローブと liveness プローブを強制的に失敗させることができます。これにより、healthy-monolith ポッドにおけるプローブの失敗をシミュレートできます。

ステップ 1

ターミナル 2 で kubectl port-forward コマンドを使用して、ローカルポートを healthy-monolith ポッドのヘルスチェック用ポートに転送します。

kubectl port-forward healthy-monolith 10081:81

ステップ 2

monolith コンテナの readiness プローブを強制的に失敗させます。ターミナル 1 で curl コマンドを使用して、readiness プローブのステータスを切り替えます。このコマンドには出力がない点に注意してください。

curl http://127.0.0.1:10081/readiness/status

ステップ 3

kubectl get pods -w コマンドを使用して、healthy-monolith ポッドのステータスを取得します。

kubectl get pods healthy-monolith -w

ステップ 4

0/1 ready containers とコンソールに表示されたら、Ctrl+C キーを押します。kubectl describe コマンドを使用して、失敗した readiness プローブに関する詳細な情報を確認します。

kubectl describe pods healthy-monolith

ステップ 5

healthy-monolith ポッドのイベントに、失敗した readiness プローブの詳細が表示されます。

monolith コンテナの readiness プローブを強制的に成功させるには、curl コマンドを使用して readiness プローブのステータスを切り替えます。

curl http://127.0.0.1:10081/readiness/status

ステップ 6

約 15 秒待ち、kubectl get pods コマンドを使用して healthy-monolith ポッドのステータスを取得します。

kubectl get pods healthy-monolith

ステップ 7

ターミナル 2 で Ctrl+C キーを押して、kubectl のプロキシ(port-forward)コマンドを閉じます。

liveness プローブ

前のチュートリアルで学んだ内容をもとに、kubectl port-forward コマンドと curl コマンドを使用して、monolith コンテナの liveness プローブを強制的に失敗させます。liveness プローブが失敗した場合に Kubernetes がどのようなレスポンスを返すかを確認します。

ステップ 1

kubectl port-forward コマンドを使用して、ローカルポートをターミナル 2 の healthy-monolith ポッドのヘルスチェック用ポートに転送します。

kubectl port-forward healthy-monolith 10081:81

ステップ 2

monolith コンテナの readiness プローブを強制的に成功させるには、もう 1 つのターミナルで curl コマンドを使用して readiness プローブのステータスを切り替えます。

curl http://127.0.0.1:10081/healthz/status

ステップ 3

kubectl get pods -w コマンドを使用して、healthy-monolith ポッドのステータスを取得します。

kubectl get pods healthy-monolith -w

ステップ 4

liveness プローブが失敗すると、コンテナは再起動されます。再起動されると、healthy-monolith ポッドは健全な状態に戻ります。ポッドが再起動されたら、Ctrl+C キーを押してコマンドを終了します。再起動の回数を記録しておきます。

ステップ 5

kubectl describe コマンドを使用して、失敗した liveness プローブの詳細を確認します。liveness プローブが失敗してポッドが再起動されたときの関連イベントが表示されます。

kubectl describe pods healthy-monolith

ステップ 6

終了したら、ターミナル 2 で Ctrl+C キーを押して、kubectl proxy コマンドを閉じます。

サービス

次のステップ:

  • サービスを作成します。

  • ラベルセレクタを使用して、ポッドの一部を外部に公開します。

サービスを作成する

サービスを作成する前に、HTTPS トラフィックに対応できる secure-monolith という nginx サーバーで、安全なポッドを作成します。

ステップ 1

安全なポッドがデータを取り込む(または消費する)ために使用するボリュームを 2 つ作成します。

secret タイプの 1 つ目のボリュームには、nginx サーバーの TLS 証明書ファイルを保存します。

ターミナル 1 に戻り、次のコマンドを使用して 1 つ目のボリュームを作成します。

kubectl create secret generic tls-certs --from-file tls/

ConfigMap タイプの 2 つ目のボリュームを作成して、nginx の構成ファイルを格納します。

kubectl create configmap nginx-proxy-conf --from-file nginx/proxy.conf

ステップ 2

nginx が使用する proxy.conf ファイルを確認します。

cat nginx/proxy.conf

ファイルでは、SSL がオンに指定されています。また、コンテナのファイル システム内での証明書ファイルの場所も指定されています。

ステップ 3

secure-monolith ポッド構成ファイルを確認します。

cat pods/secure-monolith.yaml

ステップ 4

次のコマンドを実行して、構成データを含む secure-monolith ポッドを作成します。

kubectl create -f pods/secure-monolith.yaml

安全なポッドが用意できたので、Kubernetes サービスを使用して secure-monolith ポッドを外部に公開します。

ステップ 5

monolith サービス構成ファイルを確認します。

cat services/monolith.yaml

ステップ 6

kubectl create コマンドを使用して、monolith サービス構成ファイルから monolith サービスを作成します。

kubectl create -f services/monolith.yaml

通常は、Kubernetes がこのポートの割り当てを処理します。このラボでは、後で簡単にヘルスチェックを設定できるように自分で選択しました。

ステップ 7

gcloud compute firewall-rules コマンドを使用して、公開済みノードポート上の monolith サービスへのトラフィックを許可します。

gcloud compute firewall-rules create allow-monolith-nodeport --allow=tcp:31000

すべての設定が完了したので、ポート転送を使用せずに、クラスタの外部から secure-monolith サービスをテストできます。

ステップ 8

いずれかのノードに対応する IP アドレスを取得します。

gcloud compute instances list

ステップ 9

ブラウザで次の URL を開いてみます。

https://<EXTERNAL_IP>:31000

ポッドにラベルを追加する

現在、monolith サービスにエンドポイントが見つかりません。このような問題をトラブルシューティングする方法のひとつは、ラベルクエリを指定して kubectl get pods コマンドを使用することです。

ステップ 1

monolith ラベルが付いた実行中のポッドが複数あることを特定します。

kubectl get pods -l "app=monolith"

ステップ 2

app=monolithsecure=enabled の場合はどうでしょうか。

kubectl get pods -l "app=monolith,secure=enabled"

ステップ 3

kubectl label コマンドを使用して、不足している secure=enabled ラベルを secure-monolith ポッドに追加します。

kubectl label pods secure-monolith 'secure=enabled'

[進捗状況を確認] をクリックして目的を確認します。 Secret、サービス、ファイアウォール ルール、ラベル付きポッドを作成する

ステップ 4

ラベルが更新されたことを確認します。

kubectl get pods secure-monolith --show-labels

ステップ 5

monolith サービスのエンドポイントの一覧を確認します。

kubectl get endpoints monolith

ステップ 6

いずれかのノードをもう一度テストして確認します。

gcloud compute instances list | grep gke-

ブラウザで次の URL を開きます。secure-monolith で自己署名証明書が使用されているため、先に進むには SSL の警告をクリックする必要があります。

https://<EXTERNAL_IP>:31000

ラボを終了する

ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします