Skip to content

最初のアプリケーションを動かしてみる

このチュートリアルでは、簡単なサンプルアプリケーションを使って、Kubernetes上でコンテナを動かすオペレーションを体験します。

前提条件

  • 任意のKubernetesクラスター
  • 上記Kubernetesクラスターに接続可能なkubectl

Note

本チュートリアルで、ローカルPCにKubernetesクラスターを構成する手順もご案内していますので、適宜ご利用ください。

Note

以降の手順は、ほとんどの操作をコマンドラインツールから実行します。Mac/Linuxの場合はターミナル、Windowsの場合はWindows PowerShell利用するものとして、手順を記述します。

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

ここでは、簡単なサンプルアプリケーション(bootcamp)をデプロイして、クラスターの動作確認をします。

1.1. Namespaceを作成する

以降のチュートリアルの手順で利用するNamespaceとして、"bootcamp"を作成しておきます。

kubectl create namespace bootcamp

デフォルトNamespaceを"bootcamp"に変更しておくことで、kubectlの実行の度にNamespaceを指定しなくても良いようにしておきます。

kubectl config set-context $(kubectl config current-context) --namespace=bootcamp

1.2. bootcampのデプロイ

Kubernetesクラスターにサンプルアプリケーションをデプロイしてみます。以下のコマンドを実行します。

kubectl run kubernetes-bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080

上記コマンドにより、サンプルアプリケーションのデプロイを管理するDeploymentオブジェクトが作成されています。Deploymentオブジェクトの情報を確認するために、以下のコマンドを実行してみてください。

Deploymentの一覧の取得

kubectl get deployments

Deploymentの詳細情報の取得

kubectl describe deployments/kubernetes-bootcamp

Note

このアプリケーションは、Kubernetesの公式のインタラクティブ・チュートリアルで利用しているものと同じものです。

1.3. bootcampへのアクセス

アプリケーションにクラスターの外からアクセスするために、ここではkubectlの機能を使ってクラスター内に通じるプロキシを構成します。以下のコマンドを実行すると、localhostの8001ポートからクラスター内にアクセスできるようになります。

kubectl proxy

まずは、Kubernetesのマスターノードで稼働しているapiserverに対してリクエストを送信し、プロキシが機能していることを確認します。

Mac / Linux

curl http://localhost:8001/version

Windows

Invoke-RestMethod -Uri "http://localhost:8001/version"

Kubernetesのバージョン情報が、以下のようなJSON形式で取得できます。

{
  "major": "1",
  "minor": "7",
  "gitVersion": "v1.7.5",
  "gitCommit": "17d7182a7ccbb167074be7a87f0a68bd00d58d97",
  "gitTreeState": "clean",
  "buildDate": "2017-08-31T08:56:23Z",
  "goVersion": "go1.8.3",
  "compiler": "gc",
  "platform": "linux/amd
}

実際にアプリケーションにアクセスしてみます。以下のコマンドを順に実行してください。

Mac / Linux

