Kubernetes 1.19 SIG-Node変更点調査

## はじめに

このページでは[Kubernetes 1.19のChangelog](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.19.md)を基に、SIG Nodeに関連する変更内容をまとめています。

## What's New(新情報)

### seccompがGeneral Availabilityへ

KubernetesのseccompサポートがGeneral Available(GA)となりました。この機能はワークロードセキュリティをPodやコンテナのシステムコールを制限することで高めるために利用されます。
これにより、`seccompProfile` フィールドが Pod と Container `securityContext` オブジェクトに追加されました。

```yaml
securityContext:
  seccompProfile:
    type: RuntimeDefault|Localhost|Unconfined # choose one of the three
    localhostProfile: my-profiles/profile-allow.json # only necessary if type == Localhost
```

`seccomp.security.alpha.kubernetes.io/pod`と`container.seccomp.security.alpha.kubernetes.io/...`のannotationは非推奨となり、Kubernetes v1.22.0で削除予定です。
いまのところ上記の新たに追加されたフィールドとannotationは相互に変換されるため、クラスタ内の既存のワークロードを変換するアクションは必要ありません。

- :memo: 利用可能なseccompを制御するPodSecurityPolicyはv1.19.0時点では専用フィールドはなく、annotationにより制御するようです

## Known Issues(既知の問題点)

- 特になし

## Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)

- 特になし

## Changes by Kind(種類別の変更)

### Deprecation

- 特になし

### API Change

