Kubernetesの基本的な操作を体験しよう

このチュートリアルでは、簡単なサンプルアプリケーションを使って、Kubernetes上でコンテナを管理する基本的な操作を体験します。

このチュートリアルを実施するために必要な要件

全体の流れ

  1. サンプルアプリケーションの動作確認
  2. Deploymentオブジェクトの確認
  3. Podの状態の確認
  4. アプリケーションのスケーリング
  5. Podの自動復旧

1 . サンプルアプリケーションの動作確認

チュートリアルの内容に入る前に、サンプルアプリケーションが正常に動作しているか確認します。

以下のコマンドを実行すると、クラスターに作成済みのPod、Serviceを一覧することができます。

kubectl get pod,service

前ページのチュートリアルが完了していれば、以下のようにリソースが一覧表示されます。

NAME                          READY   STATUS    RESTARTS   AGE
pod/cowweb-695c65b665-sgcdk   1/1     Running   0          17s
pod/cowweb-695c65b665-vh825   1/1     Running   0          17s

NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/cowweb       LoadBalancer   10.96.229.191   130.61.97.82   80:30975/TCP   40h

すべてのPodのSTATUSがRunnigであることと、cowwebという名前のServiceがあることが確認してください。

上の例では、クラスターを構成するマシンの30609番ポートにリクエストを送信すると、アプリケーションにアクセスできることを意味しています。このポート番号(通常30000番台が割り当てられます)をテキストエディタ等に控えておいてください。

クラスターを構成するマシンのIPアドレスは、以下のコマンドで確認することができます。

kubectl get nodes

実際に動作確認してみます。以下のコマンドを実行してください。

curl "http://[ロードバランサーのIP]/cowsay/say"

正常に応答が返ってくれば(牛のアスキーアートが表示されれば)、動作確認は完了です。

2. Deploymentオブジェクトの確認

Deploymentは、Podのレプリカ数(冗長構成でのPodの数)や、Podが内包するコンテナの指定など、動作させたいコンテナに関連する構成情報を定義するオブジェクトです。ここまでの手順で、Deploymentオブジェクトをクラスター上に作成済みであり、その事によって、サンプルアプリケーションがクラスタで動作しています。

では、Deploymentオブジェクトの情報を確認してみましょう。クラスターに存在するDeploymentの一覧を取得するには以下のコマンドを実行します。

kubectl get deployments
NAME     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
cowweb   2         2         2            2           20m

先に作成したcowwebという名前のDeploymentがあることがわかります。DESISRED, CURRENTなどの値が2となっているのは、2つのPodを動かすように指定しており、その指定通りにPodが可動していることを表しています。

このDeploymentの情報をもっと詳しく調べるには、以下のコマンドを実行します。

kubectl describe deployments/cowweb
Name:               cowweb
Namespace:          handson-030
CreationTimestamp:  Thu, 31 Jan 2019 17:34:44 +0000
Labels:             <none>
Annotations:        deployment.kubernetes.io/revision: 1
...(中略)...
NewReplicaSet:   cowweb-57885b669c (2/2 replicas created
Events:
  Type    Reason             Age   From                   Messag
  ----    ------             ----  ----                   ------
  Normal  ScalingReplicaSet  23m   deployment-controller  Scaled up replica set cowweb-57885b669c to 2

このDeploymentに関する様々な情報が表示されますが、特によく参照するのは、最後のEvents以下に表示される内容です。

これは、このPodにまつわって発生した過去のイベントが記録されているもので、Podが正常に起動しなかったときなど、特にトラブルシュートの場面で手がかりとなる情報を得るのに役立ちます。

3. Podの状態の確認

ここでは、クラスター上で動作しているcowwebの動作状況を、Podの標準出力を表示するなどして確認してみます。

3.1. Podの標準出力の表示

Kubernetes上で動作するアプリケーションの動作状況を確認する上で最もシンプルな方法は、Podの標準出力確認することです。Podの標準出力を表示するには、以下のコマンドを実行します。

kubectl logs [Pod名]

ここで指定するPod名は、Podの一覧を表示して表示される2つのPodのうちのどちらかを指定してください。

kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
cowweb-57885b669c-9dzg4   1/1     Running   0          43m
cowweb-57885b669c-r7l4g   1/1     Running   0          43m

この場合、例えば以下のようなコマンドとなります。

kubectl logs cowweb-57885b669c-9dzg4
...(中略)...
2019-01-31 18:18:34.547  INFO 1 --- [nio-8080-exec-5] c.oracle.jp.cowweb.AccessLogInterceptor  : version: v1.0
I'm working...
2019-01-31 18:18:36.581  INFO 1 --- [nio-8080-exec-6] c.oracle.jp.cowweb.AccessLogInterceptor  : version: v1.0
I'm working...
2019-01-31 18:18:46.580  INFO 1 --- [nio-8080-exec-7] c.oracle.jp.cowweb.AccessLogInterceptor  : version: v1.0
I'm working...

これが、Podの標準出力の内容を表示した結果です。Kubernetesはクラスター内で動作するコンテナに対して、定期的に死活確認を行っています。このサンプルアプリケーションでは、死活監視のリクエストが来たときに上記のようなログを出力するように実装してあります。

Note

コンテナの死活監視の機能はlivenessProbeと呼ばれます。死活確認の手段としては、1) 特定のエンドポイントにHTTP GETリクエストを送信する 2)所定のコマンドを実行する 3)TCP Socketのコネクションの生成をおこなう、の3通りの方法がサポートされています。

