Kubernetes 1.16: SIG Node の変更内容

## はじめに

[Kubernetes 1.16 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.16.md) から SIG Node の取り組みについてまとめます。

## What's new

なし

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

なし

## アップグレード時の注意点 (Urgent Upgrade Notes)

なし

## 非推奨・廃止される機能 (Deprecations and Removals)

- kubelet
    - 1.14で非推奨となった`--containerized`フラグが削除されました([#80043](https://github.com/kubernetes/kubernetes/pull/80043), [@dims](https://github.com/dims))
        - :memo: `--containerized`については[こちら](https://qiita.com/yuanying/items/bccec90e14c230b87d24#%E5%BB%83%E6%AD%A2%E3%81%95%E3%82%8C%E3%82%8B%E6%A9%9F%E8%83%BD-deprecations)を参照
    - `beta.kubernetes.io/os`と`beta.kubernetes.io/arch`ラベルはv1.14以来非推奨であり、v1.18で削除予定です
        - :memo:上記のラベルを利用している場合は`kubernetes.io/os`と`kubernetes.io/arch`を利用してください([Well-Known Labels, Annotations and Taints](https://kubernetes.io/docs/reference/kubernetes-api/labels-annotations-taints/#beta-kubernetes-io-arch-deprecated)
)
    - cAdvisorのjson endpointsは1.15以降非推奨です([#78504](https://github.com/kubernetes/kubernetes/pull/78504), [@dashpole](https://github.com/dashpole))
        - :memo: v1.17でデフォルトでdisableになるようです
    - `--node-labels`フラグで、[許可された特別なラベルとプレフィックスを持つもの](https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/0000-20170814-bounding-self-labeling-kubelets.md#proposal)以外の`kubernetes.io`や`k8s.io`プレフィックスを持つラベルをセットできなくなりました([#79305](https://github.com/kubernetes/kubernetes/pull/79305), [@paivagustavo](https://github.com/paivagustavo))


<!--
 - the `--containerized` flag was deprecated in 1.14 and has been removed ([#80043](https://github.com/kubernetes/kubernetes/pull/80043), [@dims](https://github.com/dims))


  - the `beta.kubernetes.io/os` and `beta.kubernetes.io/arch` labels, deprecated since v1.14, are targeted for removal in v1.18.

  - cAdvisor json endpoints have been deprecated since 1.15. ([#78504](https://github.com/kubernetes/kubernetes/pull/78504), [@dashpole](https://github.com/dashpole))

  - removed the ability to set `kubernetes.io`- or `k8s.io`-prefixed labels via `--node-labels`, other than the [specifically allowed labels/prefixes](https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/0000-20170814-bounding-self-labeling-kubelets.md#proposal). ([#79305](https://github.com/kubernetes/kubernetes/pull/79305), [@paivagustavo](https://github.com/paivagustavo))
-->


## 注目機能 (Notable Features)

- Beta
    - なし
- Alpha
    - RuntimeClassのための新しいadmission controllerを導入しました。対応するRuntimeClassNameが指定された場合、RuntimeClassは特定のRuntimeClassに関連付けられたPodのオーバーヘッドをPodの `spec`に適用されるようになります。PodOverheadはalpha機能としてKubernetes 1.16から利用可能です。([#78484](https://github.com/kubernetes/kubernetes/pull/78484), [@egernst](https://github.com/egernst))
        - :memo: PodOverheadsを使うとPod自体の作成にかかるOverheadをスケジューリング等に含めることが可能となります。Overheadは自動で決まるものではなくユーザが指定する必要があるようです。
    - Ephemeral containersがalpha機能として追加されました。一時的なコンテナをデバッグのような目的で実行中のPodに対して追加可能であり、これは`kubectl exec`が既存のコンテナでプロセスを実行する方法に似ています。また、`kubectl exec`と同様に、一時コンテナ用のリソースは予約されておらず、終了時に再起動されません。コンテナのnamespaceのターゲティングはまだ実装されていないため、Pod内の他のコンテナからプロセスを表示するには、[process namespace sharing](https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/)を有効にする必要があります。([#59484](https://github.com/kubernetes/kubernetes/pull/59484), [@verb](https://github.com/verb))
       - :memo: Ephemeral Containersについては[こちらの記事](https://qiita.com/superbrothers/items/85edec4d0232e0bbe2c0)へ


<!--
    - Introduce a new admission controller for RuntimeClass. Initially, RuntimeClass will be used to apply the pod overhead associated with a given RuntimeClass to the Pod `spec` if a corresponding RuntimeClassName is specified. PodOverhead is an alpha feature as of Kubernetes 1.16. ([#78484](https://github.com/kubernetes/kubernetes/pull/78484), [@egernst](https://github.com/egernst))


    - Ephemeral containers have been added in alpha. These temporary containers can be added to running pods for purposes such as debugging, similar to how `kubectl exec` runs a process in an existing container. Also like `kubectl exec`, no resources are reserved for ephemeral containers and they are not restarted when they exit. Note that container namespace targeting is not yet implemented, so [process namespace sharing](https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/) must be enabled to view process from other containers in the pod. ([#59484](https://github.com/kubernetes/kubernetes/pull/59484), [@verb](https://github.com/verb))
-->

- Misc
    - RuntimeClassのためのスケジューリングを追加しました。RuntimeClassは現在nodeSelectorのconstraintsとtolerationsを宣言でき、そこで宣言されたものはそのRuntimeClassを使うPodのPodSpecへマージされます。([#80825](https://github.com/kubernetes/kubernetes/pull/80825), [@tallclair](https://github.com/tallclair))
        - :memo:これにより事前にRuntimeClassを適切に設定しておけば、ユーザはRuntimeClassを指定するだけで、ノードのlabelやtaintを意識せずにRuntimeClassが利用できるノードを選択してPodを起動できるようになるようです
    - `--(kube|system)-reserved-cgroup`を`--cgroup-driver=systemd`で指定する場合、完全修飾cgroupfs名を利用可能になりました。([#78793](https://github.com/kubernetes/kubernetes/pull/78793), [@mattjmcnaughton](https://github.com/mattjmcnaughton))


<!--
- `Node`: Add scheduling support for RuntimeClasses. RuntimeClasses can now specify nodeSelector constraints & tolerations, which are merged into the PodSpec for pods using that RuntimeClass. ([#80825](https://github.com/kubernetes/kubernetes/pull/80825), [@tallclair](https://github.com/tallclair))
- `Node`: When specifying `--(kube|system)-reserved-cgroup`, with `--cgroup-driver=systemd`, it is now possible to use the fully qualified cgroupfs name (i.e. `/test-cgroup.slice`). ([#78793](https://github.com/kubernetes/kubernetes/pull/78793), [@mattjmcnaughton](https://github.com/mattjmcnaughton))
-->



## その他の注目機能(Other notable changes)

- PID cgroup controllerに関連するfeature gatesが無効になっている場合に、PID cgroup controllerの要件を削除しました([#79073](https://github.com/kubernetes/kubernetes/pull/79073), [@rafatio](https://github.com/rafatio))
    - :memo: この修正が入る前は`SupportPodPidsLimit`と`SupportNodePidsLimit`を無効にしても、PID cgroup controllerのために必要なシステム要件を満たす必要があり、対応していないkernelだった場合にkubeletが正常に起動しなかったようです。

- kubeletのNodeLeaseの潜在的なパフォーマンスの問題を修正しました。Kubeletは、APIサーバーから毎回取得する代わりに、キャッシュされたリースを使用してリースを更新しようとします。([#81174](https://github.com/kubernetes/kubernetes/pull/81174), [@answer1991](https://github.com/answer1991))

- `--cpu-manager-policy`フラグに無効なポリシー名を渡すと、単にフラグを無視して代わりに` cpumanager`のデフォルトポリシーを実行する代わりに、kubeletが失敗します。([#80294](https://github.com/kubernetes/kubernetes/pull/80294), [@klueska](https://github.com/klueska))

- kubeletのnode-status-update-frequencyに基づいて、ノードのリース更新間隔をよりヒューリスティックにします([#80173](https://github.com/kubernetes/kubernetes/pull/80173), [@gaorong](https://github.com/gaorong))

- CloudProviderによって報告されるノードIPのセットが変更された場合でも、Kubeletは同じプライマリノードIPをより確実に報告するようになりました。([#79391](https://github.com/kubernetes/kubernetes/pull/79391), [@danwinship](https://github.com/danwinship))

- コンテナのハッシュ値を計算するときは、ハッシュが変更されないように、「nil」または空のフィールドを省略します。コンテナ仕様にゼロ以外のデフォルト値を持つ新しいフィールドの場合、ハッシュは変更されます。([#57741](https://github.com/kubernetes/kubernetes/pull/57741), [@dixudx](https://github.com/dixudx))

- PodのrestartPolicyがNeverのときにkubeletがPod Sandboxの作成を再試行しないバグを修正しました([#79451](https://github.com/kubernetes/kubernetes/pull/79451), [@yujuhong](https://github.com/yujuhong))

- execのrediness/liveness probesのbodyの長さを制限しました。remote CRIやDocker shimはは最大16MBの出力を読み取り、そのうちexecプローブ自体が10kbを検査します。([#82514](https://github.com/kubernetes/kubernetes/pull/82514), [@dims](https://github.com/dims))
    - :memo: execで無限に出力するようなコマンドを使った場合に[ノードのリソースを使い切ってしまう問題](https://github.com/kubernetes/kubernetes/issues/70890)があり、それが修正されたようです。

- 単一のstatic podファイルおよびhttpエンドポイントからのpodファイルは、10 MBを超えることはできません。HTTP probeのペイロードは現在10KBへ切り詰められます。([#82669](https://github.com/kubernetes/kubernetes/pull/82669), [@rphillips](https://github.com/rphillips))

- PodOverheadの機能が有効な時、pod cgroupsへpod overheadの内容も適用するようになりました。([#79247](https://github.com/kubernetes/kubernetes/pull/79247), [@egernst](https://github.com/egernst))

- Node-Problem-Detector v0.7.1がGCIで使用されます([#80726](https://github.com/kubernetes/kubernetes/pull/80726), [@wangzhen127](https://github.com/wangzhen127))

- Node-Problem-Detector v0.7.1がaddonのdaemonsetで使用されます([#82140](https://github.com/kubernetes/kubernetes/pull/82140), [@wangzhen127](https://github.com/wangzhen127))

- cadvisor ProcessMetrics収集を有効にします([#79002](https://github.com/kubernetes/kubernetes/pull/79002), [@jiayingz](https://github.com/jiayingz))

- kubeletの`node-lease-renew-interval`をlease-renew-durationの0.25に変更します ([#80429](https://github.com/kubernetes/kubernetes/pull/80429), [@gaorong](https://github.com/gaorong))

- `--cloud-provider = external`でノードアドレスが存在しない場合、kubeletのホスト名と内部IPを設定しようとするようになりました ([#75229](https://github.com/kubernetes/kubernetes/pull/75229), [@andrewsykim](https://github.com/andrewsykim))


<!--
- Remove PIDs cgroup controller requirement when related feature gates are disabled
  ([#79073](https://github.com/kubernetes/kubernetes/pull/79073), [@rafatio](https://github.com/rafatio))
- Fix kubelet NodeLease potential performance issues. Kubelet now will try to update lease using cached one instead of get from API Server every time. ([#81174](https://github.com/kubernetes/kubernetes/pull/81174), [@answer1991](https://github.com/answer1991))
- Passing an invalid policy name in the `--cpu-manager-policy` flag will now cause the kubelet to fail instead of simply ignoring the flag and running the `cpumanager`’s default policy instead. ([#80294](https://github.com/kubernetes/kubernetes/pull/80294), [@klueska](https://github.com/klueska))
- Make node lease renew interval more heuristic based on node-status-update-frequency in kubelet ([#80173](https://github.com/kubernetes/kubernetes/pull/80173), [@gaorong](https://github.com/gaorong))
- Kubelet should now more reliably report the same primary node IP even if the set of node IPs reported by the CloudProvider changes. ([#79391](https://github.com/kubernetes/kubernetes/pull/79391), [@danwinship](https://github.com/danwinship))
- Omit `nil` or empty field when calculating container hash value to avoid hash changed. For a new field with a non-nil default value in the container spec, the hash would still get changed. ([#57741](https://github.com/kubernetes/kubernetes/pull/57741), [@dixudx](https://github.com/dixudx))
- Fix a bug where kubelet would not retry pod sandbox creation when the restart policy of the pod is Never ([#79451](https://github.com/kubernetes/kubernetes/pull/79451), [@yujuhong](https://github.com/yujuhong))
- Limit the body length of exec readiness/liveness probes. remote CRIs and Docker shim read a max of 16MB output of which the exec probe itself inspects 10kb. ([#82514](https://github.com/kubernetes/kubernetes/pull/82514), [@dims](https://github.com/dims))
- Single static pod files and pod files from http endpoints cannot be larger than 10 MB. HTTP probe payloads are now truncated to 10KB. ([#82669](https://github.com/kubernetes/kubernetes/pull/82669), [@rphillips](https://github.com/rphillips))
- Introduce support for applying pod overhead to pod cgroups, if the PodOverhead feature is enabled. ([#79247](https://github.com/kubernetes/kubernetes/pull/79247), [@egernst](https://github.com/egernst))
- Node-Problem-Detector v0.7.1 is used on GCI ([#80726](https://github.com/kubernetes/kubernetes/pull/80726), [@wangzhen127](https://github.com/wangzhen127))
- Node-Problem-Detector v0.7.1 is used for addon daemonset. ([#82140](https://github.com/kubernetes/kubernetes/pull/82140), [@wangzhen127](https://github.com/wangzhen127))
- Enable cAdvisor ProcessMetrics collecting. ([#79002](https://github.com/kubernetes/kubernetes/pull/79002), [@jiayingz](https://github.com/jiayingz))
- kubelet: change `node-lease-renew-interval` to 0.25 of lease-renew-duration ([#80429](https://github.com/kubernetes/kubernetes/pull/80429), [@gaorong](https://github.com/gaorong))
- Attempt to set the kubelet's hostname & internal IP if `--cloud-provider=external` and no node addresses exists ([#75229](https://github.com/kubernetes/kubernetes/pull/75229), [@andrewsykim](https://github.com/andrewsykim))
-->