最初のアプリケーションを動かしてみる¶
このチュートリアルでは、簡単なサンプルアプリケーションを使って、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
以上で本チュートリアルは終了です。