[第3回]Kubernetesの公式チュートリアルをやって基本を押さえる -スケールアウト-
コンニチハ、千葉です。
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数が変化しました。これで、スケールアウト/スケールインの動作が確認できました。 次回は最終回、デプロイされているアプリケーションのアップデートを行います。
他の回はこちら