このセクションでは、RollingUpdate による Pod のアップデートについて紹介します。 RollingUpdate は、アップデート中に許容される不足 Pod 数( maxUnavailable )と超過 Pod 数( maxSurge )を指定し、余分のリソースを極力使用しないようにローリングアップデートするようにしたり、多くのリソースを消費しすばやくローリングアップデートするようにしたりすることができます。ローリングアップデートのため、Rcreate とはことなり基本的にはサービスを停止させることなくアップデートができます。

新しいPod を作成後したら古い Pod を削除

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

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

spec に strategy 項目を記述し、type に RollingUpdate を指定し、rollingUpdate に maxUnavailable と maxSurge の数を指定します。ここでは、maxUnavailable は 0、maxSurge は 1 としています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-deployment-rollingupdate
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  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 サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。 – – record オプションを付けておくことで、アップデートを行った際の履歴を保持しておくことが可能です。

[root@kube-master sample-deployment]# kubectl apply -f sample-deployment-rollingupdate.yaml --record
deployment.apps/sample-deployment-rollingupdate 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-rollingupdate-6c5948bf66   3         0         0       0s
sample-deployment-rollingupdate-6c5948bf66   3     0     0     1s
sample-deployment-rollingupdate-6c5948bf66   3     3     0     1s
sample-deployment-rollingupdate-6c5948bf66   3     3     1     2s
sample-deployment-rollingupdate-6c5948bf66   3     3     2     3s
sample-deployment-rollingupdate-6c5948bf66   3     3     3     3s

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

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-deployment-rollingupdate
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  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

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

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

Master サーバーから ReplicaSet リソースを確認します。ここでは、古い ReplicaSet( sample-deployment-rollingupdate-6c5948bf66 )と新しい ReplicaSet( sample-deployment-rollingupdate-7b4f67c7bc )が確認できます。

[root@kube-master sample-deployment]# kubectl get replicaset
NAME                                         DESIRED   CURRENT   READY   AGE
sample-deployment-rollingupdate-6c5948bf66   0         0         0       2m38s
sample-deployment-rollingupdate-7b4f67c7bc   3         3         3       36s
[root@kube-master sample-deployment]# 

Master サーバーから ReplicaSet のリソースを確認します。- – watch オプションを付けることで、リソースの状態に変化あった場合の状態を常時確認することできます。ここでは、新しい ReplicaSet( sample-deployment-rollingupdate-7b4f67c7bc )で 一つ Pod を作成した後に 古い ReplicaSet( sample-deployment-rollingupdate-6c5948bf66 )から一つ Pod を削除しアップデート処理がされていることが確認できます。

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

古い Pod を削除してから新しいPod を作成

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

[root@kube-master sample-deployment]# kubectl apply -f sample-deployment-rollingupdate.yaml --record
deployment.apps/sample-deployment-rollingupdate 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-rollingupdate-7b4f67c7bc   3         0         0       0s
sample-deployment-rollingupdate-7b4f67c7bc   3     0     0     0s
sample-deployment-rollingupdate-7b4f67c7bc   3     3     0     0s
sample-deployment-rollingupdate-7b4f67c7bc   3     3     1     1s
sample-deployment-rollingupdate-7b4f67c7bc   3     3     2     2s
sample-deployment-rollingupdate-7b4f67c7bc   3     3     3     2s

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

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

コンテナイメージを nginx:1.12 から nginx:1.13 に変更し、strategy の rolling Update にある maxUnavailable を 1、maxSurge を 0 に指定します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-deployment-rollingupdate
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 0
  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-rollingupdate.yaml --record
deployment.apps/sample-deployment-rollingupdate configured
[root@kube-master sample-deployment]# 

Master サーバーから ReplicaSet リソースを確認します。ここでは、古い ReplicaSet( sample-deployment-rollingupdate-7b4f67c7bc )と新しい ReplicaSet( sample-deployment-rollingupdate-6c5948bf66 )が確認できます。

[root@kube-master sample-deployment]# kubectl get replicaset
NAME                                         DESIRED   CURRENT   READY   AGE
sample-deployment-rollingupdate-6c5948bf66   3         3         3       5m19s
sample-deployment-rollingupdate-7b4f67c7bc   0         0         0       7m
[root@kube-master sample-deployment]# 

Master サーバーから ReplicaSet のリソースを確認します。- – watch オプションを付けることで、リソースの状態に変化あった場合の状態を常時確認することできます。ここでは、古い ReplicaSet( sample-deployment-rollingupdate-7b4f67c7bc )から 一つ Pod を削除した後に新しい ReplicaSet( sample-deployment-rollingupdate-6c5948bf66 )で一つ Pod を新規作成しアップデート処理がされていることが確認できます。

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