Deployment/DaemonSet/StatefulSetのstrategy/updateStrategyについて

# これは何？
`Deployment`、`DaemonSet`、`StatefulSet`に設定する`strategy`、`updateStrategy`について、毎回調べている気がするので自分用に整理する。
ほぼ`kubectl explain`と[Kubernetes公式](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)の内容です。

# バージョン

クラスタは`kubeadm`産です。

```
# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:11:18Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
```

```
# kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:54Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
```

# strategy/updateStrategy
`Deployment`、`DaemonSet`、`StatefulSet`が`Pod`を更新する際に、"どう置き換えていくか"の戦略。

# Deployment

#### strategyについて

```
strategy     <Object>
  type       <string>
  rollingUpdate     <Object>
    maxSurge        <string>
    maxUnavailable  <string>
```

* `Deployment`に設定するのは`strategy`という名前。
* `strategy`には`type`と`rollingUpdate`が設定できる。
* `rollingUpdate`には`maxSurge`と`maxUnavailable`が設定できる。

#### typeとrollingUpdateについて

```
   type              <string>
     Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate.
   rollingUpdate     <Object>
     Rolling update config params. Present only if DeploymentStrategyType = RollingUpdate.
```

* `type`は`Recreate`と`RollingUpdate`から選んで設定できる。デフォルトは`RollingUpdate`。
    * `Recreate`は、`Pod`を一気に全部止めて新バージョンで作り直す。サービス断が発生する。
    * `RollingUpdate`は、部分的に`Pod`を置き換えていく。
        * 新旧`Pod`が混在する期間中に`Pod`が"どれだけ規定数を超過してよいか"を設定するのが`maxSurge`。(個数 or %)
        * 最大何個まで`Pod`が止まってもいいかを設定するのが`maxUnavailable`。(個数 or %)
* `rollingUpdate`に値を設定するのは、`type`が`RollingUpdate`の場合のみ。

# DaemonSet

#### updateStrategyについて

```
updateStrategy  <Object>
  type          <string>
  rollingUpdate     <Object>
    maxUnavailable  <string>
```

* `DaemonSet`に設定するのは`updateStrategy`という名前。
* `updateStrategy`には`type`と`rollingUpdate`が設定できる。
* `rollingUpdate`には`maxUnavailable`が設定できる。

#### typeとrollingUpdateについて

```
   type              <string>
     Type of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is OnDelete.
   rollingUpdate     <Object>
     Rolling update config params. Present only if type = "RollingUpdate".
```

* `type`は`RollingUpdate`と`OnDelete`から選んで設定できる。デフォルトは`OnDelete`。
    * `OnDelete`は、更新を`apply`した後に`Pod`を削除することで、初めて新バージョンの`Pod`が作成される。
* `rollingUpdate`に値を設定するのは、`type`が`RollingUpdate`の場合のみ。

# StatefulSet

#### updateStrategyについて

```
updateStrategy  <Object>
  type          <string>
  rollingUpdate    <Object>
    partition      <integer>
```

* `StatefulSet`に設定するのは`updateStrategy`という名前。
* `updateStrategy`には`type`と`rollingUpdate`が設定できる。
* `rollingUpdate`には`partition`が設定できる。
    * `partiton`は`StatefulSet`で管理する`Pod`に`0`から採番される始まる序数を対象とする。設定された値以上の序数の`Pod`は更新され、未満の`Pod`は更新されない。段階的に更新したい時に用いる。

#### typeとrollingUpdateについて

```
   type            <string>
     Type indicates the type of the StatefulSetUpdateStrategy. Default is RollingUpdate.
   rollingUpdate   <Object>
     RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType.
```

* `type`は`RollingUpdate`と`OnDelete`から選んで設定できる。デフォルトは`RollingUpdate`。
* `rollingUpdate`に値を設定するのは、`type`が`RollingUpdate`の場合のみ。

# おわり
* `Deployment`は`strategy`、`DaemonSet`と`StatefulSet`は`updateStrategy`となっていて、ここでいつもどっちだっけ？となっていた。
* `kubectl explain`と[Kubernetes公式](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)で書いている内容にズレがあることがたまにあるので注意する。