目次
- 前回のあらすじ
- デプロイメントコントローラ
- スケール機能
- ロールアウト機能
- ロールバック機能
- 自己回復機能
- 用語
- あとがき
前回のあらすじ
前回のkubernetesを学ぶ~その5~は、ヘルスチェックについて学んだ。ノード内に限った話であるので、機能がどの範囲であり、どういったチェックができるのか把握する必要があるのと同時に、「あー他(ノードとか)にも同じような機能があるんだろうなー。学ぶことやっぱり多いなー」と長旅の覚悟を決めた回でした。
デプロイメントコントローラ
kubernetesを学ぶ~その4~の時に、ReplicaSetについて少し触れましたが、その他にも機能があるのでこの機会に押させておきたいと思います。
デプロイメントコントローラは単独で動作するのではなくて、レプリカセットと連携してポッドを制御します。イメージは↓こんな感じかな。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pods --all-namespaces --sort-by=.spec.nodeName -o=custom-columns=NODE:.spec.nodeName,NAME:.metadata.name,IMAGE:.spec.containers[0].image
NODE NAME IMAGE
master dashboard-metrics-scraper-69fcc6d9df-jrcn2 kubernetesui/metrics-scraper:v1.0.1
master cluster-admin-74867ffb65-k6txp kubernetesui/dashboard:v2.0.0-beta6
master kube-proxy-75l8x k8s.gcr.io/kube-proxy:v1.14.10
master kube-scheduler-master k8s.gcr.io/kube-scheduler:v1.14.10
master kube-flannel-ds-amd64-s7kgq quay.io/coreos/flannel:v0.10.0-amd64
master coredns-6dcc67dcbc-fc5tf k8s.gcr.io/coredns:1.3.1
master coredns-6dcc67dcbc-s7bxw k8s.gcr.io/coredns:1.3.1
master etcd-master k8s.gcr.io/etcd:3.3.10
master kube-apiserver-master k8s.gcr.io/kube-apiserver:v1.14.10
master kube-controller-manager-master k8s.gcr.io/kube-controller-manager:v1.14.10
node1 kube-flannel-ds-amd64-cc5z6 quay.io/coreos/flannel:v0.10.0-amd64
node1 metrics-server-586b95bc44-6xd77 k8s.gcr.io/metrics-server-amd64:v0.3.6
node1 web-deploy-6b5f67b747-vs924 nginx:latest
node1 web-deploy-6b5f67b747-nprjn nginx:latest
node1 web-deploy-6b5f67b747-mw6fl nginx:latest
node1 kube-proxy-sxd7h k8s.gcr.io/kube-proxy:v1.14.10
node2 kube-proxy-2z75j k8s.gcr.io/kube-proxy:v1.14.10
node2 kube-flannel-ds-amd64-mnjxq quay.io/coreos/flannel:v0.10.0-amd64
node2 web-deploy-6b5f67b747-5hqdb nginx:latest
node2 readiness-check nginx
その他の機能が、次の通りあるので概要と検証をしてみようと思います。
- スケール機能
- ロールアウト機能
- ロールバック機能
- 自己回復機能
スケール機能
こちらは何度もやっているスケール機能です。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy #デプロイメントの名前
spec:
replicas: 4 #ポッドの数
selector: #レプリカセットとポッドを紐付けるためのラベル定義
matchLabels: #一致した場合の条件 他にもmatchExpressionsがある
app: web #ラベル名
template: #↓ポッドの定義
metadata:
labels:
app: web #レプリカセットとポッドを紐つけるためのポッド側ラベル名
spec:
containers:
- name: nginx
image: nginx:latest
※マニフェストでの検証は何度もやっているので省略。
現状確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po,deploy
NAME READY STATUS RESTARTS AGE
pod/readiness-check 1/1 Running 0 4d1h
pod/web-deploy-6b5f67b747-5hqdb 1/1 Running 0 62m
pod/web-deploy-6b5f67b747-mw6fl 1/1 Running 0 59m
pod/web-deploy-6b5f67b747-nprjn 1/1 Running 0 62m
pod/web-deploy-6b5f67b747-vs924 1/1 Running 0 62m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/web-deploy 4/4 4 4 62m
4→2へ変更
D:\Repository\kubernetes\vagrant-kubernetes>kubectl scale --replicas=2 deployment.extensions/web-deploy
deployment.extensions/web-deploy scaled
確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po,deploy
NAME READY STATUS RESTARTS AGE
pod/readiness-check 1/1 Running 0 4d1h
pod/web-deploy-6b5f67b747-5hqdb 1/1 Running 0 64m
pod/web-deploy-6b5f67b747-vs924 1/1 Running 0 64m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/web-deploy 2/2 2 2 64m
ロールアウト機能
ロールアウトはコンテナの更新を意味しています。ロールアウトをするには、変更したイメージをビルドした後、リポジトリに登録する必要があります。登録したリポジトリ名とタグ名をマニフェストに記載して、kubectl apply -f で適用します。
しかし、稼働中であればシステムを止めてアプリの更新!って中々出来ないです。得にデータベースが絡んだり、キャッシュを管理したりと要検討が必要です。とはいえ、軽微な改修などでシステム止めずにできないかなーと思うのですが、K8s出来るそうです。やった!
どうやるか?ロールアウトを徐々に進めていく方法です。クライアントからのリクエストに対処するポッドと停止して作り変えるポッドの数を指定して徐々に入れ替えて、これを繰り返して最終的にすべて新しくするというやり方です。
上の方で書いたマニフェストのnginxのバージョンを変更した2つのファイルを用意しました。
D:\Repository\kubernetes\vagrant-kubernetes>fc deployment_old.yml deployment_new.yml
ファイル deployment_old.yml と DEPLOYMENT_NEW.YML を比較しています
***** deployment_old.yml
- name: nginx
image: nginx:1.17
***** DEPLOYMENT_NEW.YML
- name: nginx
image: nginx:1.18
*****
検証してみましょう。
oldを適用
D:\Repository\kubernetes\vagrant-kubernetes>kubectl apply -f deployment_old.yml
deployment.apps/web-deploy configured
確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
web-deploy 3/4 2 3 110m
詳細確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl describe deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Fri, 12 Feb 2021 14:01:48 +0900
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=web
Replicas: 4 desired | 2 updated | 5 total | 3 available | 2 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:1.17
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True ReplicaSetUpdated
OldReplicaSets: web-deploy-6b5f67b747 (3/3 replicas created)
NewReplicaSet: web-deploy-69987c56dc (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 47m deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 2
Normal ScalingReplicaSet 30s deployment-controller Scaled up replica set web-deploy-6b5f67b747 to 4
Normal ScalingReplicaSet 29s deployment-controller Scaled up replica set web-deploy-69987c56dc to 1
Normal ScalingReplicaSet 29s deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 3
Normal ScalingReplicaSet 29s deployment-controller Scaled up replica set web-deploy-69987c56dc to 2
完全に完了していないけど、説明メモ。
describeの結果にある、
RollingUpdateStrategy: 25% max unavailable, 25% max surge
これが、ポッド最大25%停止を許容しまーす。最大25%の稼働超過も許容しまーす!ということらしい。
なので、replicas=4にしていたので
ポッド最大停止許容数=4-(40.25)=3.00 ということで最小で3個ポッドを維持
ポッド稼働超過許容数=4+(40.25)=5.00 ということで最大で5個ポッドを維持
をしながら切り替えを進めるのですね。
新しいマニフェスト適用
D:\Repository\kubernetes\vagrant-kubernetes>kubectl apply -f deployment_new.yml
deployment.apps/web-deploy configured
詳細
D:\Repository\kubernetes\vagrant-kubernetes>kubectl describe deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Fri, 12 Feb 2021 14:01:48 +0900
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 3
Selector: app=web
Replicas: 4 desired | 2 updated | 5 total | 3 available | 2 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:1.18
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True ReplicaSetUpdated
OldReplicaSets: web-deploy-69987c56dc (3/3 replicas created)
NewReplicaSet: web-deploy-5c87b8bff6 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 98s deployment-controller Scaled up replica set web-deploy-6b5f67b747 to 4
Normal ScalingReplicaSet 97s deployment-controller Scaled up replica set web-deploy-69987c56dc to 1
Normal ScalingReplicaSet 97s deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 3
Normal ScalingReplicaSet 97s deployment-controller Scaled up replica set web-deploy-69987c56dc to 2
Normal ScalingReplicaSet 46s (x2 over 48m) deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 2
Normal ScalingReplicaSet 46s deployment-controller Scaled up replica set web-deploy-69987c56dc to 3
Normal ScalingReplicaSet 41s deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 1
Normal ScalingReplicaSet 41s deployment-controller Scaled up replica set web-deploy-69987c56dc to 4
Normal ScalingReplicaSet 37s deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 0
Normal ScalingReplicaSet 3s (x3 over 3s) deployment-controller (combined from similar events): Scaled up replica set web-deploy-5c87b8bff6 to 2
確認 最大5個(readiness-checkは無視、別検証で使ったポッド)まで
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po
NAME READY STATUS RESTARTS AGE
readiness-check 1/1 Running 0 4d2h
web-deploy-5c87b8bff6-ks6qz 0/1 ContainerCreating 0 19s
web-deploy-5c87b8bff6-l9jxh 0/1 ContainerCreating 0 19s
web-deploy-69987c56dc-2sxj2 1/1 Running 0 62s
web-deploy-69987c56dc-drssl 1/1 Running 0 113s
web-deploy-69987c56dc-qrhr5 1/1 Running 0 113s
確認 稼働中を最低3つ守りつつ切り替え中
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po
NAME READY STATUS RESTARTS AGE
readiness-check 1/1 Running 0 4d2h
web-deploy-5c87b8bff6-4mlqg 1/1 Running 0 7s
web-deploy-5c87b8bff6-ks6qz 1/1 Running 0 30s
web-deploy-5c87b8bff6-l9jxh 1/1 Running 0 30s
web-deploy-5c87b8bff6-m9vsz 0/1 ContainerCreating 0 4s
web-deploy-69987c56dc-drssl 0/1 Terminating 0 2m4s
web-deploy-69987c56dc-qrhr5 0/1 Terminating 0 2m4s
無事切り替わり
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po
NAME READY STATUS RESTARTS AGE
readiness-check 1/1 Running 0 4d2h
web-deploy-5c87b8bff6-4mlqg 1/1 Running 0 15s
web-deploy-5c87b8bff6-ks6qz 1/1 Running 0 38s
web-deploy-5c87b8bff6-l9jxh 1/1 Running 0 38s
web-deploy-5c87b8bff6-m9vsz 1/1 Running 0 12s
詳細
D:\Repository\kubernetes\vagrant-kubernetes>kubectl describe deploy web-deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Fri, 12 Feb 2021 14:01:48 +0900
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 3
Selector: app=web
Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:1.18
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: web-deploy-5c87b8bff6 (4/4 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 3m23s deployment-controller Scaled up replica set web-deploy-6b5f67b747 to 4
Normal ScalingReplicaSet 3m22s deployment-controller Scaled up replica set web-deploy-69987c56dc to 1
Normal ScalingReplicaSet 3m22s deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 3
Normal ScalingReplicaSet 3m22s deployment-controller Scaled up replica set web-deploy-69987c56dc to 2
Normal ScalingReplicaSet 2m31s (x2 over 50m) deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 2
Normal ScalingReplicaSet 2m31s deployment-controller Scaled up replica set web-deploy-69987c56dc to 3
Normal ScalingReplicaSet 2m26s deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 1
Normal ScalingReplicaSet 2m26s deployment-controller Scaled up replica set web-deploy-69987c56dc to 4
Normal ScalingReplicaSet 2m22s deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 0
Normal ScalingReplicaSet 79s (x8 over 108s) deployment-controller (combined from similar events): Scaled down replica set web-deploy-69987c56dc to 0
ポッドには終了要求が送られているのでクライアントからのリクエストを返さずに終わる可能性が高いです。なので、アプリケーションの設計ではステートレスな設計が必須ですね。キャッシュを別に保管するとか。
ロールバック機能
新しくリリースした!!って後に、バグやんけ!!!切り戻ししないと!!という時、いつも吐きそうになります。そんな時に、簡単に元に戻せたらなーって思うのですが、そんな機能があるそうです。まじか!
ロールバック機能はロールアウト前のコンテナへ戻すためにポッドを入れ替えることとあります。ロールアウトと同じくクライアントからの要求に答えながら戻していく機能です。データベースのテーブル構造が変わったりする場合は別途検討が必要ですが。何度も言うけど。
やってみよう。
これだけ!
D:\Repository\kubernetes\vagrant-kubernetes>kubectl rollout undo deployment web-deploy
deployment.extensions/web-deploy rolled back
確認(ポッドを3個稼働は維持していますね)
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po
NAME READY STATUS RESTARTS AGE
readiness-check 1/1 Running 0 4d2h
web-deploy-5c87b8bff6-4mlqg 1/1 Terminating 0 31m
web-deploy-5c87b8bff6-ks6qz 1/1 Terminating 0 31m
web-deploy-5c87b8bff6-l9jxh 1/1 Running 0 31m
web-deploy-69987c56dc-2ksnw 1/1 Running 0 6s
web-deploy-69987c56dc-b5dxf 0/1 ContainerCreating 0 0s
web-deploy-69987c56dc-h7vkk 1/1 Running 0 6s
web-deploy-69987c56dc-ns8np 0/1 ContainerCreating 0 0s
確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po
NAME READY STATUS RESTARTS AGE
readiness-check 1/1 Running 0 4d2h
web-deploy-69987c56dc-2ksnw 1/1 Running 0 19s
web-deploy-69987c56dc-b5dxf 1/1 Running 0 13s
web-deploy-69987c56dc-h7vkk 1/1 Running 0 19s
web-deploy-69987c56dc-ns8np 1/1 Running 0 13s
詳細(バージョンもどってる)
D:\Repository\kubernetes\vagrant-kubernetes>kubectl describe deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Fri, 12 Feb 2021 14:01:48 +0900
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 4
Selector: app=web
Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:1.17
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: web-deploy-69987c56dc (4/4 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 33m deployment-controller Scaled up replica set web-deploy-6b5f67b747 to 4
Normal ScalingReplicaSet 33m deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 3
Normal ScalingReplicaSet 32m (x2 over 79m) deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 2
Normal ScalingReplicaSet 32m deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 1
Normal ScalingReplicaSet 32m deployment-controller Scaled down replica set web-deploy-6b5f67b747 to 0
Normal ScalingReplicaSet 31m (x8 over 31m) deployment-controller (combined from similar events): Scaled down replica set web-deploy-69987c56dc to 0
Normal ScalingReplicaSet 23s (x2 over 33m) deployment-controller Scaled up replica set web-deploy-69987c56dc to 2
Normal ScalingReplicaSet 23s deployment-controller Scaled down replica set web-deploy-5c87b8bff6 to 3
Normal ScalingReplicaSet 23s (x2 over 33m) deployment-controller Scaled up replica set web-deploy-69987c56dc to 1
Normal ScalingReplicaSet 17s (x2 over 32m) deployment-controller Scaled up replica set web-deploy-69987c56dc to 4
Normal ScalingReplicaSet 17s (x2 over 32m) deployment-controller Scaled up replica set web-deploy-69987c56dc to 3
Normal ScalingReplicaSet 17s deployment-controller Scaled down replica set web-deploy-5c87b8bff6 to 2
Normal ScalingReplicaSet 17s deployment-controller Scaled down replica set web-deploy-5c87b8bff6 to 1
Normal ScalingReplicaSet 12s deployment-controller Scaled down replica set web-deploy-5c87b8bff6 to 0
ちなみにデフォルトで戻せる履歴は10個までです。
kubectl rollout history deploy デプロイメントコントローラ名
で確認できます。
自己回復機能
デプロイメントコントローラはポッドが喪失した場合に自己回復機能があります。ハード障害でノードが死亡した時かなと思います。
ノードを停止させてポッドがどうなっていくのか確認します。
現状
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 10d v1.14.10
node1 Ready <none> 10d v1.14.10
node2 Ready <none> 10d v1.14.10
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
readiness-check 1/1 Running 0 4d3h 10.244.2.29 node2 <none> <none>
web-deploy-69987c56dc-2ksnw 1/1 Running 0 16m 10.244.2.36 node2 <none> <none>
web-deploy-69987c56dc-b5dxf 1/1 Running 0 16m 10.244.1.24 node1 <none> <none>
web-deploy-69987c56dc-h7vkk 1/1 Running 0 16m 10.244.1.23 node1 <none> <none>
web-deploy-69987c56dc-ns8np 1/1 Running 0 16m 10.244.2.37 node2 <none> <none>
node2を停止
D:\Repository\kubernetes\vagrant-kubernetes>vagrant halt node2
==> node2: Attempting graceful shutdown of VM...
少し時間を空ける
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 10d v1.14.10
node1 Ready <none> 10d v1.14.10
node2 NotReady <none> 10d v1.14.10
node1で稼働 Terminatingのままだった。Statusがunknownになると思っていたのだが。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
readiness-check 1/1 Terminating 0 4d3h 10.244.2.29 node2 <none> <none>
web-deploy-69987c56dc-2ksnw 1/1 Terminating 0 36m 10.244.2.36 node2 <none> <none>
web-deploy-69987c56dc-6h99r 1/1 Running 0 12m 10.244.1.25 node1 <none> <none>
web-deploy-69987c56dc-b5dxf 1/1 Running 0 36m 10.244.1.24 node1 <none> <none>
web-deploy-69987c56dc-h7vkk 1/1 Running 0 36m 10.244.1.23 node1 <none> <none>
web-deploy-69987c56dc-ns8np 1/1 Terminating 0 36m 10.244.2.37 node2 <none> <none>
web-deploy-69987c56dc-t6wn8 1/1 Running 0 12m 10.244.1.26 node1 <none> <none>
node2起動
D:\Repository\kubernetes\vagrant-kubernetes>vagrant up node2
通信したので情報が更新された。Terminatingのポッドは消えましたね。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-deploy-69987c56dc-6h99r 1/1 Running 0 17m 10.244.1.25 node1 <none> <none>
web-deploy-69987c56dc-b5dxf 1/1 Running 0 40m 10.244.1.24 node1 <none> <none>
web-deploy-69987c56dc-h7vkk 1/1 Running 0 40m 10.244.1.23 node1 <none> <none>
web-deploy-69987c56dc-t6wn8 1/1 Running 0 17m 10.244.1.26 node1 <none> <none>
node1で指定したポッド数4が起動していました。
ゆっくり時間をかけて起動していたので不安定な状態を防ぐためかなと思います。
用語
・ステートレス
サーバがクライアントのセッション状態を保持しないこと。
あとがき
手動でポッドの数を変えたりと試しては見たものの、放ったらかしでも安定してポッドの稼働数確保ができるのはいいのですが、システムを安定させるという意味では他にキャッシュやDBなど検討することがあるので頭いたすです。
次回は、DBを絡めた構成を検証してみようかな。