- KubeletがGPUのようなアクセラレータのメトリクス収集を無効化する機能を追加しました([#91930](https://github.com/kubernetes/kubernetes/pull/91930), [@RenaudWasTaken](https://github.com/RenaudWasTaken))
  - :memo: cAdvisorからこれらベンダー依存の強いGPUのようなメトリクスを取得しないようにするものです
  - :memo: これらの移行手段としてはPod Resources APIやベンダーが各自実装したメトリクスを利用するようです
  - :memo: FeatureGatesの`DisableAcceleratorUsageMetrics`で制御が可能です
- クラスターアドミンはkubeletのコンフィグファイルで`enableSystemLogHander`をfalseに設定することで、`/logs`エンドポイントをオフにできるようになりました。enableSystemLogHandler は enableDebuggingHandlers も true に設定されている場合のみ true に設定できます。([#87273](https://github.com/kubernetes/kubernetes/pull/87273), [@SaranBalaji90](https://github.com/SaranBalaji90))
- ログのタイムスタンプに末尾のゼロが含まれ、固定幅を維持するようになりました。([#91207](https://github.com/kubernetes/kubernetes/pull/91207), [@iamchuckss](https://github.com/iamchuckss))
- Kubelet の --runonce オプションは、Kubelet の設定ファイルでも `runOnce` として利用できるようになりました。([#89128](https://github.com/kubernetes/kubernetes/pull/89128), [@vincent178](https://github.com/vincent178))
- Kubeletは`--logging-format`フラグにより、構造化ロギングをサポートするようになりました。([#91532](https://github.com/kubernetes/kubernetes/pull/91532), [@afrouzMashaykhi](https://github.com/afrouzMashaykhi))
  - :memo: textやjsonがフォーマットとして指定できるようです
- Feature Gatesの`HugePageStorageMediumSize`がデフォルトで有効になり、コンテナレベルで複数のサイズのHugePageリソースを利用できるようになりました ([#90592](https://github.com/kubernetes/kubernetes/pull/90592), [@bart0sh](https://github.com/bart0sh))
  - :memo: HugePageに関する公式ドキュメントは[こちら](https://kubernetes.io/docs/tasks/manage-hugepages/scheduling-hugepages/)
- Kubelet の --node-status-max-images オプションは、Kubelet の設定ファイルのnodeStatusMaxImageで利用できるようになりました。([#91275](https://github.com/kubernetes/kubernetes/pull/91275), [@knabben](https://github.com/knabben))
- kubeletの`--bootstrap-checkpoint-path`は削除されました。([#91577](https://github.com/kubernetes/kubernetes/pull/91577), [@knabben](https://github.com/knabben))
- kubeletの`--cloud-provider`や`--cloud-config`オプションは非推奨としてマークされました。([#90408](https://github.com/kubernetes/kubernetes/pull/90408), [@knabben](https://github.com/knabben))
- kubeletの`--enable-server`と`--provider-id`オプションがkubeletのコンフィグファイルの`enableServer`と`providerID`フィールドで利用可能になりました。 ([#90494](https://github.com/kubernetes/kubernetes/pull/90494), [@knabben](https://github.com/knabben))
- kubeletの`--kernel-memcg-notification`オプションがkubeletのコンフィグファイルのkernelMemcgNotificationで利用できるようになりました。([#91863](https://github.com/kubernetes/kubernetes/pull/91863), [@knabben](https://github.com/knabben))
- kubeletの`--really-crash-for-testing`と`--chaos-chance`オプションは非推奨としてマークされました。([#90499](https://github.com/kubernetes/kubernetes/pull/90499), [@knabben](https://github.com/knabben))
- kubeletの`--volume-plugin-dir`オプションはkubeletのコンフィグファイルのVolumePluginDirで利用できるようになりました。 ([#88480](https://github.com/kubernetes/kubernetes/pull/88480), [@savitharaghunathan](https://github.com/savitharaghunathan))

### Features

- CRI-APIのImageSpecオブジェクトへアノテーションを追加しました ([#90061](https://github.com/kubernetes/kubernetes/pull/90061), [@marosset](https://github.com/marosset))
- cgroups v2ノードバリデーションのサポートが追加されました([#89901](https://github.com/kubernetes/kubernetes/pull/89901), [@neolit123](https://github.com/neolit123))
- ノードレベルで異なるサイズのHugePageを事前に割り当てるサポートを追加しました([#89252](https://github.com/kubernetes/kubernetes/pull/89252), [@odinuge](https://github.com/odinuge))
- `v1beta1` device plugin APIへ新たに`GetPreferredAllocation()`が追加されました。([#92665](https://github.com/kubernetes/kubernetes/pull/92665), [@klueska](https://github.com/klueska))
- アドミッションプラグインのNodeRestrictionは新しいノードで作成する際にkubeletが許可されるノードラベルを、1.16以上でkubeletsが許容する`--node-labels`パラメータに制限するようになりました([#90307](https://github.com/kubernetes/kubernetes/pull/90307), [@liggitt](https://github.com/liggitt))
- 証明書のローテートするよう設定されたkubeletは、証明書切れのまでの残り時間を`certificate_manager_server_ttl_seconds`をゲージのメトリクスとして出よくするようになりました。([#91148](https://github.com/kubernetes/kubernetes/pull/91148), [@liggitt](https://github.com/liggitt)) 
- cgroups v2 ユニファイドモードを使用するホスト上での実行をサポート([#85218](https://github.com/kubernetes/kubernetes/pull/85218), [@giuseppe](https://github.com/giuseppe))
- Feature Gatesの`RotateKubeletClientCertificate`はGAへ昇格し、kubeletの--feature-gate RotateKubeletClientCertificate パラメータは1.20で削除される予定です。([#91780](https://github.com/kubernetes/kubernetes/pull/91780), [@liggitt](https://github.com/liggitt))

### Documentation

- 特になし

### Failing Test

- 特になし

### Bug or Regression

- CVE-2020-8557 (Medium)。コンテナ /etc/hosts ファイルを経由したノードローカルのサービス拒否([#92916](https://github.com/kubernetes/kubernetes/pull/92916), [@joelsmith](https://github.com/joelsmith))
  - :memo: `/etc/hosts`がephemeral storageの使用量としてカウントされない問題があったようです
  - :memo: これはv1.18.6, 1.17.9, 1.16.13でも修正されています
- `startupProbe`は設定しているが`readinessProbe`を設定しないコンテナは、`startupProbe`が完了する前`ready`とみなされていましたが、現在は`not ready`となるように修正されています([#92196](https://github.com/kubernetes/kubernetes/pull/92196), [@thockin](https://github.com/thockin))
- Dockershim security: Podのsandboxは常に`no-new-privileges`と`runtime/default` seccompプロファイルで動くようになりました。Custom ProfileがPodレベルでセットされた時、より小さなseccompプロファイルを持つようになりました。([#90948](https://github.com/kubernetes/kubernetes/pull/90948), [@pjbgf](https://github.com/pjbgf))
- 犠牲者がコンテナであるSystemOOMの検知を修正([#88871](https://github.com/kubernetes/kubernetes/pull/88871), [@dashpole](https://github.com/dashpole))
- サポートされているhuge pageのサイズが変更された場合の問題を修正([#80831](https://github.com/kubernetes/kubernetes/pull/80831), [@odinuge](https://github.com/odinuge))
- Topology Managerを有効にすると、再利用可能なCPUやdeviceの割り当てが行われない不具合を修正しました([#93189](https://github.com/kubernetes/kubernetes/pull/93189), [@klueska](https://github.com/klueska))
- CPUManager で、排他的な CPU を誤ったタイミングで解放する原因となっていたリグレッションを修正([#90377](https://github.com/kubernetes/kubernetes/pull/90377), [@cbf123](https://github.com/cbf123))
- initContainerから継承したapp Containerで排他的なCPUを稀に開放する可能性があったCPUManagerのリグレッションを修正 ([#90419](https://github.com/kubernetes/kubernetes/pull/90419)
- kubeletでパラメータcgroupPerQoS=falseかつcgroupRoot=/dockerとした時、cm.NodeAllocatableRootは`nodeAllocatableRoot=/docker/kubepods`を間違えて返す。正しくは`/docker`を返すべきである. ([#88970](https://github.com/kubernetes/kubernetes/pull/88970), [@mysunshine92](https://github.com/mysunshine92))
- kubelet resource metricsエンドポイントである/metrics/resourceにおいて、以下のメトリクスの名前を変更します
  - node_cpu_usage_seconds --> node_cpu_usage_seconds_total
  - container_cpu_usage_seconds --> container_cpu_usage_seconds_total
  これはv1.18.0で追加された[#86282](https://github.com/kubernetes/kubernetes/pull/86282)の部分的なrevertであり、最初は接尾語の_totalが削除されていました([#89540](https://github.com/kubernetes/kubernetes/pull/89540), [@dashpole](https://github.com/dashpole))
- Kubelet: kubeletのヘルプ情報に正しいタイプのフラグが表示されないバグを修正([#88515](https://github.com/kubernetes/kubernetes/pull/88515), [@SataQiu](https://github.com/SataQiu))
- cluster/ge/manifestsにあるコントロールプレーンマニフェストで静的なコントロールプレーンのPodのプライオリティをリストアします([#89970](https://github.com/kubernetes/kubernetes/pull/89970), [@liggitt](https://github.com/liggitt))
- 1.19rc1で追加されたWindowsノードのためのdevicemanagerをrevertします([#93263](https://github.com/kubernetes/kubernetes/pull/93263), [@liggitt](https://github.com/liggitt))
- mirror podからpod specのterminationGracePeriodSecondsを尊重するよう修正 ([#92442](https://github.com/kubernetes/kubernetes/pull/92442), [@tedyu](https://github.com/tedyu))
  - :memo: この修正はv1.19にしか入っていないようです
- status subresource経由でPodのstatusをアップデートすると、`status.podIP`と`status.podIPs`のフィールドが整形されているか検証されるようになりました。([#90628](https://github.com/kubernetes/kubernetes/pull/90628), [@liggitt](https://github.com/liggitt))
- Evictionするとき、Pending状態のPodはPDBのチェックなしに削除されます([#83906](https://github.com/kubernetes/kubernetes/pull/83906), [@michaelgugino](https://github.com/michaelgugino))
- [security] golang.org/x/text/encoding/unicodeの脆弱性対応 ([#92219](https://github.com/kubernetes/kubernetes/pull/92219), [@voor](https://github.com/voor))

### Other (Cleanup and Flake)

- Kubeletの`experimental-allocatable-ignore-eviction`オプションは非推奨としてマークされました([#91578](https://github.com/kubernetes/kubernetes/pull/91578), [@knabben](https://github.com/knabben))
- Feature GateのPodShareProcessNamespaceは削除され、PodShareProcessNamespaceは無条件に有効となります。([#90099](https://github.com/kubernetes/kubernetes/pull/90099), [@tanjunchen](https://github.com/tanjunchen))
- kube-apiserver の `--kubelet-https` フラグは非推奨です。 kube-apiserver の kubelets への接続は無条件に `https` を使うようになりました (kubelets は v1.0 以前から apiserver が通信するエンドポイントには無条件に `https` を利用しています)。([#91630](https://github.com/kubernetes/kubernetes/pull/91630), [@liggitt](https://github.com/liggitt)
- corefile-migrationライブラリをv1.0.8へアップデート([#91856](https://github.com/kubernetes/kubernetes/pull/91856), [@wawa0210](https://github.com/wawa0210))
- opencontainers/runtime-specをv1.0.2へアップデート([#89644](https://github.com/kubernetes/kubernetes/pull/89644), [@saschagrunert](https://github.com/saschagrunert))
- `beta.kubernetes.io/os` と `beta.kubernetes.io/arch` のノードラベルは非推奨です。node selectorを`kubernetes.io/os` と `kubernetes.io/arch` を使うように更新してください。([#91046](https://github.com/kubernetes/kubernetes/pull/91046), [@wawa0210](https://github.com/wawa0210))