Kubernetes 1.17の変更点: Known Issues と Urgent Upgrade Notes

## はじめに

[Kubernetes 1.17 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.17.md) から Known Issues と Urgent Upgrade Notesについてまとめます。

## Known Issues(既知の問題)
- コンテナがprivilegedなとき、volumeDevicesマッピングが無視されます
- conformance testの`Should recreate evicted statefulset`が`Pod ss-0 expected to be re-created at least once`という理由で失敗します
    - これは`Predicate PodFitsHostPorts failed`というスケジューリングエラーで、根本原因はホストポートの`21017`ポートのコンフリクトです
    - このポートはノード上で稼働している他のアプリケーションにより一時的なポートとして既に使用されています
    - この問題は1.18で検討されます
- `NewDiscoveryClientForConfig`または`NewDiscoveryClientForConfigOrDie`を使って作られたclient-goのdiscovery clientはデフォルトで通常のディスカバリリクエストパターンに数秒かかるレート制限を設定されます
    - これは https://issue.k8s.io/86168 で修正され、v1.17.1で解決されます
    - workaroundとして、`Burst`の値は、`NewDiscoveryClientForConfig`または`NewDiscoveryClientForConfigOrDie`に渡されるrest.Configで調整できます

<!--
- volumeDevices mapping ignored when container is privileged
- The `Should recreate evicted statefulset` conformance [test]( https://github.com/kubernetes/kubernetes/blob/master/test/e2e/apps/statefulset.go) fails because `Pod ss-0 expected to be re-created at least once`. This was caused by the `Predicate PodFitsHostPorts failed` scheduling error. The root cause was a host port conflict for port `21017`. This port was in-use as an ephemeral port by another application running on the node. This will be looked at for the 1.18 release.
- client-go discovery clients constructed using `NewDiscoveryClientForConfig` or `NewDiscoveryClientForConfigOrDie` default to rate limits that cause normal discovery request patterns to take several seconds. This is fixed in https://issue.k8s.io/86168 and will be resolved in v1.17.1. As a workaround, the `Burst` value can be adjusted higher in the rest.Config passed into `NewDiscoveryClientForConfig` or `NewDiscoveryClientForConfigOrDie`.
-->

## Urgent Upgrade Notes(アップグレード前に確認が必要な注意点)

#### Cluster Lifecycle

- Kubeadm: 新しい`kubelet-finalize`フェーズを`init`ワークフローの一部として追加され、プライマリのコントロールプレーンノード上のkubeletのクライアント証明書のローテーションを自動化するためのサブフェーズが追加されます
        - 1.17より前で`kubeadm init`により作成された既存のノードでkubeletの証明書のローテーションを望む場合、`/etc/kubernetes/kubelet.conf`をPEMのシンボリックリンクを指すように修正しなければなりません
        - `client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem`および`client-key: /var/lib/kubelet/pki/kubelet-client-current.pem`を組み込みのクライアント証明書と置き換える必要があります([#84118](https://github.com/kubernetes/kubernetes/pull/84118), [@neolit123](https://github.com/neolit123))

#### Network

- EndpointSlices: EndpointSlicesが既に有効かされているクラスタをアップグレードする場合、EndpointSlice controllerにより管理されるべきEndpointSlicesは`http://endpointslice.kubernetes.io/managed-by` ラベルを`endpointslice-controller.k8s.io`へセットする必要があります
    - :memo: ChangeLogには`http://endpointslice.kubernetes.io/managed-by`とありますが、おそらく`endpointslice.kubernetes.io/managed-by`だと思われます

#### Scheduling

- Kubeadm: 追加のapiserverのauthorization-modeを追加する時、デフォルトの`Node, RBAC`は生成されるstatic Podのmanifestへ追加されなくなり、全てをオーバーライドが許可されます ([#82616](https://github.com/kubernetes/kubernetes/pull/82616), [@ghouscht](https://github.com/ghouscht))
    - :memo: デフォルト値が適用されなくなるため、この値を変更によりapiserverに追加のNode,RBACに加えてWebhook等を設定している場合、全て指定する必要がありそうです

#### Storage

- ブロックボリュームに使用されるパスがこのリリースで変更されたため、ノードのオンラインアップグレードが許可されないず、Kubernetesクラスターをアップグレードする前にすべてのノードをドレインする必要があります([#74026](https://github.com/kubernetes/kubernetes/pull/74026), [@mkimuram](https://github.com/mkimuram))


#### Windows

- Windowsコンテナの`RunAsUsername`機能がベータとなりました
- Widonws ワーカーノードは既存のWindows Server 2019のサポートに加え、Windows Server version 1903をサポートするようになりました
- RuntimeClassスケジューラーにより、LinuxまたはWindows Podを適切なノードに簡単にステアリングできるようになりました
- すべてのWindowsノードは、WindowsコンテナとWindowsワーカーノードの互換性を一致させるために必要なWindowsのメジャー、マイナー、ビルド番号を反映する新しいラベル `node.kubernetes.io/windows-build`を取得します

<!--

#### Cluster Lifecycle
- Kubeadm: add a new `kubelet-finalize` phase as part of the `init` workflow and an experimental sub-phase to enable automatic kubelet client certificate rotation on primary control-plane nodes.
Prior to 1.17 and for existing nodes created by `kubeadm init` where kubelet client certificate rotation is desired, you must modify `/etc/kubernetes/kubelet.conf` to point to the PEM symlink for rotation:
`client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem` and `client-key: /var/lib/kubelet/pki/kubelet-client-current.pem`, replacing the embedded client certificate and key. ([#84118](https://github.com/kubernetes/kubernetes/pull/84118), [@neolit123](https://github.com/neolit123))
#### Network
- EndpointSlices: If upgrading a cluster with EndpointSlices already enabled, any EndpointSlices that should be managed by the EndpointSlice controller should have a `http://endpointslice.kubernetes.io/managed-by` label set to `endpointslice-controller.k8s.io`.

#### Scheduling

- Kubeadm: when adding extra apiserver authorization-modes, the defaults `Node,RBAC` are no longer prepended in the resulting static Pod manifests and a full override is allowed. ([#82616](https://github.com/kubernetes/kubernetes/pull/82616), [@ghouscht](https://github.com/ghouscht))

#### Storage
- All nodes need to be drained before upgrading Kubernetes cluster, because paths used for block volumes are changed in this release, so on-line upgrade of nodes aren't allowed. ([#74026](https://github.com/kubernetes/kubernetes/pull/74026), [@mkimuram](https://github.com/mkimuram))

#### Windows
- The Windows containers RunAsUsername feature is now beta. 
- Windows worker nodes in a Kubernetes cluster now support Windows Server version 1903 in addition to the existing support for Windows Server 2019
- The RuntimeClass scheduler can now simplify steering Linux or Windows pods to appropriate nodes
- All Windows nodes now get the new label `node.kubernetes.io/windows-build` that reflects the Windows major, minor, and build number that are needed to match compatibility between Windows containers and Windows worker nodes.

-->