15Stepで習得 Dockerから入るKubernetes その5

ロールアウト・ロールバック

ロールアウト機能

ロールアウトとは、アプリケーションコンテナの更新
サービスが止まらないよう、古いPodと新しいPodを入れ替えることが可能

例)nginxの設定を変更する
手順

  1. nginxの設定を変更
  2. 新しいコンテナイメージとしてビルド
  3. コンテナイメージをリポジトリへ登録する
  4. マニフェストで指定されているコンテナイメージ新しいコンテナイメージに変更する
  5. ロールアウト

マニフェストファイルの作成

変更前のマニフェストをnginx-deployment2.yml、変更後のマニフェストをnignx-deployment3.ymlとする

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat nginx-deployment2.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
replicas: 5
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.16

nginxのバージョンは1.16

変更後

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat nginx-deployment3.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
replicas: 5
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.17

違いは

1
2
3
4
5
6
7
8
9
$ diff -u nginx-deployment2.yml nginx-deployment3.yml
--- nginx-deployment2.yml 2020-03-04 21:39:06.000000000 +0900
+++ nginx-deployment3.yml 2020-03-04 21:40:14.000000000 +0900
@@ -14,4 +14,4 @@
spec:
containers:
- name: nginx
- image: nginx:1.16
+ image: nginx:1.17

のようにバージョンのみ

マニフェストの適用

まずはnginx-deployment2.ymlから

1
2
3
4
5
6
7
8
9
$ kubectl apply -f nginx-deployment2.yml
deployment.apps/web-deploy created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
web-deploy-866f97c649-788hf 1/1 Running 0 6s
web-deploy-866f97c649-8hsr8 1/1 Running 0 6s
web-deploy-866f97c649-kfxmg 1/1 Running 0 6s
web-deploy-866f97c649-pqrbf 1/1 Running 0 6s
web-deploy-866f97c649-vrm6r 1/1 Running 0 6s

