このセクションでは、Recreate による Pod のアップデートについて紹介します。 Recreate は、一度全ての Pod リソースを削除してから再度 Pod を作成してアップデートします。そのため、ダウンタイムが発生しますが、ローリングアップデートのように余剰のリソースを使わないことや切り替え完了が早いといったメリットがあります。

サンプルのマニフェストファイルを新規作成し、以下コードを記述します。

[root@kube-master sample-deployment]# vi sample-deployment-recreate.yaml 

spec に strategy 項目を記述し、type に Recreate を指定します。

[root@kube-master sample-deployment]# cat sample-deployment-recreate.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata:
  name: sample-deployment-recreate
spec:
  strategy:
    type: Recreate
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.13
          ports:
            - containerPort: 80

[root@kube-master sample-deployment]# 

Master サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。 – – record オプションを付けておくことで、アップデートを行った際の履歴を保持しておくことが可能です。

[root@kube-master sample-deployment]# kubectl apply -f sample-deployment-recreate.yaml --record
deployment.apps/sample-deployment-recreate created
[root@kube-master sample-deployment]# 

Master サーバーから ReplicaSet のリソースを確認します。- – watch オプションを付けることで、リソースの状態に変化あった場合の状態を常時確認することできます。ここでは、3つの Pod リソースを新規で作成した状態を確認できます。

[root@kube-master ~]# kubectl get replicasets --watch
NAME                                    DESIRED   CURRENT   READY   AGE
sample-deployment-recreate-7b4f67c7bc   3         0         0       0s
sample-deployment-recreate-7b4f67c7bc   3     0     0     0s
sample-deployment-recreate-7b4f67c7bc   3     3     0     0s
sample-deployment-recreate-7b4f67c7bc   3     3     1     1s
sample-deployment-recreate-7b4f67c7bc   3     3     2     2s
sample-deployment-recreate-7b4f67c7bc   3     3     3     2s

サンプルのマニフェストファイルを編集し、以下コードを変更します。

[root@kube-master sample-deployment]# vi sample-deployment-recreate.yaml 

コンテナイメージを nginx:1.13 から nginx:1.12 に変更します。

apiVersion: apps/v1
kind: Deployment 
metadata:
  name: sample-deployment-recreate
spec:
  strategy:
    type: Recreate
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.12
          ports:
            - containerPort: 80

Master サーバーから 変更したマニフェストを実行します。

[root@kube-master sample-deployment]# kubectl apply -f sample-deployment-recreate.yaml --record
deployment.apps/sample-deployment-recreate configured
[root@kube-master sample-deployment]# 

Master サーバーから ReplicaSet のリソースを – – watch オプションを付けて確認します。ここでは、最初に作成した 3つの Pod リソースが一旦全て削除され、再作成している状態が確認できます。

[root@kube-master ~]# kubectl get replicasets --watch
NAME                                    DESIRED   CURRENT   READY   AGE
sample-deployment-recreate-7b4f67c7bc   3         0         0       0s
sample-deployment-recreate-7b4f67c7bc   3     0     0     0s
sample-deployment-recreate-7b4f67c7bc   3     3     0     0s
sample-deployment-recreate-7b4f67c7bc   3     3     1     1s
sample-deployment-recreate-7b4f67c7bc   3     3     2     2s
sample-deployment-recreate-7b4f67c7bc   3     3     3     2s
sample-deployment-recreate-7b4f67c7bc   0     3     3     2m5s
sample-deployment-recreate-7b4f67c7bc   0     3     3     2m5s
sample-deployment-recreate-7b4f67c7bc   0     0     0     2m5s
sample-deployment-recreate-6c5948bf66   3     0     0     0s
sample-deployment-recreate-6c5948bf66   3     0     0     0s
sample-deployment-recreate-6c5948bf66   3     3     0     0s
sample-deployment-recreate-6c5948bf66   3     3     1     1s
sample-deployment-recreate-6c5948bf66   3     3     2     2s
sample-deployment-recreate-6c5948bf66   3     3     3     2s

Master サーバーから Deployment リソースの変更履歴を確認します。

[root@kube-master sample-deployment]# kubectl rollout history deployment sample-deployment-recreate
deployment.extensions/sample-deployment-recreate 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=sample-deployment-recreate.yaml --record=true
2         kubectl apply --filename=sample-deployment-recreate.yaml --record=true

[root@kube-master sample-deployment]#