Kubernetes 1.15: SIG Node の変更内容

## はじめに

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

## What's new

なし

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

なし

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

* 非推奨であったkubeletのセキュリティコントロールである`AllowPrivileged`, `HostNetworkSources`, `HostPIDSources`, `HostIPCSources`は削除されました。代わりにPodSecurityPolicyなどのAdmission Controllを介してこれらの制御をする必要があります。 ([#77820](https://github.com/kubernetes/kubernetes/pull/77820), [@msau42](https://github.com/msau42))

* 非推奨であったkubeletの`--allow-privileged`は削除されました。kubeletのスクリプトまたはマニフェストから、このフラグを削除してください。([#77820](https://github.com/kubernetes/kubernetes/pull/77820), [@msau42](https://github.com/msau42))

* kubeletはノード、コンテナランタイム、kubelet、pod、コンテナのcgroupsのメトリクスのみを収集するようになりました。([#72787](https://github.com/kubernetes/kubernetes/pull/72787), [@dashpole](https://github.com/dashpole))

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

**kubelet**

* `beta.kubernetes.io/os` と `beta.kubernetes.io/arch`ラベルはv1.14から非推奨です。これらはv1.18で削除される予定です。
* v1.14から非推奨となっている`--containerized`は将来のバージョンで削除されます。([#74267](https://github.com/kubernetes/kubernetes/pull/74267), [@dims](https://github.com/dims))
   * :pencil: `--containerized`フラグについては[Kubernetes 1.14: SIG Node の変更内容](https://qiita.com/yuanying/items/bccec90e14c230b87d24#廃止される機能-deprecations)で@yuanyingさんがまとめています。
* cAdvisorのjson endpointが非推奨となりました。([#78504](https://github.com/kubernetes/kubernetes/pull/78504), [@dashpole](https://github.com/dashpole))
  * :pencil: `/spec`, `/stats/*`が非推奨になりました。

## 注目機能 (Notable Features)

**Stable**

* サードパーティデバイスモニタリングがデフォルトで有効になりました(`KubeletPodResources`がベータへ)([#77274](https://github.com/kubernetes/kubernetes/pull/77274), [@RenaudWasTaken](https://github.com/RenaudWasTaken))
  * :pencil: v1.13, v1.14ではKubeletPodResourcesのfeature gatesを有効にすることで利用可能でした。CHANGELOGにはStableに記載されていましたがv1.15でKubeletPodResourcesはbetaに昇格しています
  * :pencil: この機能を使うとサードパーティデバイスのメトリクスを作成する際に、そのデバイスを利用しているPodやnamespaceなどの情報をkubelet経由で取得し、メトリクスのラベルに追加出来るような機能のようです。手元にGPUが無かったため検証できませんでしたが、例えば[こういう実装](https://github.com/NVIDIA/gpu-monitoring-tools/tree/master/exporters/prometheus-dcgm/k8s/pod-gpu-metrics-exporter#pod-gpu-metrics-exporter)があるようです。

**Beta**

* `SupportNodePidsLimit`がベータになり、デフォルトで有効になっています。feature gatesにて`SupportNodePidsLimit = true`を設定する必要はもうありません。([#76221](https://github.com/kubernetes/kubernetes/pull/76221), [@RobertKrawitz](https://github.com/RobertKrawitz))
  * :pencil: cpuやメモリと同様に`--system-reserved`や`--kube-reserved`でpidがデフォルトで指定可能になりました。

**Alpha**

なし

**Staging Repositries**

* CRI APIは、k8s.io/cri-apiステージングリポジトリで利用可能になりました。([#75531](https://github.com/kubernetes/kubernetes/pull/75531), [@dims](https://github.com/dims))
    * :pencil: https://github.com/kubernetes/kubernetes/tree/release-1.15/staging/src/k8s.io/cri-api

**Misc**

* Kubeletプラグインの登録に、プラグインの登録（CSIやデバイスプラグインなど）が失敗した場合の再試行およびexponential backoffロジックが追加されました。([#73891](https://github.com/kubernetes/kubernetes/pull/73891), @taragu)

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

* dockershimコンテナランタイムは、RuntimeClassからdockerランタイムハンドラを受け取るようになりました。 （[#78323](https://github.com/kubernetes/kubernetes/pull/78323), [@talclair](https://github.com/tallclair)）
  * :pencil: 下記のようなRuntimeClassを作成するとき`docker`をhandlerとして指定することができます。
    * v1.14.3で同じようにRuntimeClassを作成し、そのRumtimeClassを指定してもエラーでPodは起動できません。`Failed create pod sandbox: rpc error: code = Unknown desc = RuntimeHandler "docker" not supported`

```
apiVersion: node.k8s.io/v1beta1
kind: RuntimeClass
metadata:
  name: docker
handler: docker
```

* initコンテナはinitコンテナ自身のフィールドの値を環境変数として取得できるようになりました。([#75109](https://github.com/kubernetes/kubernetes/pull/75109), [@yuchengwu](https://github.com/yuchengwu))
  * :pencil: initコンテナが`env.valuesFrom.resourceFieldRef.containerName`で[検索されるコンテナの対象に含まれるようになりました](https://github.com/kubernetes/kubernetes/blob/release-1.15/pkg/api/v1/resource/helpers.go#L180-L185)。
* `UpdateContainerResources`オペレーションを行った際に`container_status`ラベルとして記録されなくなりました。現在は`update_container`ラベルを使用しています。 ([#75278](https://github.com/kubernetes/kubernetes/pull/75278), [@Nessex](https://github.com/Nessex))
  * :pencil: メトリクスのラベルが変わったようです。
* ブートストラップまたはクライアント証明書のローテーションが無効になっているとハートビート失敗時にkubelet-> API接続を閉じることができない問題を修正しました ([#78016](https://github.com/kubernetes/kubernetes/pull/78016), [@gaorong](https://github.com/gaorong))
* プラグインのソケットディレクトリに対してSELinuxラベルをセットする([#73241](https://github.com/kubernetes/kubernetes/pull/73241), [@vikaschoudhary16](https://github.com/vikaschoudhary16))
  * :pencil: SELinuxが有効かつUnprivilegedなプラグインを起動した場合にプラグインが正常に起動できないバグが修正されたようです。
* コンテナイメージの中で指定されているRoot以外のユーザIDの検出を修正しました。([#78261](https://github.com/kubernetes/kubernetes/pull/78261), [@tallclair](https://github.com/tallclair))
  * :pencil: `securityContext`で`runAsNonRoot: true`を指定し、Dockerfile等の中でRoot以外のユーザを指定しているイメージを利用しても検知されず `Error: container has runAsNonRoot and image will run as root`が発生するバグがありました。
* シグナル処理はそれを必要とするhyperkubeのそれぞれ(apiserverやkubeletなど)で初期化されるようになりました。([#76659](https://github.com/kubernetes/kubernetes/pull/76659), [@S-Chan](https://github.com/S-Chan))
* Kubeletは、apiserverからサポートされている場所でprotobufオブジェクトを適切に要求するようになり、大規模クラスタでの負荷が軽減されます。([#75602](https://github.com/kubernetes/kubernetes/pull/75602), [@smarterclayton](https://github.com/smarterclayton))