チェックポイント
Create your cluster
/ 20
Create your pod
/ 30
Create a Kubernetes Service
/ 30
Scale up your service
/ 20
Hello Node Kubernetes
GSP005
概要
このハンズオンラボでは、これまで作成してきたコードを使って Kubernetes で実行される(Kubernetes Engine で動作する)複製アプリケーションを作成します。コードは、シンプルな Hello World node.js アプリケーションです。
次の図には、このラボで学習するさまざまな内容が示されており、各部がどう関連しているかの理解に役立ちます。図を参照しながら進めれば、終了する頃には内容をすべて理解できるようになります(現時点で理解できなくても問題ありません)。
Kubernetes はオープンソースのプロジェクト(kubernetes.io から入手可能)で、ノートパソコンから可用性の高いマルチノード クラスタ、パブリック クラウドからオンプレミスのデプロイ、仮想マシンからベアメタルまで、さまざまな環境で実行できます。
このラボでは、Kubernetes Engine(Google がホストし、Compute Engine で実行される Kubernetes の 1 バージョン)などのマネージド環境を使用するため、基盤となるインフラストラクチャの設定を気にせずに Kubernetes の操作に集中できます。
学習内容
- Node.js サーバーを作成する。
- Docker コンテナ イメージを作成する。
- コンテナ クラスタを作成する。
- Kubernetes Pod を作成する。
- サービスをスケールアップする。
前提条件
- Linux の標準的なテキスト エディタ(
vim
、emacs
、nano
など)の使用経験があると役に立ちます。
根底にあるコンセプトを理解できるよう、コマンドは手動で入力することをおすすめしますが、多くのラボで、必要なコマンドが含まれたコードブロックが提供されています。コードブロックのコマンドをコピーして、該当する場所に貼り付けることもできます。
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。
このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
- ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウでリンクを開く] を選択します)。
ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。 -
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}} [ラボの詳細] パネルでも [ユーザー名] を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}} [ラボの詳細] パネルでも [パスワード] を確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。 -
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
Cloud Shell をアクティブにする
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
- Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン をクリックします。
接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。
gcloud
は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
-
[承認] をクリックします。
-
出力は次のようになります。
出力:
- (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
出力:
出力例:
gcloud
ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。
タスク 1. Node.js アプリケーションを作成する
1. Cloud Shell を使用して、Kubernetes Engine にデプロイするシンプルな Node.js サーバーを作成します。
- エディタを開きます。
- 次の内容をファイルに追加します。
vi
を使用していますが、Cloud Shell では nano
や emacs
も使用できます。Cloud Shell の仕組みに関するガイドの説明に沿って、CloudShell のウェブエディタ機能を使用することもできます。-
Esc キーを押してから、次のように入力して、
server.js
ファイルを保存します。
- Cloud Shell には
node
実行可能ファイルがインストールされており、このコマンドでノードサーバーを起動することができます(このコマンドによる出力はありません)。
- Cloud Shell に組み込まれたウェブ プレビュー機能を使用して、新しいブラウザタブを開き、起動したインスタンスに対するリクエストをポート
8080
でプロキシ サーバーに送信します。
新しいブラウザタブが開き、結果が表示されます。
- 続行する前に、Cloud Shell に戻り、Ctrl+C キーを押して実行中のノードサーバーを停止します。
次に、このアプリケーションを Docker コンテナにパッケージ化します。
タスク 2. Docker コンテナ イメージを作成する
- 構築するイメージについて記述した
Dockerfile
を作成します。Docker コンテナ イメージは他の既存のイメージから拡張することができるため、今回も既存の Node イメージから拡張します。
- エディタを開きます。
- 次の内容を追加します。
この Docker イメージの「レシピ」は次のようになります。
- Docker Hub にある
node
イメージから起動する - ポート
8080
を公開する -
server.js
ファイルをイメージにコピーする - 以前に行ったように、手動でノードサーバーを起動する
- Esc キーを押してから、次のように入力し、この
Dockerfile
を保存します。
- 次のようにイメージを作成します。
PROJECT_ID
は、コンソールやラボの [ラボの詳細] セクションに表示されるプロジェクト ID に置き換えます。
すべてをダウンロードして展開するには時間がかかりますが、イメージ作成の進行状況は進捗バーで確認できます。
完了したら、新たに作成したコンテナ イメージから Docker コンテナをデーモンとしてポート 8080 で実行して、イメージをローカルでテストします。
- 次のコマンドを実行します。
PROJECT_ID
は、コンソールまたはラボの [ラボの詳細] セクションに表示されるプロジェクト ID に置き換えます。
出力は次のようになります。
- この結果を確認するには、Cloud Shell のウェブ プレビュー機能を使用します。または Cloud Shell で
curl
を使用します。
次のような出力が表示されます。
docker run
コマンドの詳細については、Docker run リファレンスをご覧ください。次に、実行中のコンテナを停止します。
- 次のコマンドを実行して、Docker コンテナ ID を確認します。
出力は次のようになります。
- 次のコマンドの
[CONTAINER ID]
を前のステップで取得したコンテナ ID に置き換えて実行し、コンテナを停止します。
コンソール出力は次のようになります(実際のコンテナ ID になります)。
イメージが意図したとおりに機能するようになりましたので、これを Docker イメージ用の非公開リポジトリである Google Container Registry に push します。このリポジトリには Google Cloud プロジェクトからアクセスできます。
- 次のコマンドを実行して、Docker 認証を構成します。
[Do you want to continue (Y/n)?] というプロンプトが表示されたら、「Y」と入力します。
- 次のコマンドを実行します。
PROJECT_ID
は、コンソールまたはラボの [ラボの詳細] セクションに表示されるプロジェクト ID に置き換えます。
初回の push は、完了するまで数分かかることがあります。進捗状況は進行状況バーで確認できます。
- コンテナ イメージがコンソールに一覧で表示されます。ナビゲーション メニュー > [Container Registry] をクリックします。
これで、プロジェクト全体で使用できる Docker イメージができました。このイメージには Kubernetes でアクセスし、オーケストレートすることができます。
gcr.io
)用の汎用ドメインを使用しています。独自の環境では、使用するゾーンとバケットを限定できます。詳しくは、 をご覧ください。タスク 3. クラスタを作成する
これで、Kubernetes Engine クラスタを作成する準備が整いました。クラスタは Google がホストしている Kubernetes マスター API サーバーと一連のワーカーノードで構成されます。ワーカーノードは Compute Engine 仮想マシンです。
-
gcloud
を使用してプロジェクトを設定していることを確認します(PROJECT_ID
は、コンソールまたはラボの [ラボの] セクションに表示されるプロジェクト ID に置き換えます)。
- 2 つの n1-standard-1 ノードがあるクラスタを作成します(完了するまでに数分かかります)。
クラスタのビルド時に表示される警告は無視してかまいません。
コンソール出力は次のようになります。
または、コンソールでナビゲーション メニューを開き、[Kubernetes Engine] > [Kubernetes クラスタ] > [作成] を選択して、このクラスタを作成することもできます。
ナビゲーション メニュー > [Kubernetes Engine] を選択すると、Kubernetes Engine を搭載した、完全版の Kubernetes クラスタができていることを確認できます。
それでは、コンテナ化されたアプリケーションを Kubernetes クラスタにデプロイしてみましょう。ここからは kubectl
コマンドライン(Cloud Shell 環境で設定済み)を使用します。
下の [進行状況を確認] をクリックして、ラボの進行状況を確認します。
タスク 4. Pod を作成する
Kubernetes ポッドは管理とネットワーキングを目的に結合されたコンテナのグループで、1 つ以上のコンテナを含めることができます。ここでは、プライベート コンテナ レジストリに保存されている Node.js イメージで構築した 1 つのコンテナを使用します。このコンテナは、コンテンツの提供にポート 8080 を使用します。
-
kubectl run
コマンドで Pod を作成します(PROJECT_ID
をコンソールまたはラボの [接続の詳細] セクションに表示されるプロジェクト ID に置き換えます)。
出力:
これで Deployment オブジェクトが作成されました。このオブジェクトは、ポッドを作成してスケーリングするためのおすすめの方法です。ここでは、hello-node:v1
イメージを実行する 1 つのポッドレプリカを新しい Deployment で管理します。
- Deployment を表示するには、次のコマンドを実行します。
出力:
- Deployment によって作成された Pod を表示するには、次のコマンドを実行します。
出力:
ここで、便利な kubectl
コマンドをいくつかお伝えします。いずれもクラスタの状態を変更しません。リファレンス ドキュメントの全文については、コマンドライン ツール(kubectl)をご覧ください。
トラブルシューティング用:
ここで、Pod に外部からアクセスできるようにする必要があります。
下の [進行状況を確認] をクリックして、ラボの進行状況を確認します。
タスク 5. 外部トラフィックを許可する
デフォルトでは、ポッドにはクラスタ内の内部 IP からしかアクセスできません。hello-node
コンテナに Kubernetes 仮想ネットワークの外部からアクセスできるようにするには、Pod を Kubernetes Service として公開する必要があります。
- Cloud Shell から、
kubectl expose
コマンドを--type="LoadBalancer"
フラグと組み合わせて使用すると、ポッドをインターネットで公開できます。外部からアクセスできる IP を作成するには、このフラグが必要です。
出力:
このコマンドで使用しているフラグは、基盤となるインフラストラクチャで提供されるロードバランサ(この場合は Compute Engine のロードバランサ)を使うよう指定しています。Pod を直接公開するのではなく、Deployment を公開していることに注意してください。これによって、Deployment で管理されるすべての Pod でトラフィックをロードバランスする Service が作成されます(ここでは 1 つの Pod だけですが、後でレプリカを追加します)。
Kubernetes マスターによってロードバランサ、それに関連する Compute Engine 転送ルール、ターゲット プール、ファイアウォール ルールが作成され、Google Cloud の外部からこの Service に完全にアクセスできるようになります。
- この Service の公開 IP アドレスを確認するには、
kubectl
をリクエストしてすべてのクラスタ Service を一覧で表示します。
次のような出力が表示されます。
hello-node Service に対して 2 つの IP アドレスが表示されます。いずれもポート 8080 を使用しています。CLUSTER-IP
は内部 IP で、Cloud Virtual Network 内でのみ表示されます。EXTERNAL-IP
はロードバランスされた外部 IP です。
EXTERNAL-IP
が表示され、使用できるようになるまでには数分かかることがあります。EXTERNAL-IP
がない場合は、数分待ってからコマンドを再度実行します。- ブラウザでアドレス
http://<EXTERNAL_IP>:8080
を入力すれば、対象の Service にアクセスできるようになります。
この時点で、コンテナと Kubernetes を利用することで、ワークロードを実行するホストを指定する必要がない、Service のモニタリングと再起動ができるなどのメリットが得られるようになりました。それでは、新しい Kubernetes インフラストラクチャを利用することで得られるその他のメリットについて見ていきましょう。
下の [進行状況を確認] をクリックして、ラボの進行状況を確認します。
タスク 6. Service をスケールアップする
Kubernetes の優れた特長の一つは、アプリケーションのスケールが容易なことです。急に容量を増やす必要が生じたとしても、レプリケーション コントローラに、Pod の新しい数のレプリカを管理するよう指示することができます。
- Pod のレプリカ数を設定します。
出力:
- 更新された Deployment の説明をリクエストします。
出力:
4 つのレプリカがすべて作成されるまで、上記のコマンドを再実行します。
- すべての Pod を一覧表示します。
次のような出力が表示されます。
ここでは宣言的アプローチを使用しています。新しいインスタンスの起動や停止を行うのではなく、実行するインスタンスの数を宣言します。Kubernetes の調整ループによって、リクエストした内容と実際の状態が一致しているかどうかが照合され、必要に応じて調整が行われます。
次の図に、Kubernetes クラスタの状態をまとめます。
下の [進行状況を確認] をクリックして、ラボの進行状況を確認します。
タスク 7. Service へのアップグレードをロールアウトする
本番環境にデプロイしたアプリケーションは、いずれかの時点でバグ修正や追加機能の実装が必要になります。Kubernetes を使用すると、ユーザーに影響を及ぼすことなく、新しいバージョンを本番環境にデプロイすることができます。
- まず、
server.js
を開いてアプリケーションを変更します。
- レスポンス メッセージを更新します。
-
Esc キーを押してから、次のように入力して、
server.js
ファイルを保存します。
これで、インクリメントされたタグ(この場合は v2
)を含む新しいコンテナ イメージを構築し、レジストリに公開できます。
- 次のコマンドを実行します。
PROJECT_ID
はラボのプロジェクト ID に置き換えます。
Kubernetes がレプリケーション コントローラを新しいバージョンのアプリケーションにスムーズに更新します。既存の hello-node deployment
を編集し、イメージを gcr.io/PROJECT_ID/hello-node:v1
から gcr.io/PROJECT_ID/hello-node:v2
に変更して、実行しているコンテナのイメージラベルを更新します。
- この操作を行うには、
kubectl edit
コマンドを使用します。
テキスト エディタが開かれ、Deployment の yaml 構成全体が表示されます。ここでは yaml 構成全体を理解する必要はありません。構成の spec.template.spec.containers.image
フィールドを更新すれば、新しいイメージで Pod を更新するよう指示することになるというポイントが重要です。
- [
Spec
] > [containers
] > [image
] を探し、バージョン番号を v1 から v2 に変更します。
- 変更を行ったら、このファイルを保存して閉じます。Esc キーを押してから、次のように入力します。
次のような出力が表示されます。
- 次のコマンドを実行して、新しいイメージで Deployment を更新します。
新しいイメージで新しい Pod が作成され、古い Pod は削除されます。
次のような出力が表示されます(上記コマンドの再実行が必要となる場合があります)。
更新の実行中、ユーザーがサービスを中断する必要はありません。しばらくすると、アプリケーションの新しいバージョンにアクセスできるようになります。ローリング アップデートの詳細については、ローリング アップデートの実行に関するドキュメントをご覧ください。
Kubernetes Engine クラスタを使うと、以上のようなデプロイ、スケーリング、更新の機能のおかげで、インフラストラクチャを気にせずアプリケーションに集中できるようになります。
タスク 8. 理解度テスト
クイズに挑戦して Google Cloud Platform に関する知識をチェックしましょう(正しいものをすべて選択してください)。
これで完了です
これで Kubernetes のハンズオンラボが終了しました。ここで学んだのは、このテクノロジーの一部にすぎません。ご自分の Pod、レプリケーション コントローラ、Service を使って実践を継続し、活動状況プローブ(ヘルスチェック)を確認してみてください。Kubernetes API を直接使用することもおすすめします。
次のラボを受講する
Kubernetes Engine によるデプロイの管理を試すか、以下のおすすめのラボをご確認ください。
次のステップと詳細情報
- Minikube(http://kubernetes.io/docs/getting-started-guides/minikube/)をチェックしてみましょう。本ラボを終了していれば、Minikube で単一ノードの Kubernetes クラスタを簡単に設定し、開発とテストで利用できます。
- Kubernetes は、GitHub でホストされているオープンソース プロジェクト(http://kubernetes.io/)です。フィードバックや投稿をお待ちしております。
- Kubernetes の最新情報については、Twitter やコミュニティのブログでご確認ください。
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2024 年 3 月 14 日
ラボの最終テスト日: 2024 年 3 月 14 日
Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。