起動したことがわかる
詳細に見る場合はkubectl describeを利用する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ kubectl describe deployment web-deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Mon, 09 Mar 2020 21:46:59 +0900
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"web-deploy","namespace":"default"},"spec":{"replicas":5,"...
Selector: app=web
Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:1.16
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-866f97c649 (5/5 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 6s deployment-controller Scaled up replica set web-deploy-866f97c649 to 5

nginxのimageは1.16

次にnginx-deployment3.ymlを適用する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ kubectl apply -f nginx-deployment3.yml
deployment.apps/web-deploy configured
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
web-deploy-85477dddcd-4hzs9 0/1 ContainerCreating 0 4s
web-deploy-85477dddcd-4z7bw 0/1 ContainerCreating 0 4s
web-deploy-85477dddcd-crs96 0/1 ContainerCreating 0 4s
web-deploy-866f97c649-5z7r9 0/1 Terminating 0 2m48s
web-deploy-866f97c649-65fpv 1/1 Running 0 2m48s
web-deploy-866f97c649-7j7m6 1/1 Running 0 2m48s
web-deploy-866f97c649-nsw5d 1/1 Running 0 2m48s
web-deploy-866f97c649-vkwxd 1/1 Running 0 2m48s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
web-deploy-85477dddcd-4hzs9 1/1 Running 0 34s
web-deploy-85477dddcd-4z7bw 1/1 Running 0 34s
web-deploy-85477dddcd-5plrj 1/1 Running 0 23s
web-deploy-85477dddcd-848ww 1/1 Running 0 24s
web-deploy-85477dddcd-crs96 1/1 Running 0 34s

数十秒で入れ替わったことがわかる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$ kubectl describe deployment web-deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Mon, 09 Mar 2020 21:46:59 +0900
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 2
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"web-deploy","namespace":"default"},"spec":{"replicas":5,"...
Selector: app=web
Replicas: 5 desired | 5 updated | 5 total | 5 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-85477dddcd (5/5 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 4m24s deployment-controller Scaled up replica set web-deploy-866f97c649 to 5
Normal ScalingReplicaSet 100s deployment-controller Scaled up replica set web-deploy-85477dddcd to 2
Normal ScalingReplicaSet 100s deployment-controller Scaled down replica set web-deploy-866f97c649 to 4
Normal ScalingReplicaSet 100s deployment-controller Scaled up replica set web-deploy-85477dddcd to 3
Normal ScalingReplicaSet 90s deployment-controller Scaled down replica set web-deploy-866f97c649 to 3
Normal ScalingReplicaSet 90s deployment-controller Scaled up replica set web-deploy-85477dddcd to 4
Normal ScalingReplicaSet 89s deployment-controller Scaled down replica set web-deploy-866f97c649 to 2
Normal ScalingReplicaSet 89s deployment-controller Scaled up replica set web-deploy-85477dddcd to 5
Normal ScalingReplicaSet 88s deployment-controller Scaled down replica set web-deploy-866f97c649 to 1
Normal ScalingReplicaSet 85s deployment-controller (combined from similar events): Scaled down replica set web-deploy-866f97c649 to 0

nginxのimageが1.17になっているのがわかる。またEventsにロールアウトの履歴が残っていることがわかる

ロールバック機能

Kubernetesにおけるロールバック機能は「ロールアウト前の古いコンテナへ戻すためにPodを入れ替えること」をさす

ロールバックコマンド

以下の1行で実行できる

1
kubectl rollout undo deployment デプロイメント名

実際に実行してみる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ kubectl rollout undo deployment web-deploy
deployment.apps/web-deploy rolled back
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
web-deploy-85477dddcd-4hzs9 0/1 Terminating 0 11m
web-deploy-85477dddcd-4z7bw 1/1 Running 0 11m
web-deploy-85477dddcd-5plrj 1/1 Terminating 0 11m
web-deploy-85477dddcd-848ww 1/1 Terminating 0 11m
web-deploy-85477dddcd-crs96 1/1 Terminating 0 11m
web-deploy-866f97c649-2sfv5 0/1 ContainerCreating 0 2s
web-deploy-866f97c649-nwv7d 0/1 ContainerCreating 0 2s
web-deploy-866f97c649-qhvdr 1/1 Running 0 4s
web-deploy-866f97c649-xskvq 1/1 Running 0 5s
web-deploy-866f97c649-xw4zq 1/1 Running 0 5s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
web-deploy-85477dddcd-4z7bw 1/1 Terminating 0 11m
web-deploy-866f97c649-2sfv5 1/1 Running 0 7s
web-deploy-866f97c649-nwv7d 1/1 Running 0 7s
web-deploy-866f97c649-qhvdr 1/1 Running 0 9s
web-deploy-866f97c649-xskvq 1/1 Running 0 10s
web-deploy-866f97c649-xw4zq 1/1 Running 0 10s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
web-deploy-866f97c649-2sfv5 1/1 Running 0 12s
web-deploy-866f97c649-nwv7d 1/1 Running 0 12s
web-deploy-866f97c649-qhvdr 1/1 Running 0 14s
web-deploy-866f97c649-xskvq 1/1 Running 0 15s
web-deploy-866f97c649-xw4zq 1/1 Running 0 15s

実際に動いているバージョンを確認する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ kubectl describe deployment web-deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Mon, 09 Mar 2020 21:46:59 +0900
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 3
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"web-deploy","namespace":"default"},"spec":{"replicas":5,"...
Selector: app=web
Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:1.16
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-866f97c649 (5/5 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set web-deploy-85477dddcd to 2
Normal ScalingReplicaSet 12m deployment-controller Scaled down replica set web-deploy-866f97c649 to 4
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set web-deploy-85477dddcd to 3
Normal ScalingReplicaSet 12m deployment-controller Scaled down replica set web-deploy-866f97c649 to 3
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set web-deploy-85477dddcd to 4
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set web-deploy-866f97c649 to 2
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set web-deploy-85477dddcd to 5
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set web-deploy-866f97c649 to 1
Normal ScalingReplicaSet 11m deployment-controller (combined from similar events): Scaled down replica set web-deploy-866f97c649 to 0
Normal ScalingReplicaSet 32s deployment-controller Scaled up replica set web-deploy-866f97c649 to 2
Normal ScalingReplicaSet 32s deployment-controller Scaled down replica set web-deploy-85477dddcd to 4
Normal ScalingReplicaSet 31s deployment-controller Scaled up replica set web-deploy-866f97c649 to 3
Normal ScalingReplicaSet 29s (x2 over 14m) deployment-controller Scaled up replica set web-deploy-866f97c649 to 5
Normal ScalingReplicaSet 29s deployment-controller Scaled down replica set web-deploy-85477dddcd to 3
Normal ScalingReplicaSet 29s deployment-controller Scaled up replica set web-deploy-866f97c649 to 4
Normal ScalingReplicaSet 29s deployment-controller Scaled down replica set web-deploy-85477dddcd to 2
Normal ScalingReplicaSet 29s deployment-controller Scaled down replica set web-deploy-85477dddcd to 1
Normal ScalingReplicaSet 23s deployment-controller Scaled down replica set web-deploy-85477dddcd to 0

1.16に戻っていることがわかる

ロールアウト、ロールバック機能はサービスを停止することなくリリースを行うことができる
実際にアクセスできるサービスを立ち上げないと実感がわかないので、次はServiceについて調べてみる