Kubernetes 1.20: SIG-Node (kubelet) の変更内容

# はじめに

この記事ではKubernetes 1.20 の CHANGELOG から SIG-Node (kubelet) の取り組みについてまとめています。

- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md

:pencil: がついている記述は私のコメントです（ほかは翻訳です）

他のSIGの変更点については[Kubernetes 1\.20: 変更点まとめ\(What's new\!\) \- Qiita](https://qiita.com/uesyn/items/f46b066772781317653d)をご覧ください。

# What's New (Major Themes)

## Dockershimの廃止

> ランタイムとしてのDockerは非推奨になりました。Dockerで生成されたイメージはこれまで同様すべてのランタイムで利用できます。Kubernetesコミュニティはこの件について[FAQページ](https://kubernetes.io/blog/2020/12/02/dockershim-faq/)と[ブログポスト](https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/)を書きました。

:pencil: これまでKubernetesではコンテナランタイムとしてDockerとCRIに準拠したランタイム（containerd, CRI-Oなど）がサポートされていました（kubeletの--container-runtimeオプションで選択可能）。DockershimというのはDockerをランタイムとして使うためのshim（詰め木）で、kubeletの中でCRIをDocker Engine APIに変換しています。今回の廃止はCRIへの一本化ということになります。Dockerを利用している場合、実際のコンテナはcontainerdで動いており、containerdはCRIで利用できるので、大抵のユースケースで大きな影響はないと考えられます。
Kubernetesコミュニティが親切な[FAQページ](https://kubernetes.io/blog/2020/12/02/dockershim-faq/)と[ブログポスト](https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/)を用意してくれています。また、@inductor さんがDockershim廃止に関する記事を書かれています。

- [Kubernetes 1.20からDockerが非推奨になる理由 - inductor's blog](https://blog.inductor.me/entry/2020/12/03/061329)
- [KubernetesのDockershim廃止における開発者の対応 - inductor's blog](https://blog.inductor.me/entry/2020/12/03/144834)
- [NVIDIA Docker(NVIDIA Container Toolkit)からnvidia-container-runtime + containerdに移行するために知っておくべきこと - inductor's blog](https://blog.inductor.me/entry/2020/12/13/042319)

## PID LimitがGAになりました

> 1年間のベータ（デフォルトで有効）を経て、PID LimitがGAになりました。SupportNodePidsLimit （ノードポッド間アイソレーション）とSupportPodPidsLimit（ポッドごとのPID制限）の2つの機能がGAになりました。

:pencil: Kubernetesではベータの機能はデフォルトで有効なので、ユーザにとって大きな変化はないかと思います。PID Limitについての公式ドキュメントは[こちら](https://kubernetes.io/docs/concepts/policy/pid-limiting/)です。Node PID制限を使うと、システムが使うPIDの数を確保し、PodによってPIDが使い尽くされることを避けられます。Pod PID制限を使うと、Podごとに利用可能なPIDの数を制限でき、特定のPodがPIDを使い尽くし他のPodに影響が出るのを避けられます。

## Graceful Node Shutdown (Alpha)

> GracefulNodeShutdown機能がアルファとして追加されました。これによりkubeletはノードシステムのシャットダウンを検知し、Podをgracefulに終了することができます。この機能はフィチャーゲートにより有効化できます。

:pencil: PRは[#96129](https://github.com/kubernetes/kubernetes/pull/96129)、KEPは[KEP-2000](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2000-graceful-node-shutdown)（キリ番！）です。この機能を利用するとノードがシャットダウンされる際に、Podを通常の終了処理で終了させたうえで、シャットダウンすることができます。この機能はsystemdのInhibitor Locksという機能を利用し実現されています。feature gateを有効化した上で、kubeletにShutdownGracePeriodを設定することで利用可能です。

## RuntimeClass機能がGAになりました

> [node.k8s.io](http://node.k8s.io/) APIグループはv1beta1からv1に昇格しました。v1beta1は非推奨になり、今後のリリースで削除予定ですのでv1をご利用ください。

:pencil: Podごとにコンテナランタイムの設定を切り替えられる、RuntimeClassがGAになりました。公式ドキュメントは[こちら](https://kubernetes.io/docs/concepts/containers/runtime-class/)。例えば、RuntimeClassを定義し、containerdやCRI-OといったCRIランタイムの設定をすることで、PodごとにruncやgVisorなどのOCIランタイムを切り替えることが可能です。

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

- kubeletでexec probeのタイムアウトが効かないバグが修正されました。デフォルトタイムアウトは1秒でexec probeによっては短いため、この修正は予期せぬ振る舞いをするかもしれません。これに該当するPodについては正しくprobeタイムアウトの設定をしてください。詳細については[configure probe](https://docs.k8s.io/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes)をご覧ください。
    - この変更はクラスタによっては予期せぬ振る舞いをするため、ExecProbeTimeoutフィーチャーゲートを無効化することで、この振る舞いを無効化できます。このフィーチャーゲートは将来強制有効化、削除され、常にprobeタイムアウトが効くようになります。( [#94115](https://github.com/kubernetes/kubernetes/pull/94115) , [@andrewsykim](https://github.com/andrewsykim) ) [SIG Node and Testing]
- RuntimeClass機能がGAになります。[node.k8s.io](http://node.k8s.io/) APIグループがv1beta1からv1に昇格します。v1beta1は非推奨となり、将来のリリースで削除予定です。v1をご利用ください。( [#95718](https://github.com/kubernetes/kubernetes/pull/95718) , [@SergeyKanzhelev](https://github.com/SergeyKanzhelev) ) [SIG Apps, Auth, Node, Scheduling and Testing]
- Windows Hyper-Vコンテナフィーチャーゲートは1.20で非推奨となり、1.21で削除されます( [#95505](https://github.com/kubernetes/kubernetes/pull/95505) , [@wawa0210](https://github.com/wawa0210) ) [SIG Node and Windows]

# Deprecation（非推奨になった事項）

- kubeletのDockerサポートは非推奨となり、将来のリリースで削除されます。kubeletは、Docker向けCRIサポートを実装しているdockershimと呼ばれるモジュールを利用しており、これはKubernetesコミュニティーでメンテナンス上の課題となっていました。成熟したCRI実装（v1alpha1またはv1準拠）が利用可能ですので、それらのコンテナランタイムへ移行することをお勧めします( [#94624](https://github.com/kubernetes/kubernetes/pull/94624) , [@dims](https://github.com/dims) ) [SIG Node]
- kubeletの非推奨エンドポイントであるmetrics_resource_v1alpha1が削除されました。metrics/resourceをご利用ください。( [#94272](https://github.com/kubernetes/kubernetes/pull/94272) , [@RainbowMango](https://github.com/RainbowMango) ) [SIG Instrumentation and Node]

# API Changes

- WindowsContainerResourcesとアノテーションをCRI-API UpdateContainerResourcesRequestに追加しました。( [#95741](https://github.com/kubernetes/kubernetes/pull/95741) , [@katiewasnothere](https://github.com/katiewasnothere) ) [SIG Node]
- kubeletのアルファ機能として、GracefulNodeShutdown機能を追加しました。これによりノードシステムのシャットダウンを検知し、Podをgracefulに終了できます。( [#96129](https://github.com/kubernetes/kubernetes/pull/96129) , [@bobbypage](https://github.com/bobbypage) ) [SIG Node]
- 外部向けのAPIであるpodresourcesがk8s.io/kubelet/pkg/apis/で利用可能です。 ( [#92632](https://github.com/kubernetes/kubernetes/pull/92632) , [@RenaudWasTaken](https://github.com/RenaudWasTaken) ) [SIG Node and Testing]
- kubeletのGPUメトリックはデフォルトで無効になりました。( [#95184](https://github.com/kubernetes/kubernetes/pull/95184) , [@RenaudWasTaken](https://github.com/RenaudWasTaken) )
- execベースのコンテナレジストリ認証情報プロバイダプラグインがkubeletでアルファサポートされました。( [#94196](https://github.com/kubernetes/kubernetes/pull/94196) , [@andrewsykim](https://github.com/andrewsykim) ) [SIG Node and Release]
- --topology-manager-scope=container|podの新しいフラグが導入されました。デフォルト値はcontainerスコープです。( [#92967](https://github.com/kubernetes/kubernetes/pull/92967) , [@cezaryzukowski](https://github.com/cezaryzukowski) ) [SIG Instrumentation, Node and Testing]
    - :pencil: KEPはこちら: https://github.com/kubernetes/enhancements/pull/1752
- RuntimeClassがGAになりました。[node.k8s.io](http://node.k8s.io/) APIグループはv1beta1からv1に昇格しました。( [#95718](https://github.com/kubernetes/kubernetes/pull/95718) , [@SergeyKanzhelev](https://github.com/SergeyKanzhelev) ) [SIG Apps, Auth, Node, Scheduling and Testing]

# Features

- Windowsにおいて、ワークロードがkubeletプロセスを中断し、ノードに影響を与えないために、プライオリティを設定する新しいフラグをkubeletに追加しました。( [#96051](https://github.com/kubernetes/kubernetes/pull/96051) , [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla) ) [SIG Node and Windows]
    - :pencil: ここで言及されているプライオリティとはWindowsプロセスのプライオリティのことのようです。
- SupportNodePidsLimitがGAに昇格しました。( [#94140](https://github.com/kubernetes/kubernetes/pull/94140) , [@derekwaynecarr](https://github.com/derekwaynecarr) )
    - :pencil: 詳細は上記のWhat's Newを参照してください。
- SetHostnameAsFQDNがベータになり、デフォルトで有効になりました。( [#95267](https://github.com/kubernetes/kubernetes/pull/95267) , [@javidiaz](https://github.com/javidiaz) ) [SIG Node]
- Windowsコンテナイメージ(OS Versions: 1809, 1903, 1909, 2004)向けサポートがpause:3.4イメージに追加されました。( [#91452](https://github.com/kubernetes/kubernetes/pull/91452) , [@claudiubelu](https://github.com/claudiubelu) ) [SIG Node, Release and Windows]

# Bug or Regression

- スタティックポッドのUIDがユニークになるように、Pod UIDの計算を変更しました。これによりインプレースアップグレード後に、コンテナが終了し再作成されることになります。( [#87461](https://github.com/kubernetes/kubernetes/pull/87461) , [@bboreham](https://github.com/bboreham) ) [SIG Node]
    - :pencil: これまでは同じスタティックマニフェストを持つPodはクラスタ全体で同一のUIDを持ってしまっていました。UIDはマニフェストのハッシュから計算されていますが、このハッシュを計算する際にノード名を含めるようになりました（そうなるように実装されていましたが、`hash.DeepHashObject`を呼んでしまい、意図せずリセットされてしまっていた模様です）
- kubeletのmapへの同時書き込みエラーを修正 ( [#93773](https://github.com/kubernetes/kubernetes/pull/93773) , [@knight42](https://github.com/knight42) ) [SIG Node]
- timeCacheロックのレースコンディションを修正 ( [#94751](https://github.com/kubernetes/kubernetes/pull/94751) , [@auxten](https://github.com/auxten) )
- validating admission webhookが存在すると、エフェメラルコンテナが利用できないバグを修正しました ( [#94685](https://github.com/kubernetes/kubernetes/pull/94685) , [@verb](https://github.com/verb) ) [SIG Node and Testing]
- RestartPolicy: OnFailureが設定されたPodにおいて、全コンテナが成功した場合に、新しいサンドボックスを作るバグを修正しました。 ( [#92614](https://github.com/kubernetes/kubernetes/pull/92614) , [@tnqn](https://github.com/tnqn) ) [SIG Node and Testing]
- 非LinuxでAppArmorを無視するように修正 ( [#93220](https://github.com/kubernetes/kubernetes/pull/93220) , [@wawa0210](https://github.com/wawa0210) ) [SIG Node and Windows]
- Windows Podがスタートする際、rootユーザチェックを無視するように修正 ( [#92355](https://github.com/kubernetes/kubernetes/pull/92355) , [@wawa0210](https://github.com/wawa0210) ) [SIG Node and Windows]
- `/proc/swaps`が存在しない場合は、スワップが無効化されているとみなすよう修正 ( [#93931](https://github.com/kubernetes/kubernetes/pull/93931) , [@SataQiu](https://github.com/SataQiu) ) [SIG Node]
- kubeletの設定でデフォルト値ではないcpuCFSQuotaPeriodを指定する場合、CustomCPUCFSQuotaPeriodフィーチャーゲートが必須になりました ( [#94687](https://github.com/kubernetes/kubernetes/pull/94687) , [@karan](https://github.com/karan) ) [SIG Node]
- 非推奨となったベータのos/archラベルを指定したワークロードがノードのスタートアップ時にスタックする問題を修正しました（1.19+でのリグレッション） ( [#96810](https://github.com/kubernetes/kubernetes/pull/96810) , [@liggitt](https://github.com/liggitt) ) [SIG Node]
    - :pencil: 初期ノード登録時に`beta.kubernetes.io/os`, `beta.kubernetes.io/arch`ラベルが設定されなくなっていたのを修正しているようです。
- cadvisorの`--containerd-namespace`フラグを設定できるように修正 ( [#87054](https://github.com/kubernetes/kubernetes/pull/87054) , [@changyaowei](https://github.com/changyaowei) ) [SIG Node]
- APIサーバからPodが削除される際に、コンテナランタイムのすべてのリソースも削除されることが保証されるようになりました。これにより、Pod削除に時間がかかるように見えます。 ( [#92817](https://github.com/kubernetes/kubernetes/pull/92817) , [@kmala](https://github.com/kmala) ) [SIG Node]

# Other

- `-redirect-container-streaming`は動作しなくなりました。このフラグはv1.22で削除されます ( [#95935](https://github.com/kubernetes/kubernetes/pull/95935) , [@tallclair](https://github.com/tallclair) ) [SIG Node]
- デフォルトのAccept-EncodingヘッダがHTTP probeから削除されました。詳細: [https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#http-probes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#http-probes) (#96127, @fonsecas72) [SIG Network and Node]
- verifyRunAsNonRootのログ情報を追加しました ( [#94911](https://github.com/kubernetes/kubernetes/pull/94911) , [@wawa0210](https://github.com/wawa0210) ) [SIG Node]
- コンテナ起動時に適切にログを出力するようにkubeletを修正しました。以前は、コンテナが最初に起動した際にも、コンテナが死んで再起動したと出力してしまっていました。この問題はInitコンテナと通常のコンテナがあるPodで発生していました ( [#91469](https://github.com/kubernetes/kubernetes/pull/91469) , [@rata](https://github.com/rata) )
- Windowsで不必要なセキュリティコンテキストを取り除くようになりました ( [#93475](https://github.com/kubernetes/kubernetes/pull/93475) , [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla) ) [SIG Node, Testing and Windows]
- GetAddressAndDialerのユニットテストを追加しました ( [#93180](https://github.com/kubernetes/kubernetes/pull/93180) , [@FreeZhang61](https://github.com/FreeZhang61) ) [SIG Node]