Quantcast
Channel: kakakakakku blog
Viewing all articles
Browse latest Browse all 918

Deployment に revisionHistoryLimit を設定して ReplicaSet のリビジョン数を制御する

$
0
0

Kubernetes で Deploymentを使うときにマニフェストを修正して kubectl applyコマンドを繰り返し実行すると,ReplicaSetのリビジョンが増えていく.サンプルとして Deploymentimagenginx:1.8-alpinenginx:1.9-alpinenginx:1.10-alpineと修正しながらマニフェストを適用していくと以下のようになる.kubectl rollout historyコマンドを使うとリビジョンも確認できる.また kubectl apply--recordオプションを付けると操作履歴を記録できる.

# nginx:1.8-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit created

# nginx:1.9-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

# nginx:1.10-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

$ kubectl rollout history deployment sandbox-deployment-revision-history-limit
deployment.apps/sandbox-deployment-revision-history-limit
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment.yaml--record=true2         kubectl apply --filename=deployment.yaml--record=true3         kubectl apply --filename=deployment.yaml--record=true

$ kubectl get deployments,replicasets
NAME                                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/sandbox-deployment-revision-history-limit   3/333           91s

NAME                                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/sandbox-deployment-revision-history-limit-769f75d55b   000       90s
replicaset.apps/sandbox-deployment-revision-history-limit-7b94db8c49   000       51s
replicaset.apps/sandbox-deployment-revision-history-limit-7f87f5f547   333       28s

また Deploymentkubectl rollout undoコマンドを使うと過去のリビジョンにロールバックできる.さらに --to-revisionオプションと組み合わせれば,指定したリビジョンにロールバックすることもできる.ロールバックをしてもリビジョンは増えていく.

$ kubectl rollout undo deployment sandbox-deployment-revision-history-limit
deployment.apps/sandbox-deployment-revision-history-limit rolled back

$ kubectl rollout undo deployment sandbox-deployment-revision-history-limit --to-revision1
deployment.apps/sandbox-deployment-revision-history-limit rolled back

$ kubectl rollout history deployment sandbox-deployment-revision-history-limit
deployment.apps/sandbox-deployment-revision-history-limit
REVISION  CHANGE-CAUSE
3         kubectl apply --filename=deployment.yaml--record=true4         kubectl apply --filename=deployment.yaml--record=true5         kubectl apply --filename=deployment.yaml--record=true

リビジョン数のデフォルト値は 10

残る ReplicaSetのリビジョン数は Deployment.spec.revisionHistoryLimitフィールドで設定できる.デフォルトは 10となる.ドキュメントの表現だと「古いリビジョン (old revision)」となる.よって DESIRED = 0になって残っている ReplicaSetのことを指す.

kubernetes.io

まず「デフォルト値」を確認するために,引き続き nginx:1.11-alpineから nginx:1.18-alpineまで修正しながらマニフェストを繰り返し適用していく.すると,ReplicaSetの古いリビジョン数は「10個」になった.

# nginx:1.11-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

# nginx:1.12-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

# nginx:1.13-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

# nginx:1.14-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

# nginx:1.15-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

# nginx:1.16-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

# nginx:1.17-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

# nginx:1.18-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

$ kubectl get deployments,replicasets
NAME                                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/sandbox-deployment-revision-history-limit   3/333           5m

NAME                                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/sandbox-deployment-revision-history-limit-54f45b4c75   000       98s
replicaset.apps/sandbox-deployment-revision-history-limit-59b7cf78b9   000       2m16s
replicaset.apps/sandbox-deployment-revision-history-limit-6cb4d85b97   000       72s
replicaset.apps/sandbox-deployment-revision-history-limit-6d9d558bb6   000       84s
replicaset.apps/sandbox-deployment-revision-history-limit-6dfdf56756   000       60s
replicaset.apps/sandbox-deployment-revision-history-limit-769f75d55b   000       4m59s
replicaset.apps/sandbox-deployment-revision-history-limit-7b94db8c49   000       4m20s
replicaset.apps/sandbox-deployment-revision-history-limit-7dccdcc475   333       37s
replicaset.apps/sandbox-deployment-revision-history-limit-7f87f5f547   000       3m57s
replicaset.apps/sandbox-deployment-revision-history-limit-8565fb55f8   000       2m35s
replicaset.apps/sandbox-deployment-revision-history-limit-c544754bd    000       117s

次に nginx:1.19-alpineに修正してマニフェストを適用すると,以下のように最初に作られた replicaset.apps/sandbox-deployment-revision-history-limit-769f75d55bが削除された.なお,ドキュメントには The rest will be garbage-collected in the background.と書かれているため,kubectl applyのタイミングではなく,裏側で削除されていると言える.

# nginx:1.19-alpine
$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

$ kubectl get deployments,replicasets
NAME                                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/sandbox-deployment-revision-history-limit   3/333           6m

NAME                                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/sandbox-deployment-revision-history-limit-54f45b4c75   000       2m38s
replicaset.apps/sandbox-deployment-revision-history-limit-59b7cf78b9   000       3m16s
replicaset.apps/sandbox-deployment-revision-history-limit-6cb4d85b97   000       2m12s
replicaset.apps/sandbox-deployment-revision-history-limit-6d9d558bb6   000       2m24s
replicaset.apps/sandbox-deployment-revision-history-limit-6dfdf56756   000       2m
replicaset.apps/sandbox-deployment-revision-history-limit-7b94db8c49   000       5m20s
replicaset.apps/sandbox-deployment-revision-history-limit-7dccdcc475   000       97s
replicaset.apps/sandbox-deployment-revision-history-limit-7f87f5f547   000       4m57s
replicaset.apps/sandbox-deployment-revision-history-limit-8565fb55f8   000       3m35s
replicaset.apps/sandbox-deployment-revision-history-limit-c544754bd    000       2m57s
replicaset.apps/sandbox-deployment-revision-history-limit-f9f7485cd    333       25s

.spec.revisionHistoryLimitを設定する

最後に Deploymentのマニフェストに .spec.revisionHistoryLimit: 2を追加する.

apiVersion: apps/v1
kind: Deployment
metadata:name: sandbox-deployment-revision-history-limit
  labels:app: nginx
spec:replicas:3revisionHistoryLimit:2selector:matchLabels:app: nginx
  template:metadata:labels:app: nginx
    spec:containers:- name: nginx
        image: nginx:1.19-alpine
        ports:- containerPort:80

マニフェストを適用して,リビジョン数を確認すると,自動的に削除されていた.

$ kubectl apply -f deployment.yaml --record
deployment.apps/sandbox-deployment-revision-history-limit configured

$ kubectl get deployments,replicasets
NAME                                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/sandbox-deployment-revision-history-limit   3/333           8m

NAME                                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/sandbox-deployment-revision-history-limit-6dfdf56756   000       4m
replicaset.apps/sandbox-deployment-revision-history-limit-7dccdcc475   000       3m37s
replicaset.apps/sandbox-deployment-revision-history-limit-f9f7485cd    333       2m25s

まとめ

Kubernetes で Deployment.spec.revisionHistoryLimitフィールドを設定するとリビジョン数を制御できる.ドキュメントにはリビジョンを多く残すと,etcdのリソースを消費したり,kubectl get replicasetsコマンドの結果が見にくくなると書いてある.最適値は状況によって異なるとは思うけど,デフォルト値 10は多すぎるようにも感じる..spec.revisionHistoryLimitフィールドを覚えておこう!


Viewing all articles
Browse latest Browse all 918

Trending Articles