[第3回]Kubernetesの公式チュートリアルをやって基本を押さえる -スケールアウト-

2018.05.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

Kubernetesを勉強中です。Kubernetesは簡単に使えて、かつコンテナのデプロイや可用性を向上することができます。高度なことを簡単に使えるようにテクノロジーが注ぎ込まれています。 チュートリアルでは、クラスタの起動からアプリケーションのデプロイ、確認、公開、アップデートまで基本的なライフサイクルを身につけられます。分量が多いので数回に分けて、チュートリアルをやっていきましょう。

範囲

*の箇所が第3回の範囲です。

  • クラスターの作成
  • アプリケーションのデプロイ
  • アプリケーションの確認
  • アプリケーションの公開
  • *アプリケーションのスケールアウト
  • アプリケーションのアップデート

他の回はこちら

アプリケーションのスケールアウト

今までの章では、deploymentを作成し、アプリケーションの公開までを行いました。deploymentは1つのpodを作成します。トラフィックが増加した場合は、アプリケーションのスケールを行います。スケールはdeployentの中のreplicaの数を変更します。それに合わせpodの数が増減します。Autoscalingにも対応しますが、このチュートリアルではやりません。

このチュートリアルでは、kubectlを使ってdeploymentのスケールを行います。

deploymentのスケールアップ

deploymentの状態を確認します。podが1が起動しています。

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1         1         1            1           14h

DESIREDはユーザーがdeploy時に指定したレプリカ数、CURRENTは現在起動しているレプリカ数、UP-TO-DATEはDESIREDに従って起動しているレプリカ数、AVAILABLEは実際に有効なレプリカ数です。 では、レプリカの数を4に変更してみます。

$ kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment "kubernetes-bootcamp" scaled
$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4         4         4            4           15h

レプリカの数が4つになりました。今度はpodの数を確認します。

$ kubectl get pods -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5c69669756-64czk   1/1       Running   0          15h       172.17.0.3   minikube
kubernetes-bootcamp-5c69669756-8hlj6   1/1       Running   0          3m        172.17.0.5   minikube
kubernetes-bootcamp-5c69669756-lrl5w   1/1       Running   0          3m        172.17.0.7   minikube
kubernetes-bootcamp-5c69669756-wb2lw   1/1       Running   0          3m        172.17.0.6   minikube

異なるIPで4つのpodが起動しています。deploymentの状態を確認します。

$ kubectl describe deployments/kubernetes-bootcamp
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Wed, 09 May 2018 08:11:28 +0900
Labels:                 run=kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision=1
Selector:               run=kubernetes-bootcamp
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Pod Template:
  Labels:  run=kubernetes-bootcamp
  Containers:
   kubernetes-bootcamp:
    Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
    Port:         8080/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   kubernetes-bootcamp-5c69669756 (4/4 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  7m    deployment-controller  Scaled up replica set kubernetes-bootcamp-5c69669756 to 4

Eventsを見ると、replicaが4にスケーリングが発生していることがわかります。

ロードバランシング

serviceはトラフィックをロードバランシングします。まずは、serviceを作成します。

$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service "kubernetes-bootcamp" exposed
$ kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   run=kubernetes-bootcamp
Annotations:              <none>
Selector:                 run=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.103.8.134
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  32455/TCP
Endpoints:                172.17.0.3:8080,172.17.0.5:8080,172.17.0.6:8080 + 1 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

serviceのポート番号を取得し、podにアクセスします。トラフィックは各podにバランシングされます。アクセスするたびにpod名が変わっているのがわかります。

$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=32455
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-8hlj6 | v=1
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-wb2lw | v=1
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-8hlj6 | v=1
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-64czk | v=1
$(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-lrl5w | v=1

スケールダウン

レプリカ数を2に変更しスケールダウンさせます。

$ kubectl scale deployments/kubernetes-bootcamp --replicas=2
deployment "kubernetes-bootcamp" scaled
$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2         2         2            2           15h

podの状態を見て見ます。

$ kubectl get pods -o wide
NAME                                   READY     STATUS        RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5c69669756-64czk   1/1       Running       0          15h       172.17.0.3   minikube
kubernetes-bootcamp-5c69669756-8hlj6   1/1       Running       0          26m       172.17.0.5   minikube
kubernetes-bootcamp-5c69669756-lrl5w   1/1       Terminating   0          26m       172.17.0.7   minikube
kubernetes-bootcamp-5c69669756-wb2lw   1/1       Terminating   0          26m       172.17.0.6   minikube
$ kubectl get pods -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5c69669756-64czk   1/1       Running   0          15h       172.17.0.3   minikube
kubernetes-bootcamp-5c69669756-8hlj6   1/1       Running   0          28m       172.17.0.5   minikube

4つあったpodのうち2つがTerminatingと表示され、最終的にpodの数は2になりました。

最後に

replica数を変更することで、起動するpod数が変化しました。これで、スケールアウト/スケールインの動作が確認できました。 次回は最終回、デプロイされているアプリケーションのアップデートを行います。

他の回はこちら

参考

https://kubernetes.io/docs/tutorials/kubernetes-basics/