Kubernetes Workloadsリソース： Deployment - RollingUpdateについて

[「Kubernetes完全ガイド」](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804) を元に、WorkloadsリソースDeployment及びRollingUpdateの動作確認を行った結果をまとめます。

##実行環境 / 参考情報
Kubernetes / kubectl version : 1.5.2
CentOS 7.4

※[構築手順1](https://qiita.com/m-eno/items/6caae931ea727f55f5c0)、[構築手順2](https://qiita.com/m-eno/items/4fa92ce812ce2a655d6c)
※[Kubernetes Workloadsリソースについて](https://qiita.com/m-eno/items/e2264789d21853eaa978)

##Deploymentとは
複数のReplicaSetを管理し、ローリング（無停止）アップデートやロールバックを実現するリソース。
Deploymentが[ReplicaSet](https://qiita.com/m-eno/items/5357671c6cbcc6ec5d5c)を管理し、ReplicaSetが[Pod](https://qiita.com/m-eno/items/e2264789d21853eaa978)を管理する階層構造となる。

ローリングアップデートの仕組みは、新規にReplicaSetを作成し、新規のReplicaSetのレプリカ数を徐々に増やし、既存のReplicaSetのレプリカ数を徐々に減らす事で実現。Kubernetesで最も推奨されるコンテナの起動方法。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251519/bf0d3ab0-5953-4519-837e-8ebd26fd2567.png)
出典：[「Kubernetes完全ガイド」](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804)

##Deploymentの作成
Updateは、RollingUpdate（Pod無停止）を選択。Update中に許容される不足Pod（maxUnavailable）は0、超過Pod（maxSurge）は1で作成

```json-doc:sample-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sample-deployment
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
      dnsPolicy: "ClusterFirst"
```
Deploymentの作成。
命名規則から、DeploymentがReplicaSetを作成し、ReplicaSetがPodを作成している事が分かる

```
[root@master ~]# kubectl apply -f sample-deployment.yaml
deployment "sample-deployment" created

[root@master ~]# kubectl get deployments
NAME                DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
sample-deployment   3         3         3            3           58s

[root@master ~]# kubectl get replicasets
NAME                           DESIRED   CURRENT   READY     AGE
sample-deployment-3071066810   3         3         3         1m

[root@master ~]# kubectl get pods
NAME                                 READY     STATUS    RESTARTS   AGE
sample-deployment-3071066810-2rm79   1/1       Running   0          1m
sample-deployment-3071066810-7tbgl   1/1       Running   0          1m
sample-deployment-3071066810-p5jsx   1/1       Running   0          1m
```

## RollingUpdateの動作確認
Deploymentで利用しているコンテナイメージをnginx:1.12からnginx:1.13にUpdateし、
ローリングアップデートの動きを確認（新規ReplicaSet内のPod数を徐々に増やし、既存ReplicaSetから切り替える事で無停止で実現）

```
[root@master ~]# kubectl set image deployment sample-deployment nginx-container=nginx:1.13

[root@master ~]# kubectl get replicasets --watch
NAME                           DESIRED   CURRENT   READY     AGE
sample-deployment-3071066810   3         3         3         12m　#既存
sample-deployment-3152331451   1         0         0         0s　 #新規
sample-deployment-3152331451   1         0         0         0s
sample-deployment-3152331451   1         1         0         0s
sample-deployment-3152331451   1         1         1         2s
sample-deployment-3071066810   2         3         3         14m
sample-deployment-3071066810   2         3         3         14m
sample-deployment-3152331451   2         1         1         2s
sample-deployment-3071066810   2         2         2         14m
sample-deployment-3152331451   2         1         1         2s
sample-deployment-3152331451   2         2         1         2s
sample-deployment-3152331451   2         2         2         4s
sample-deployment-3071066810   1         2         2         14m
sample-deployment-3152331451   3         2         2         4s
sample-deployment-3071066810   1         2         2         14m
sample-deployment-3152331451   3         2         2         4s
sample-deployment-3152331451   3         3         2         4s
sample-deployment-3071066810   1         1         1         14m
sample-deployment-3152331451   3         3         3         5s
sample-deployment-3071066810   0         1         1         14m
sample-deployment-3071066810   0         1         1         14m
sample-deployment-3071066810   0         0         0         14m

# Updateの状況を確認
[root@master ~]# kubectl rollout status deployment sample-deployment
deployment "sample-deployment" successfully rolled out
```