チェックポイント
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(Compute Engine で稼働する Kubernetes の Google ホスト バージョン)などのマネージド環境を使用して、基盤となるインフラストラクチャの構築ではなく Kubernetes の体験を重視しています。
演習内容
-
Node.js サーバーを作成する
-
Docker コンテナ イメージを作成する
-
コンテナ クラスタを作成する
-
Kubernetes ポッドを作成する
-
サービスをスケールアップする
前提条件
- Linux の標準的なテキスト エディタ(
vim
、emacs
、nano
など)の使用経験があると役に立ちます。
本質的なコンセプトをよりよく理解できるよう、コマンドは手動で入力することをおすすめしますが、多くのラボには、必要なコマンドが含まれたコードブロックがあります。ラボでは、コードブロックのコマンドをコピーして、該当する場所に貼り付けることもできます。
セットアップ
[ラボを開始] ボタンをクリックする前に
こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。
このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
- ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。 -
必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。
-
[ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。
重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。 -
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後このタブで Cloud Console が開きます。
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 の概要ガイドをご覧ください。
Node.js アプリケーションを作成する
Cloud Shell を使用して、Kubernetes Engine にデプロイするシンプルな Node.js サーバーを作成します。
vi server.js
エディタを開始します。
i
次の内容をファイルに加えます。
var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello World!");
}
var www = http.createServer(handleRequest);
www.listen(8080);
server.js
ファイルを保存します。Esc キーを押してから、次のように入力します。
:wq
Cloud Shell には node
実行可能ファイルがインストールされており、このコマンドでノードサーバーを起動することができます(このコマンドによる出力はありません)。
node server.js
Cloud Shell に組み込まれたウェブ プレビュー機能を使用して、新しいブラウザタブを開き、起動したインスタンスに対するリクエストをポート 8080 でプロキシサーバーに送信します。
新しいブラウザタブが開き、結果が表示されます。
続行する前に、Cloud Shell に戻り、Ctrl+c キーを押して実行中のノードサーバーを停止します。
次に、このアプリケーションを Docker コンテナでパッケージ化します。
Docker コンテナ イメージを作成する
構築するイメージについて記述した Dockerfile
を作成します。Docker コンテナ イメージは他の既存のイメージから拡張することができるため、今回も既存の Node イメージから拡張します。
vi Dockerfile
エディタを起動します。
i
次の内容を入力します。
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js
この Docker イメージの「レシピ」は次のようになります。
- Docker Hub にある
node
イメージから起動する - ポート
8080
を開く -
server.js
ファイルを対象のイメージにコピーする - 以前に行ったように、手動でノードサーバーを起動する
Esc キーを押してから、次のように入力し、この Dockerfile
を保存します。
:wq
次のようにイメージを作成します。PROJECT_ID
は、コンソールやラボの [接続の詳細] セクションに表示される GCP のプロジェクト ID に置き換えます。
docker build -t gcr.io/PROJECT_ID/hello-node:v1 .
すべてをダウンロードして展開するには時間がかかりますが、イメージ作成の進行状況は進捗バーで確認できます。
完了したら、次のコマンドを使用して、ローカルでイメージをテストします。新しく作成したコンテナ イメージから、Docker コンテナを daemon としてポート 8080 で実行します。
PROJECT_ID
はコンソール、またはラボの [接続の詳細] セクションに表示される GCP のプロジェクト ID に置き換えます)。
docker run -d -p 8080:8080 gcr.io/PROJECT_ID/hello-node:v1
次のように表示されます。
325301e6b2bffd1d0049c621866831316d653c0b25a496d04ce0ec6854cb7998
Cloud Shell のウェブ プレビュー機能を使用すれば、この結果を確認することができます。
または Cloud Shell で curl
を使用します。
curl http://localhost:8080
この出力は次のように表示されます。
Hello World!
次に、実行中のコンテナを停止します。
次のコマンドを実行して、Docker コンテナ ID を確認します。
docker ps
この出力は次のように表示されます。
CONTAINER ID IMAGE COMMAND
2c66d0efcbd4 gcr.io/PROJECT_ID/hello-node:v1 "/bin/sh -c 'node
次のコマンドの CONTAINER ID を前のステップで取得したコンテナ ID に置き換えて実行し、コンテナを停止します。
docker stop [CONTAINER ID]
コンソールには次のように表示されます(コンテナ ID)。
2c66d0efcbd4
イメージが意図したとおりに機能するようになりましたので、これを Docker イメージ用の非公開リポジトリである Google Container Registry に push します。このリポジトリには Google Cloud プロジェクトからアクセスできます。
PROJECT_ID
をコンソール、またはラボの [接続の詳細] セクションに表示される GCP のプロジェクト ID に置き換えて、次のコマンドを実行します。
gcloud auth configure-docker
docker push gcr.io/PROJECT_ID/hello-node:v1
初回の push は、完了するまで数分かかることがあります。進捗状況は進捗バーで確認できます。
The push refers to a repository [gcr.io/qwiklabs-gcp-6h281a111f098/hello-node]
ba6ca48af64e: Pushed
381c97ba7dc3: Pushed
604c78617f34: Pushed
fa18e5ffd316: Pushed
0a5e2b2ddeaa: Pushed
53c779688d06: Pushed
60a0858edcd5: Pushed
b6ca02dfe5e6: Pushed
v1: digest: sha256:8a9349a355c8e06a48a1e8906652b9259bba6d594097f115060acca8e3e941a2 size: 2002
コンテナ イメージがコンソールに一覧で表示されます。[ナビゲーション メニュー] > [Container Registry] を選択します。
これで、プロジェクト全体で使用できる Docker イメージができました。このイメージには Kubernetes でアクセスし、オーケストレートすることができます。
クラスタを作成する
ここまでの作業で Container Engine クラスタを作成する準備が整っています。クラスタは Google がホストしている Kubernetes マスター API サーバーと一連のワーカーノードで構成されます。ワーカーノードは Compute Engine 仮想マシンです。
gcloud
を使用してプロジェクトを設定していることを確認してください(PROJECT_ID
をコンソール、またはラボの [接続の詳細] セクションに表示される GCP のプロジェクト ID に置き換えます)。
gcloud config set project PROJECT_ID
2 つの n1-standard-1 ノードがあるクラスタを作成します(完了するまでに数分かかります)。
gcloud container clusters create hello-world \
--num-nodes 2 \
--machine-type n1-standard-1 \
--zone us-central1-a
クラスターの構築時に表示される警告は無視しても問題ありません。
コンソールに次のように表示されます。
Creating cluster hello-world...done.
Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-central1-a/clusters/hello-world].
kubeconfig entry generated for hello-world.
NAME ZONE MASTER_VERSION MASTER_IP MACHINE_TYPE STATUS
hello-world us-central1-a 1.5.7 146.148.46.124 n1-standard-1 RUNNING
注: このクラスタは、イメージが表示されている上述のコンソールから作成することもできます([Kubernetes Engine] > [Kubernetes クラスタ] > [クラスタを作成])。
[ナビゲーション メニュー] > [Kubernetes Engine] を選択すると、Kubernetes Engine を搭載した、完全版の Kubernetes クラスタができていることを確認できます。
それでは、コンテナ化されたアプリケーションを Kubernetes クラスタにデプロイしてみましょう。ここからは kubectl
コマンドライン(Cloud Shell 環境で設定済み)を使用します。
下の [進捗状況を確認] をクリックして、ラボの進捗状況を確認します。
ポッドを作成する
Kubernetes ポッドは管理とネットワーキングを目的に結合されたコンテナのグループで、1 つ以上のコンテナを含めることができます。ここでは、プライベート コンテナ レジストリに保存されている Node.js イメージで構築した 1 つのコンテナを使用します。このコンテナは、コンテンツの提供にポート 8080 を使用します。
kubectl run
コマンドでポッドを作成します(PROJECT_ID
をコンソール、またはラボの [接続の詳細] セクションに表示される GCP のプロジェクト ID に置き換えます)。
kubectl create deployment hello-node \
--image=gcr.io/PROJECT_ID/hello-node:v1
(出力)
deployment.apps/hello-node created
これでデプロイメント オブジェクトが作成されました。デプロイメント オブジェクトは、ポッドを作成してスケーリングするためのおすすめの方法です。ここでは、hello-node:v1
イメージを実行する 1 つのポッドレプリカを新しいデプロイメントで管理します。
デプロイメントを表示するには、次のコマンドを実行します。
kubectl get deployments
(出力)
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 1m36s
デプロイメントによって作成されたポッドを表示するには、次のコマンドを実行します。
kubectl get pods
次のように表示されます。
NAME READY STATUS RESTARTS AGE
hello-node-714049816-ztzrb 1/1 Running 0 6m
ここで、便利な kubectl
コマンドをいくつかお伝えします。いずれもクラスタの状態を変えるものではありません。詳しくは、こちらをご確認ください。
kubectl cluster-info
kubectl config view
トラブルシューティング用:
kubectl get events
kubectl logs <pod-name>
ここで、ポッドに外部からアクセスできるようにする必要があります。
下の [進捗状況を確認] をクリックして、ラボの進捗状況を確認します。
外部トラフィックを許可する
デフォルトでは、ポッドにはクラスタ内の内部 IP からしかアクセスできません。hello-node
コンテナを Kubernetes 仮想ネットワークの外部からアクセスできるようにするには、ポッドを Kubernetes サービスとして公開する必要があります。
Cloud Shell から、kubectl expose
コマンドを --type="LoadBalancer"
フラグと組み合わせて使用すると、ポッドをインターネットで公開できます。外部からアクセスできる IP を作成するには、このフラグが必要です。
kubectl expose deployment hello-node --type="LoadBalancer" --port=8080
次のように表示されます。
service/hello-node exposed
このコマンドで使用しているフラグは、基盤となるインフラストラクチャで提供されるロードバランサ(この場合は Compute Engine のロードバランサ)を使うよう指定しています。ポッドを直接公開するのではなく、デプロイメントを公開していることに注意してください。これによって、デプロイメントで管理されるすべてのポッドにまたがってトラフィックの負荷を分散するサービスが作成されます(ここでは 1 つのポッドだけですが、後でレプリカを追加します)。
Kubernetes マスターによってロードバランサ、それに関連する Compute Engine 転送ルール、ターゲット プール、ファイアウォール ルールが作成され、Google Cloud Platform の外部からこのサービスに完全にアクセスできるようになります。
対象サービスの公開 IP アドレスを確認するには、kubectl
をリクエストしてすべてのクラスタ サービスを一覧で表示します。
kubectl get services
この出力は次のように表示されます。
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node 10.3.250.149 104.154.90.147 8080/TCP 1m
kubernetes 10.3.240.1 <none> 443/TCP 5m
hello-node サービスに対して 2 つの IP アドレスが表示されます。いずれもポート 8080
を使用しています。CLUSTER-IP は内部 IP で、Cloud Virtual Network 内でのみ表示されます。EXTERNAL-IP は負荷分散を行う外部 IP です。
ブラウザでアドレス http://<EXTERNAL_IP>:8080
と入力すれば、対象のサービスにアクセスできるようになっています。
コンテナと Kubernetes を利用することで、ワークロードを負担するホストを指定がなかったり、サービスのモニタリングと再起動ができるなどのメリットが得られるようになりました。それでは、新しい Kubernetes インフラストラクチャを利用することで得られるその他のメリットについて見ていきましょう。
下の [進捗状況を確認] をクリックして、ラボの進捗状況を確認します。
サービスをスケールアップする
Kubernetes の優れた特長の 1 つは、アプリケーションのスケールアップが容易なことです。急にアプリケーションの容量を増やす必要が生じたとしても、レプリケーション コントローラに、ポッドの新しいレプリカを管理するよう指示することができます。
kubectl scale deployment hello-node --replicas=4
(出力)
deployment.extensions/hello-node scaled
更新されたデプロイメントの詳細をリクエストできます。
kubectl get deployment
(出力)
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-node 4 4 4 4 16m
また、すべてのポッドを一覧で表示することもできます。
kubectl get pods
次のように表示されます。
NAME READY STATUS RESTARTS AGE
hello-node-714049816-g4azy 1/1 Running 0 1m
hello-node-714049816-rk0u6 1/1 Running 0 1m
hello-node-714049816-sh812 1/1 Running 0 1m
hello-node-714049816-ztzrb 1/1 Running 0 16m
ここでは宣言的アプローチを使用しています。新しいインスタンスの起動や停止を行うのではなく、実行するインスタンスの数を宣言します。Kubernetes の突合せループによって、リクエストした内容と実際の状態が一致しているかどうかが照合され、必要に応じて調整が行われます。
次の図に、Kubernetes クラスタの状態をまとめます。
下の [進捗状況を確認] をクリックして、ラボの進捗状況を確認します。
サービスへのアップグレードをロールアウトする
本番環境にデプロイしたアプリケーションは、いずれかの時点でバグ修正や追加機能の実装が必要になります。Kubernetes を使用すると、ユーザーに影響を及ぼすことなく、新しいバージョンを本番環境にデプロイすることができます。
まず、アプリケーションに何らかの変更を加えてみましょう。server.js
を編集します:
vi server.js
i
レスポンス メッセージを更新します。
response.end("Hello Kubernetes World!");
server.js
ファイルを保存します。Esc キーを押してから、次のように入力します。
:wq
バージョン番号を変えたタグ(この場合は v2
)を含む新しいコンテナ イメージを構築し、レジストリに公開します。
PROJECT_ID
をコンソール、またはラボの [接続の詳細] セクションに表示されるラボのプロジェクト ID に置き換えて、次のコマンドを実行します。
docker build -t gcr.io/PROJECT_ID/hello-node:v2 .
docker push gcr.io/PROJECT_ID/hello-node:v2
Kubernetes によって、対象のアプリケーションでレプリケーション コントローラがスムーズに更新されます。既存の hello-node deployment
を編集し、イメージを gcr.io/PROJECT_ID/hello-node:v1
から gcr.io/PROJECT_ID/hello-node:v2
に変更して、実行しているコンテナのイメージラベルを更新します。
これは kubectl edit
コマンドで実行します。テキスト エディタが開かれ、デプロイメントの yaml 構成全体が表示されます。ここでは yaml 構成全体を理解する必要はありません。構成の spec.template.spec.containers.image
フィールドを更新すれば、新しいイメージでポッドを更新するよう指示することになるというポイントが重要です。
kubectl edit deployment hello-node
Spec
> containers
> image
を探し、バージョン番号をv2に変更します。
# 下のオブジェクトを編集してください。「#」が付いている行はコメントであり、無視されます。
# 空白のファイルを使用すると編集内容が破棄されます。ファイルの保存中にエラーが発生した場合は
# ファイルが再び開かれますが、エラーが存在する状態になります。
#
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: 2016-03-24T17:55:28Z
generation: 3
labels:
run: hello-node
name: hello-node
namespace: default
resourceVersion: "151017"
selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-node
uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
replicas: 4
selector:
matchLabels:
run: hello-node
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
run: hello-node
spec:
containers:
- image: gcr.io/PROJECT_ID/hello-node:v1 ## Update this line ##
imagePullPolicy: IfNotPresent
name: hello-node
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
dnsPolicy: ClusterFirst
restartPolicy: Always
securityContext: {}
terminationGracePeriodSeconds: 30
変更を行ったら、このファイルを保存して閉じます。Esc キーを押してから、次のように入力します。
:wq
この出力は次のように表示されます。
deployment.extensions/hello-node edited
次のコマンドを実行して、新しいイメージでデプロイメントを更新します。
kubectl get deployments
新しいイメージで新しいポッドが作成され、古いポッドは削除されます。
この出力は次のように表示されます (上記のコマンドをもう一度実行する場合があります)。
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-node 4 4 4 4 1h
更新の実行中、ユーザーがサービスを中断する必要はありません。しばらくすると、アプリケーションの新しいバージョンにアクセスできるようになります。更新のロールアウトについてさらに詳しくは、こちらのドキュメントをご確認ください。
Kubernetes Engine クラスタを使うと、以上のようなデプロイ、スケーリング、更新の機能のおかげで、インフラストラクチャを気にせずアプリケーションに集中できるようになります。
理解度テスト
クイズに挑戦して Google Cloud Platform に関する自分の知識をチェックしましょう(正しいものをすべて選択してください)。
これで完了です
これで Kubernetes のハンズオンラボが終了しました。ここで扱った内容は、あくまで Kubernetes テクノロジーのごく一部です。ポッド、レプリケーション コントローラ、サービスなどをご自身で使用して、さらに理解を深めることをおすすめします。また、Liveness Probe(ヘルスチェック)や Kubernetes API もぜひお試しください。
次のラボの受講
Managing Deployments using 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 テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2020 年 12 月 4 日
ラボの最終テスト日: 2020 年 12 月 4 日
Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。