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

本記事は，[Kubernetes 変更内容共有会(v1.24)](https://kubernetes-updates.connpass.com/event/246716/) の SIG-Node(kubelet)に関する資料として準備されました．Kubernetes 1.24の [CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md) から，SIG-Nodeに関するところを抜粋して紹介します．

:pencil: は筆者(@y1r96)による補足です．

## 所感
:pencil: Dockershim は v1.20 で deprecated になりましたが， v1.24 でついに廃止となりました．[パッチ](https://github.com/kubernetes/kubernetes/pull/97252) としては 53k 行の削除となりました．Dockerからcontainerdに移行した場合は，Kubernetes ノードの上で docker コマンドは使用できなくなりましたが，代わりに `nerdctl` を使用することができます． 他の変更としては，gRPC probe サポートは便利そうですね．

## Urgent Upgrade Notes

- DockershimによるDocker runtimeのサポートが完全に削除されました．KubeletはdockershimというDockerのCRIサポートを実装していましたが，コミュニティにおいてメンテナンス上の問題が発生していました．v1.24 以降はCRI (v1alpha1 もしくは v1）互換のコンテナランタイム実装を利用してください． ([#97252](https://github.com/kubernetes/kubernetes/pull/97252), [@dims](https://github.com/dims)) [sig/network,sig/node,sig/instrumentation,sig/testing,sig/cloud-provider]

- deprecatedなフラグ `--experimental-check-node-capabilities-before-mount` が削除されました．CSIはGAなのでそれが良い代替となります． kubelet scripts や manifests からこのフラグを削除してください． ([#104732](https://github.com/kubernetes/kubernetes/pull/104732), [@mengjiao-liu](https://github.com/mengjiao-liu)) [sig/storage,sig/node,sig/apps,sig/cloud-provider]

## Changes by Kind

### Deprecation

- Kubelet の `--pod-infra-container-image` フラグがdeprecatedになり，将来のリリースで削除されることになりました．([#108045](https://github.com/kubernetes/kubernetes/pull/108045), [@hakman](https://github.com/hakman)) [sig/node]
- `node.k8s.io/v1alpha1` RuntimeClass API は提供されなくなりました．代わりに v1.20 から利用可能な `node.k8s.io/v1` を使用してください． ([#103061](https://github.com/kubernetes/kubernetes/pull/103061), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [sig/node,sig/api-machinery,sig/cli,sig/testing]

### API Change

- `PodOverhead` 機能がGAしました．([#108441](https://github.com/kubernetes/kubernetes/pull/108441), [@pacoxu](https://github.com/pacoxu)) [sig/scheduling,sig/node,sig/api-machinery,sig/apps]
  - :pencil: [`PodOverhead`](https://kubernetes.io/docs/concepts/scheduling-eviction/pod-overhead/) は Pod を実行するときのランタイムが使用するリソースのオーバヘッドを RuntimeClass に記述するための機能です．ここで記述されたリソース量ははPodSpec内のリソースに加算されます．
- Kubelet が 終了コード1 で終了したときの defer function 内のログ出力のフラッシュに失敗する問題が修正されました．([#104774](https://github.com/kubernetes/kubernetes/pull/104774), [@kerthcet](https://github.com/kerthcet)) [sig/scheduling,sig/node]
- Kubelet external Credential Provider 機能が Betaになりました． Credential Provider Plugin と Credential Provider Config API は v1alpha1 からv1beta1 に APIの変更なしに移行しました．([#108847](https://github.com/kubernetes/kubernetes/pull/108847), [@adisky](https://github.com/adisky)) [sig/node,sig/api-machinery]
  - :pencil: [Kubelet Credential Providers](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2133-kubelet-credential-providers) は，イメージレジストリからのpullに使うcredentialを動的に取得するための機能で，プラグインにより他のレジストリをサポートできます．
- ステートフルなワークロードのフェイルオーバーのためのNon-graceful node shutdown handlingが有効になりました．([#108486](https://github.com/kubernetes/kubernetes/pull/108486), [@sonasingh46](https://github.com/sonasingh46)) [sig/storage,sig/node,sig/apps]
  - :pencil: [KEP: Non graceful node shutdown](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/2268-non-graceful-shutdown) は Kubelet の Node Shutdown Manager が検知できないようなノードシャットダウンに対処するための機能です．例えばRWOなVolumeをマウントしているStatefulSetがあった場合，VolumeAttachmentを削除しなければ別のノードにVolumeをアタッチできません．このKEPではこのような問題に対処します．
- `IdentifyPodOS` 機能が betaになりました．([#107859](https://github.com/kubernetes/kubernetes/pull/107859), [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla)) [sig/node,sig/api-machinery,sig/apps,sig/windows,sig/testing]
- gRPC probeサポートがbetaになりました．GRPCContainerProbe feature gateはデフォルトで有効です． ([#108522](https://github.com/kubernetes/kubernetes/pull/108522), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [sig/node,sig/api-machinery,sig/apps,sig/testing]
  - :pencil: Liveness Probe, Readiness Probe, Start Probe として gRPC を利用できるようになりました．

### Feature

- `kubelet_volume_stats_health_abnormal` という volume heath state を提供するメトリクスがKubeletに追加されました ([#105585](https://github.com/kubernetes/kubernetes/pull/105585), [@fengzixu](https://github.com/fengzixu)) [sig/storage,sig/node,sig/instrumentation,sig/testing]
- `container_oom_events_total` というメトリクスがKubelet cAdvisor metricに追加されました ([#108004](https://github.com/kubernetes/kubernetes/pull/108004), [@jonkerj](https://github.com/jonkerj)) [sig/node]
- Volumeマウントにかかる時間を計測するメトリクスがKubeletに追加されました ([#107006](https://github.com/kubernetes/kubernetes/pull/107006), [@gnufied](https://github.com/gnufied)) [sig/storage,sig/node]
- CRI-APIのCapabilities messageに `add_ambient_capabilities` が追加されました ([#104620](https://github.com/kubernetes/kubernetes/pull/104620), [@vinayakankugoyal](https://github.com/vinayakankugoyal)) [sig/node]
  - :pencil: [KEP: Ambient capabilities in Kubernetes](https://github.com/kubernetes/enhancements/blob/master/keps/sig-security/2763-ambient-capabilities/README.md) は，[Ambient capability](https://man7.org/linux/man-pages/man7/capabilities.7.html) を追加できるようにする機能です．Ambient capabilityは非特権な子プロセスにcapabilityを継承できる，Linux 4.3以降で利用できる機能のようです．
- no PodSandboxのメッセージが改善されました ([#107116](https://github.com/kubernetes/kubernetes/pull/107116), [@yxxhero](https://github.com/yxxhero)) [sig/node]
- `kubelet_volume_metric_collection_duration_seconds` という volume disk usage calculation duration を提供するメトリクスがKubeletに追加されました ([#107201](https://github.com/kubernetes/kubernetes/pull/107201), [@pacoxu](https://github.com/pacoxu)) [sig/storage,sig/node,sig/instrumentation]
- dockershimに関連する起動フラグ `--experimental-dockershim-root-directory`, `--docker-endpoint`, `--image-pull-progress-deadline`, `--network-plugin`, `--cni-conf-dir`, `--cni-bin-dir`, `--cni-cache-dir`, `--network-plugin-mtu` が削除されました ([#106907](https://github.com/kubernetes/kubernetes/pull/106907), [@cyclinder](https://github.com/cyclinder)) [sig/node,sig/testing,sig/cloud-provider]
- Pod Priolityに基づく graceful shutdown が Betaになりました ([#107986](https://github.com/kubernetes/kubernetes/pull/107986), [@wzshiming](https://github.com/wzshiming)) [sig/node,sig/instrumentation,sig/testing]
- feature gate `SetHostnameAsFQDN` が削除されました ([#108038](https://github.com/kubernetes/kubernetes/pull/108038), [@mengjiao-liu](https://github.com/mengjiao-liu)) [sig/node]
- Kubelet が `KUBE-IPTABLES-HINT` という iptables chain を `mangle` テーブルに追加するようになりました．host network namespaceにおいてiptablesルールを変更する必要があるコンテナ化されたコンポーネントが `iptables-legacy` か `iptables-nft` のどちらが利用されているシステムかどうかをより信頼性の高い方法で判定できるようになりました．([#109059](https://github.com/kubernetes/kubernetes/pull/109059), [@danwinship](https://github.com/danwinship)) [sig/network,sig/node]

### Bug or Regression

- Kubelet に `--node-ip` 引数で提供されたIPアドレスが，external cloud provider (CCM) を利用している時にノードのプライマリIPとして優先されるようになります．([#107750](https://github.com/kubernetes/kubernetes/pull/107750), [@stephenfin](https://github.com/stephenfin)) [sig/node,sig/cloud-provider]
- 高速に更新されたstatic podが，Kubeletが再起動されるまでfailしていた問題を修正します．([#107900](https://github.com/kubernetes/kubernetes/pull/107900), [@smarterclayton](https://github.com/smarterclayton)) [sig/node,sig/testing]
- `kubelet_volume_stats_health_abnormal` というvolume health state を提供するメトリクスがKubeletに追加されました ([#108758](https://github.com/kubernetes/kubernetes/pull/108758), [@fengzixu](https://github.com/fengzixu)) [sig/storage,sig/node,sig/instrumentation,sig/testing]
- アタッチ済みのvolumeがnot in-useなとき，exponential backoffをスキップすることでより高速にマウントされるようになります ([#106853](https://github.com/kubernetes/kubernetes/pull/106853), [@gnufied](https://github.com/gnufied)) [sig/storage,sig/node,sig/apps]
- CRI-API: `PodSandboxNetworkStatus` によって返却されたIPが，host-networkなpodにおいては無視されていました ([#106715](https://github.com/kubernetes/kubernetes/pull/106715), [@aojea](https://github.com/aojea)) [sig/node]
- `NodeExpand` を RWX volume の場合全ノードで呼ぶようにします ([#108693](https://github.com/kubernetes/kubernetes/pull/108693), [@gnufied](https://github.com/gnufied)) [sig/storage,sig/node,sig/apps]
- コンテナ起動の失敗が，時に `Succeeded` として考慮されていた問題を修正します ([#107845](https://github.com/kubernetes/kubernetes/pull/107845), [@smarterclayton](https://github.com/smarterclayton)) [sig/node]
- CPUリクエストが256コア以上だった場合にコンテナの作成に失敗していた問題を修正します ([#106570](https://github.com/kubernetes/kubernetes/pull/106570), [@odinuge](https://github.com/odinuge)) [sig/node]
- Fix libct/cg/fs2: Raspbian Bullseye において未サポートなhugetlb における GetStats が失敗していた問題を修正します ([#106912](https://github.com/kubernetes/kubernetes/pull/106912), [@Letme](https://github.com/Letme)) [sig/node]
- APIにおいて他のPodがCompletedだと報告されてすぐにPodがスケジュールされたときに，Podを誤って `OutOfCpu` だとして拒否していたregressionを修正します．Kubeletは，コンテナが全て終了して他のコンテナが作成されない状態になるまでAPIにPodが終了したと報告するのを待ちます．短命なPodの場合，1秒程度 Succedded か Failed と報告されるまでの時間がわずかに長くなることがあります． ([#108366](https://github.com/kubernetes/kubernetes/pull/108366), [@smarterclayton](https://github.com/smarterclayton)) [sig/node,sig/apps,sig/testing]
- Topology Managerにおいて，2以上のNUMAノードにまたがるallocationに関するバグを修正します． ([#108052](https://github.com/kubernetes/kubernetes/pull/108052), [@klueska](https://github.com/klueska)) [sig/node]
- アプリケーションのコンテナがInitContainerから継承したexclusiveなCPUを，InitContainerが削除された時に開放してしまうregressionを修正します ([#104837](https://github.com/kubernetes/kubernetes/pull/104837), [@eggiter](https://github.com/eggiter)) [sig/node]
- static podが追加または削除された場合に，いくらかのケースで再起動しない問題を修正します ([#107695](https://github.com/kubernetes/kubernetes/pull/107695), [@rphillips](https://github.com/rphillips)) [sig/node]
- Kubeletはstatic podを除いて，NoExecute taintやtolerationを確認します ([#101218](https://github.com/kubernetes/kubernetes/pull/101218), [@gjkim42](https://github.com/gjkim42)) [sig/node]
- ローカルノードにAppArmorのプロファイルがロードされている場合のvalidationを削除します．これはコンテナランタイムで処理されるべきです． ([#97966](https://github.com/kubernetes/kubernetes/pull/97966), [@saschagrunert](https://github.com/saschagrunert)) [sig/node,sig/auth,sig/security]
- Graceful node shutdown を有効にした場合，正常に終了しなかったPodを `Failed` と設定する振る舞いを v1.21 の状態にrevertしました． GracefulNodeShutdown 機能はベータで， v1.21+ で kubelet config を使って明示的に有効にする必要があります． これは v1.22 と v1.23 での ノードシャットダウンにおける振る舞いを v1.21 にマッチするようにします．もし， v1.22 と v1.23 で ノードシャットダウン時に pod を terminated だとしたくない場合には，GracefulNodeShutdown を無効にしてください． ([#106901](https://github.com/kubernetes/kubernetes/pull/106901), [@bobbypage](https://github.com/bobbypage)) [sig/node,sig/testing]
- Dockershim が利用する CRI API version を v1alpha2 に revert します． ([#106803](https://github.com/kubernetes/kubernetes/pull/106803), [@saschagrunert](https://github.com/saschagrunert)) [sig/network,sig/node]
- Podが既に削除されている場合，panicを防ぐためにre-allocateのロジックをスキップするようにします ([#108831](https://github.com/kubernetes/kubernetes/pull/108831), [@waynepeking348](https://github.com/waynepeking348)) [sig/node]
- deprecatedなフラグ `--really-crash-for-testing` を削除します ([#101719](https://github.com/kubernetes/kubernetes/pull/101719), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [sig/network,sig/node,sig/api-machinery,sig/testing]
- KubeletはHTTP2のヘルスチェック機構を使って壊れた接続を検出するようにすることで，ハートビートに失敗した時にアクティブな接続を強制的に閉じなくなりました．ユーザは以前の振る舞いに戻すために `DISABLE_HTTP2` 環境変数を利用することができます． ([#108107](https://github.com/kubernetes/kubernetes/pull/108107), [@aojea](https://github.com/aojea)) [sig/node,sig/api-machinery]
- Windows ノードにおける Kubelet の権限チェックを更新して，プロセス所有者がAdministratorsグループに所属しているか確認するのではなく，プロセスが昇格されているか確認するようにしました ([#108146](https://github.com/kubernetes/kubernetes/pull/108146), [@marosset](https://github.com/marosset)) [sig/node,sig/windows]

### Other (Cleanup or Flake)

- `build/dependencies.yaml`: Dockerへの依存を削除しました．dockershim を削除したことで，Kubernetesのコアはdockerのバージョンを追跡する必要がなくなりました． ([#107607](https://github.com/kubernetes/kubernetes/pull/107607), [@neolit123](https://github.com/neolit123)) [sig/node,sig/cluster-lifecycle]
- TopologyManager における non-preferred なヒントを選択するアルゴリズムを改善しました ([#108154](https://github.com/kubernetes/kubernetes/pull/108154), [@klueska](https://github.com/klueska)) [sig/node]
- Kubelet config の検証エラーメッセージを更新しました ([#105360](https://github.com/kubernetes/kubernetes/pull/105360), [@shuheiktgw](https://github.com/shuheiktgw)) [sig/node]
- kubelet の `--container-runtime-endpoint` と `--image-service-endpoint` CLI flag を stable としました ([#106954](https://github.com/kubernetes/kubernetes/pull/106954), [@saschagrunert](https://github.com/saschagrunert)) [sig/node]
- kubeletのRuntimeClass feature gateを削除しました（この機能は1.14からデフォルトで有効で，1.20でGAしています） ([#106882](https://github.com/kubernetes/kubernetes/pull/106882), [@cyclinder](https://github.com/cyclinder)) [sig/node]
- kubeletのdeprecatedなCLI flag `--non-masquerade-cidr` を削除しました ([#107096](https://github.com/kubernetes/kubernetes/pull/107096), [@hakman](https://github.com/hakman)) [sig/node,sig/cloud-provider]
- kubelet の `--container-runtime` フラグは deprecated になり，将来のリリースで削除されます ([#107094](https://github.com/kubernetes/kubernetes/pull/107094), [@adisky](https://github.com/adisky)) [sig/node]
- runc が 1.1.0，cAdvisor が 0.44.0 に更新されました ([#109029](https://github.com/kubernetes/kubernetes/pull/109029), [@ehashman](https://github.com/ehashman)) [sig/node,sig/cli,sig/testing]
- runc が 1.1.1 に更新されました ([#109104](https://github.com/kubernetes/kubernetes/pull/109104), [@kolyshkin](https://github.com/kolyshkin)) [sig/node]