export POD_NAME=$(kubectl get pods -o go-template \
    --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
curl http://localhost:8001/api/v1/proxy/namespaces/bootcamp/pods/$POD_NAME/

Windows

$POD_NAME=kubectl get pods -o go-template `
    --template '{{range .items}}{{.metadata.name}}{{\"\n\"}}{{end}}'
Invoke-RestMethod -Uri "http://localhost:8001/api/v1/proxy/namespaces/bootcamp/pods/$POD_NAME/"

正しく動作していれば、以下のようなレスポンスが返却されます。

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-2457653786-vdgr2 | v=1

これで、bootcampのバージョン1が動作していることが確認できました。

Note

kubectl proxyコマンドを使ったこの方法は、基本的にkubectlインストールされた環境でしか利用でませんので、アプリを一般公開するために使うことはできません。 管理用のダッシュボードや、Grafanaのような監視用のGUIにアクセスするときに利用するのが、一般的な用途です。

アプリケーションを一般に公開するには、後述するServiceオブジェクト等を利用します。

2. Podの状態の確認

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

2.1. Podの標準出力の表示

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

kubectl logs [Pod名]

前章で、環境変数POD_NAMEに、現在稼働しているbootcampのPod名を保存しましたので、以下のようにコマンドを呼び出すことができます。

kubectl logs $POD_NAME

2.2. Podの環境変数の確認

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

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

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

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

kubectl exec $POD_NAME env

kubectl execを利用すると、Podのシェルを利用することもできます。

kubectl exec -it $POD_NAME /bin/bash

2.3. 複数のPodの標準出力を一度にtailする

Podをスケールアウトすると、複数のPodの標準出力を同時に観察したい場面が出てきます。ここまでで紹介した方法では、個別にコマンドラインツールを立ち上げて、kubectl logsとする必要がありますが、Sternを使うとこの作業が容易になります。Sternは複数のPodの標準出力を、ひとつのコンソール上でまとめてtailするツールです。

Sternをインストールするには、利用しているPCの環境に合わせて以下の手順を実施します。

MacOS X

homebrewを使ってインストールします。

brew install stern

Windows / Linux

ビルド済みのバイナリを以下からダウンロードしてPATHを通します。

インストールが完了したら、以下のコマンドを実行してsternが利用できることを確認します。

stern -v

Note

sternはデフォルトでkubectlの設定情報を利用して動作しますので、kubectlが利用できていれば、追加の設定作業は必要ありません。

まずは、ひとつのPodの名前を指定してsternを実行してみます。以下のコマンドを実行して、kubectl logsのときと同様の内容が表示されることを確認してください。

stern $POD_NAME

Podの名前にワイルドカードを指定すると、それにマッチする複数のPodの標準出力を、同時に出力することができます。

stern kubernetes-bootcamp-*

3. Serviceを使ったアプリケーションの公開

Serviceは、クラスター内外にPodを公開するために利用するKubernetesオブジェクトです。ここでは、Serviceを利用して、bootcampアプリをクラスター外に公開してみます。

3.1. Serviceの作成

Serviceを作成するには、kubectl exposeを利用します。以下のコマンドを実行してください。

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

上記のコマンドでは、bootcampをデプロイするときに作成したDeploymentに対して、Serviceを構成しています。このDeploymentにスケールアウトを指示すると、自動的にDeploymentが管理する複数のPodがルーティング対象となります。

ServiceのタイプにはNodePortを指定しています。これはクラスターを構成する全てのNodeの所定のPort番号から、当該Serviceにアクセスできるようにする設定です。

--port 8080のオプションは、このサービスに対して8080番ポートでアクセスできることを意味しています。

以下のコマンドで、指定したServiceが構成されていることを確認します。

Serviceの一覧

kubectl get services

Serviceの詳細情報

kubectl describe services/kubernetes-bootcamp

Note

Serviceは、特別な場合を除いて、クラスター内から参照可能なIPアドレス(ClusterIP)とポート番号を持ちます。NodePortタイプのServiceを構成すると、Nodeの所定のポート番号に対するアクセスを、ServiceのClusterIPとポート番号に転送するように動作します。

Service作成時に指定したポート番号は、ServiceのClusterIPに紐づくポート番号であり、クラスター外に公開されているNodeのポート番号とは別のものだということに注意してください。

3.2. Serviceを介したアプリケーションへのアクセス

NodePortモードでServiceを構成していますので、Nodeの所定のポート番号から、アプリケーションにアクセスすることができます。

以下、この後の手順を簡単にするため、必要な値を環境変数に入れておきます。まず、Nodeの公開されているポート番号を、環境変数NODE_PORTに保存します。

Mac / Linux

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp \
    -o go-template='{{(index .spec.ports 0).nodePort}}')

Windows

$NODE_PORT=kubectl get services/kubernetes-bootcamp `
    -o go-template='{{(index .spec.ports 0).nodePort}}'

続いて、NodeのIPアドレスを環境変数NODE_IP_0, NODE_IP_1, ...に保存します。

Mac / Linux

まず、NodeのIPアドレスを表示します。

kubectl get nodes -o yaml | grep address

出力された内容のIPアドレスに当たる部分を、以下のように環境変数に格納していきます(以下の例で、IPアドレスを実際に出力された値に置き換えてください)。

export NODE_IP_0=172.17.8.102
export NODE_IP_1=172.17.8.103
...

Windows

まず、NodeのIPアドレスを表示します。

kubectl get nodes -o yaml | Select-String "address"

出力された内容のIPアドレスに当たる部分を、以下のように環境変数に格納していきます(以下の例で、IPアドレスを実際に出力された値に置き換えてください)。

$NODE_IP_0=echo '172.17.8.102'
$NODE_IP_1=echo '172.17.8.103'
...

NodeのIPアドレス/ポート番号に対してHTTPリクエストを送信すると、1.でkube proxyを利用したときと同様の、bootcampの応答が返却されます。

Mac / Linux

curl http://${NODE_IP_0}:${NODE_PORT}/

Windows

Invoke-RestMethod -Uri "http://${NODE_IP_0}:${NODE_PORT}/"

マルチノードのクラスターを構成している場合は、アクセス先のNodeを変更しても同じように応答が返却されることも確認してみてください。

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

この時点では、bootcampはひとつのPodで稼働している状態です。ここでは、Deploymentに対してレプリカの数を指定することによって、Podのスケールアウト/インを試してみます。

4.1. スケールアウト

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

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

kubectl scale deployments/kubernetes-bootcamp --replicas=4

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

kubectl get pods

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

NAME                                   READY     STATUS              RESTARTS   AGE
kubernetes-bootcamp-2457653786-bvhgb   0/1       ContainerCreating   0          24s
kubernetes-bootcamp-2457653786-kvqdj   0/1       ContainerCreating   0          24s
kubernetes-bootcamp-2457653786-mlbb8   1/1       Running             0          52m
kubernetes-bootcamp-2457653786-txsp5   1/1       Running             0          24s

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

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

この時点で、クラスターには複数のbootcampのPodがデプロイされている状態です。sternでワイルドカードを指定してすることにより、これらのPodの標準出力を一度に観察してみます。以下のコマンドでsternを起動してください。

stern kubernetes-bootcamp-*

以下の様に表示されます。これはPodの起動時のメッセージが4つのPod分表示されている状態です。

+ kubernetes-bootcamp-2457653786-txsp5 › kubernetes-bootcamp
kubernetes-bootcamp-2457653786-txsp5 kubernetes-bootcamp Kubernetes Bootcamp App Started At: 2017-11-20T03:42:40.704Z | Running On:  kubernetes-bootcamp-2457653786-txsp5
kubernetes-bootcamp-2457653786-txsp5 kubernetes-bootcamp
+ kubernetes-bootcamp-2457653786-bvhgb › kubernetes-bootcamp
kubernetes-bootcamp-2457653786-bvhgb kubernetes-bootcamp Kubernetes Bootcamp App Started At: 2017-11-20T03:43:06.276Z | Running On:  kubernetes-bootcamp-2457653786-bvhgb
kubernetes-bootcamp-2457653786-bvhgb kubernetes-bootcamp
+ kubernetes-bootcamp-2457653786-kvqdj › kubernetes-bootcamp
kubernetes-bootcamp-2457653786-kvqdj kubernetes-bootcamp Kubernetes Bootcamp App Started At: 2017-11-20T03:43:08.604Z | Running On:  kubernetes-bootcamp-2457653786-kvqdj
kubernetes-bootcamp-2457653786-kvqdj kubernetes-bootcamp

sternは複数のPodからの標準出力を自動的に色分けして表示します。実際に各Podからの出力が色で識別できることを確認してください。

続いて、Serviceに対して何度かリクエストを送信してみます。このとき、複数のPodから応答が返ってきていることを確認できます。

Mac / Linux

curl http://${NODE_IP_0}:${NODE_PORT}/

Windows

Invoke-RestMethod -Uri "http://${NODE_IP_0}:${NODE_PORT}/"

Note

複数のPodにどのようにリクエストが配分されるかは、環境によって異なります。上記の手順を実施してもリクエストが分散しない場合は、今リクエストが送られているPodを削除して、他のPodにルーティング先が切り替わることを確認してみましょう。

kubectl delete pod [現在リクエストが送られているPodの名前]

Kubernetsの自動回復の機能によって、削除された分のPodが新たに起動します。以下のコマンドで、Pod数が回復していることを確認してください。

kubectl get pod

再度リクエストを送信すると、先程までとは異なるPodにルーティング先が切り替わっていることが確認できます。

4.3. スケールイン

同様にしてPodを縮小することも可能です。以下のコマンドではレプリカを2つに縮小します。

kubectl scale deployments/kubernetes-bootcamp --replicas=2

同じようにリクエストを送信して、応答を返すPodの数が減っていることを確認してみてください。

4. クリーンアップ

これまで作ってきたオブジェクトをクリーンアップしたい場合は、以下のコマンドを実行して、Namespaceごとオブジェクトを削除してください。

kubectl delete namespace bootcamp

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