この記事は公開されてから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数が変化しました。これで、スケールアウト/スケールインの動作が確認できました。 次回は最終回、デプロイされているアプリケーションのアップデートを行います。
他の回はこちら