arrow_back

Hello Node Kubernetes

参加 ログイン
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Hello Node Kubernetes

Lab 1時間 universal_currency_alt クレジット: 5 show_chart 中級
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP005

Google Cloud セルフペース ラボ

概要

このハンズオンラボでは、これまで作成してきたコードを使用して Kubernetes で実行される(Kubernetes Engine で動作する)複製アプリケーションを作成します。シンプルな Hello World node.js アプリケーションです。

次の図には、このラボで学習するさまざまな内容が示されており、各部がどう関連しているかの理解に役立ちます。図を参照しながら進めれば、終了する頃には内容をすべて理解できるようになります(現時点で理解できなくても問題ありません)。

ba830277f2d92e04.png

Kubernetes はオープンソースのプロジェクト(kubernetes.io から入手可能)で、ノートパソコンから可用性の高いマルチノード クラスタ、パブリック クラウドからオンプレミスのデプロイ、仮想マシンからベアメタルまで、さまざまな環境で扱うことができます。

このラボでは、Kubernetes Engine(Compute Engine で稼働する Kubernetes の Google ホスト バージョン)などのマネージド環境を使用して、基盤となるインフラストラクチャの構築ではなく Kubernetes の体験を重視しています。

演習内容

  • Node.js サーバーを作成する

  • Docker コンテナ イメージを作成する

  • コンテナ クラスタを作成する

  • Kubernetes ポッドを作成する

  • サービスをスケールアップする

前提条件

  • Linux の標準的なテキスト エディタ(vimemacsnano など)の使用経験があると役に立ちます。

本質的なコンセプトをよりよく理解できるよう、コマンドは手動で入力することをおすすめしますが、多くのラボには、必要なコマンドが含まれたコードブロックがあります。ラボでは、コードブロックのコマンドをコピーして、該当する場所に貼り付けることもできます。

セットアップ

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。
  • ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Cloud Shell をアクティブにする

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

  1. Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン 「Cloud Shell をアクティブにする」アイコン をクリックします。

接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

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

  1. (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
  1. [承認] をクリックします。

  2. 出力は次のようになります。

出力:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project = <project_ID>

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: Google Cloud における 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 でプロキシサーバーに送信します。

bde9fe42e27656fb.png

新しいブラウザタブが開き、結果が表示されます。

24aab6bb51533e91.png

続行する前に、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 のウェブ プレビュー機能を使用すれば、この結果を確認することができます。

bde9fe42e27656fb.png

または 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] を選択します。

Kubernetes_Container_reg.png

これで、プロジェクト全体で使用できる Docker イメージができました。このイメージには Kubernetes でアクセスし、オーケストレートすることができます。

container_reg.png

クラスタを作成する

ここまでの作業で 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_cluster.png

それでは、コンテナ化されたアプリケーションを 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 と入力すれば、対象のサービスにアクセスできるようになっています。

67cfa8c674f8c708.png

コンテナと Kubernetes を利用することで、ワークロードを負担するホストを指定がなかったり、サービスのモニタリングと再起動ができるなどのメリットが得られるようになりました。それでは、新しい 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 クラスタの状態をまとめます。

587f7f0a097aaa2.png

下の [進捗状況を確認] をクリックして、ラボの進捗状況を確認します。

サービスをスケールアップする

サービスへのアップグレードをロールアウトする

本番環境にデプロイしたアプリケーションは、いずれかの時点でバグ修正や追加機能の実装が必要になります。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 に進んでクエストを続けるか、以下のおすすめのラボをご確認ください。

次のステップと詳細情報

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 の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。