また、Podの起動時にも、コンテナの起動状態をチェックするために同様の確認が行われます。サポートされるチェックの手段はlivenessProbeと同じですが、こちらはreadinessProbeと呼ばれます。

3.2. Podの環境変数の確認

Podに設定されている環境変数を確認するには、Pod内にアクセスしてenvコマンドを実行する必要があります。

まず、Pod内から任意のコマンドを実行するにはkubectl execコマンドを用います。

kubectl exec [Pod名] [実行したいコマンド]

[実行したいコマンド]にenvを当てはめて実行すると、指定したPod内でそれが呼び出され、環境変数を出力することができます。

kubectl exec [Pod名] env

kubectl execを利用すると、Podのシェルに入ることも可能です。

kubectl exec -it [Pod名] /bin/sh

Note

kubectl execを利用すると、任意のコンテナをクラスター内に立ち上げて、そのコンテナのシェルを利用することができます。このテクニックはトラブルシューティングの場面で有用です。

例えば、クラスターで動作するアプリに期待通りにアクセス出来ないような状況において、クラスター内からcurlを実行して疎通確認を行うことで、問題の切り分けに役立てるといったことが可能です。

4. アプリケーションのスケーリング

ここでは、Deploymentに対してレプリカの数を指定することによって、Podのスケールアウト/インを試してみます。

4.1. スケールアウト

Deploymentに対してレプリカの数を指定することによって、そのDeploymentが管理するPodの数を増減することができます。

レプリカの数を変更するには、kubectl scaleコマンドを使用します。以下のように実行することで、cowwebのPodを管理するDeploymentに対して、レプリカ数を4にするよう指示します。

kubectl scale deployments/cowweb --replicas=4

Podの一覧を表示してみます。

kubectl get pods

すると、4つのPodが構成されていることがわかります。

NAME                      READY   STATUS    RESTARTS   AGE
cowweb-57885b669c-4h5l4   0/1     Running   0          7s
cowweb-57885b669c-9dzg4   1/1     Running   0          1h
cowweb-57885b669c-hxvpz   0/1     Running   0          7s
cowweb-57885b669c-r7l4g   1/1     Running   0          1h

上の例では、一部のPodは起動中の状態です。少し時間が経過すると全てのPodのSTATUSがRunningになります。

4.2. Serviceによるルーティングの様子の確認

この時点で、クラスターには4つのcowwebのPodがデプロイされている状態です。この状態で、Podに対するアクセスが負荷分散される様子を確認してみましょう。

cowwebには、環境変数の変数名を指定することで、その値を答えてくれる仕掛けがしてあります。これを利用してPodのホスト名を応答させることで、負荷分散の動きを見てみます。

動作確認で実行したcurlコマンドのURLに?say=HOSTNAMEというクエリを追加して、以下のようなコマンドを実行してみてください。

curl "http://[ロードバランサーのIP]/cowsay/say?say=HOSTNAME"

このコマンドを何度か繰り返すと、その度に異なるホスト名が返ってくることがわかります。

 _________________________
< cowweb-57885b669c-r7l4g >
 -------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
 _________________________
< cowweb-57885b669c-hxvpz >
 -------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

4.3. スケールイン

Pod数を縮小することも当然ながら可能です。スケールアウトで行ったように、kubectl scaleコマンドでレプリカ数を指定して減らすことが可能です。

他の方法として、Deploymentのmanifestファイルで現在より少ないreplica数を記述しておき、そのmanifestをクラスターに適用することで同様のことが可能になります。

最初にサンプルアプリケーションをデプロイしたときに利用したmanifestファイルには、レプリカ数に2を指定してありますので、これを適用することで4->2にスケールインしてみます。

kubectl apply -f ./kubernetes/cowweb.yaml

Podの一覧を表示すると、2個に減っていることがわかります。

kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
cowweb-57885b669c-9dzg4   1/1     Running   0          1h
cowweb-57885b669c-r7l4g   1/1     Running   0          1h

Note

現実の場面では、スケールアウト・インのような運用操作は、全てmanifestを編集してそれを適用するオペレーションとすることをおすすめします。manifestをソースコード管理システムで管理することによって、クラスターの構成変更をコードとして追跡可能になるためです。

5. Podの自動復旧

Kubernetesには、障害が発生してPodがダウンしたときに、自動的に新たなPodを立ち上げ直す機能が備わっています。

Podを削除することによって障害に相当する状況を作り、自動復旧される様子を確認してみましょう。

Podを削除するには、以下のコマンドを実行します。

kubectl delete [Pod名]

例えばこのようなコマンドとなります(実際のPod名は、kubectl get podsコマンドで確認してください)。

kubectl delete pod cowweb-57885b669c-9dzg4

この後すぐにPodの一覧を表示すると、削除したPodのPod名はなく、新しい名前のPodが起動していることがわかります。

NAME                      READY   STATUS    RESTARTS   AGE
cowweb-57885b669c-5mgrb   0/1     Running   0          7s    <- 新たに起動したPod
cowweb-57885b669c-r7l4g   1/1     Running   0          1h

DeploymentオブジェクトによってPod数を2個に指定されています。Podが削除されて1つになると、Kubernnetesは指定された数との差分を検知して自動的にPodを立ち上げてくれます。

以上で本チュートリアルは終了です。