Kubernetes 1.21: SIG Nodeに関する変更点

# はじめに

Kubernetes 1.21のSIG-Node関連の変更についてまとめました。

* https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.21.md
* https://relnotes.k8s.io/?areas=kubectl&releaseVersions=v1.21.0

📝は筆者の補足です。

その他のSIGの変更点についてはこちらをご覧ください。

https://qiita.com/uesyn/items/49a76dd029a1371f8cf8

# What's New (Major Themes)

## Immutable Secrets and ConfigMaps

Immutable SecretsとImmutable ConfigMapsがGAになりました。これにより、特定のSecretやConfigMapの内容を、そのオブジェクトの存続期間中、不変であると指定することができます。kubeletは変更を監視/ポーリングしないため、apiserverの負荷が軽減されます。

📝 ボリュームとして利用されている（immutableではない）ConfigMap, Secretの内容が変わった場合、[マウントされているデータも更新されます](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#mounted-configmaps-are-updated-automatically)。これを実現するために、kubeletはSecret, ConfigMapの変化を監視していて、apiserverの負荷につながっています。この負荷を削減するために、[Immutable Secret](https://kubernetes.io/docs/concepts/configuration/secret/#secret-immutable), [Immutable ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/#configmap-immutable)が導入されました。Immutableと宣言されている場合、変化しないことが保証されているので、監視をする必要がなくなります。

## Structured Logging in Kubelet

kubelet は構造化ロギング（structured logging）を採用しました。これは、リリースのスケジュール内で構造化ロギングを実現するためのコミュニティの努力のおかげです。プロジェクトでの構造化されたロギングは、現在も継続して行われています。参加に興味のある方は、[keep an eye / chime in to the mailing list discussion](https://groups.google.com/g/kubernetes-dev/c/y4WIw-ntUR8)をご覧ください。

📝 他のコンポーネントと同様、kubeletにも構造化ロギングが入りました。構造化ロギングについては[Introducing Structured Logs \| Kubernetes](https://kubernetes.io/blog/2020/09/04/kubernetes-1-19-introducing-structured-logs/)をご覧ください。

# Known Issues

なし

# Urgent Upgrade Notes 

なし

# Changes by Kind

## Deprecation

- 試験的なWindows Hyper-Vコンテナ機能が削除されました ([#97141](https://github.com/kubernetes/kubernetes/pull/97141), [@wawa0210](https://github.com/wawa0210)) [SIG Node and Windows]
- TokenRequestとTokenRequestProjectionフィーチャーゲートが削除され、無条件で有効化されるようになりました。CLIでこれらのフィーチャーゲートを指定している場合、削除してください。 ([#97148](https://github.com/kubernetes/kubernetes/pull/97148), [@wawa0210](https://github.com/wawa0210)) [SIG Node]

## API Change

- ProbeレベルのterminationGracePeriodSecondsフィールドが追加されました ([#99375](https://github.com/kubernetes/kubernetes/pull/99375), [@ehashman](https://github.com/ehashman)) [SIG API Machinery, Apps, Node and Testing]
  - 📝 KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2238-liveness-probe-grace-period
  - :pencil: この機能はalphaのため、利用するためには`ProbeTerminationGracePeriod`feature gateを有効にする必要があります。（2021/05/11 Update）
  - :pencil: Podを削除した場合、コンテナ（のPID 1）にSIGTERMが送られ、その後`terminationGracePeriodSeconds`以内にプロセスが終了しない場合、SIGKILLで強制的にプロセスが終了されますが、この挙動はliveness probeが失敗してコンテナが終了する場合にも適用されます。すなわち、SIGTERMで終了しない場合`terminationGracePeriodSeconds`だけコンテナの終了に時間がかかります。liveness probeで死んでいるとみなされた場合、早急に終了（して再起動）したいことも多いはずで、そのようなケースのためprobe levelの`terminationGracePeriodSeconds`が導入されたのだと思われます。probeの`terminationGracePeriodSeconds`を設定すると、Podの`terminationGracePeriodSeconds`を上書きしてprobeごとの値を設定することができます。（2021/05/11 Update）
  - :pencil: 筆者の環境で試してみたのですが、期待した動きにはなりませんでした。なにか間違ってそうなところがありましたら、コメントいただけると助かります https://gist.github.com/ryotarai/781bc0b36c4b5ba10f098d37c871514c （2021/05/11 Update）

- クラスタ管理者は、Kubelet 構成ファイルで `enableProfilingHandler` と `enableDebugFlagsHandler` を `false` に設定することで、kubelet のエンドポイント `/debug/pprof` と `/debug/flags/v` をオフにすることができるようになりました。オプション `enableProfilingHandler` と `enableDebugFlagsHandler` は、`enableDebuggingHandlers` が `true` に設定されている場合にのみ、`true` に設定することができます。 ([#98458](https://github.com/kubernetes/kubernetes/pull/98458), [@SaranBalaji90](https://github.com/SaranBalaji90))
- podresources APIにGetAvailableResourcesが実装されました ([#95734](https://github.com/kubernetes/kubernetes/pull/95734), [@fromanirh](https://github.com/fromanirh)) [SIG Instrumentation, Node and Testing]
  - 📝 KEP: https://github.com/kubernetes/kubernetes/pull/95734
  - 📝 kubeletが話すgRPC APIであるpodresources APIに`GetAllocatableResources`という新しいrpcが実装されました。モニタリングなどが想定されているユースケースのようです。Changelogには`GetAvailableResources`とありますが`GetAllocatableResources`が正しいです。alphaなので`KubeletPodResourcesGetAllocatable` feature gateを有効にする必要があります。（2021/05/11 Update）
  - 📝 `GetAllocatableResources`はそのノードで利用可能なデバイスの一覧を返します（コンテナによって利用されているデバイスも含みます）。コンテナが利用しているデバイスを取得するには`List` rpcを使います（このAPIは1.21以前から存在します）（2021/05/11 Update）
  - 📝 podresources APIの利用例: https://gist.github.com/ryotarai/8c3850696acdfabce5edc13a584d0c6c （2021/05/11 Update）
  - 📝 ~~kubeletが話すgRPC APIであるpodresources APIにGetAvailableResourcesという新しいrpcが実装されました。これにより（device pluginが提供する）deviceとPodの対応付けが取得できるようになりました。例えば、Podが使っているGPUが識別できるようになるので、PodのGPU使用率などのメトリックをモニタリングできるようになります。~~（2021/05/11 Update）
- kubeletのGraceful Node Shutdown機能がベータになり、デフォルトで有効になりました。 ([#99735](https://github.com/kubernetes/kubernetes/pull/99735), [@bobbypage](https://github.com/bobbypage))
  - 📝 Blog: [Graceful Node Shutdown Goes Beta | Kubernetes](https://kubernetes.io/blog/2021/04/21/graceful-node-shutdown-beta/)
  - 📝 Doc: [Nodes | Kubernetes](https://kubernetes.io/docs/concepts/architecture/nodes/#graceful-node-shutdown)
- Immutable Secrets/ConfigMaps 機能がstableになりました。この機能により、Secret や ConfigMap オブジェクトに `immutable` フィールドを設定して、その内容を不変のものとしてマークすることができます。([#97615](https://github.com/kubernetes/kubernetes/pull/97615), [@wojtek-t](https://github.com/wojtek-t)) [SIG Apps, Architecture, Node and Testing]

## Feature

- CRIContainerLogRotationがGAになり、無条件で有効になります。 ([#99651](https://github.com/kubernetes/kubernetes/pull/99651), [@umohnani8](https://github.com/umohnani8))
- メモリを使用するEmptyDirのボリュームのサイズは、ホスト上のポッドで割り当て可能なメモリの最小値と、オプションでユーザーが提供する明示的な値で決定されます。 ([#100319](https://github.com/kubernetes/kubernetes/pull/100319), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Node]
  - 📝 KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/1967-size-memory-backed-volumes/README.md （2021/05/11 Update）
  - 📝 `SizeMemoryBackedVolumes` feature gateがbeta（デフォルト有効）に昇格しました。これにより`medium`が`Memory`に設定されている`emptyDir`のサイズを`emptyDir.sizeLimit`で設定できるようになります。（2021/05/11 Update）
- Kubeletがボリュームの状態をチェックし、対応するポッドにイベントを記録します。 ([#99284](https://github.com/kubernetes/kubernetes/pull/99284), [@fengzixu](https://github.com/fengzixu)) [SIG Apps, Instrumentation, Node and Storage]
- DirectXのようなデバイスプラグインのため、devicemanagerをWindowsにポーティングしました。 ([#93285](https://github.com/kubernetes/kubernetes/pull/93285), [@aarnaud](https://github.com/aarnaud)) [SIG Node, Testing and Windows]
- cAdvisor の JSON メトリクス (/stats/container, /stats/<podname>/<containername>, /stats/<namespace>/<podname>/<poduid>/<containername>) を kubelet から削除します。([#99236](https://github.com/kubernetes/kubernetes/pull/99236), [@pacoxu](https://github.com/pacoxu))
- Sysctls が General Availability になり、無条件に有効になりました。([#99158](https://github.com/kubernetes/kubernetes/pull/99158), [@wgahnagl](https://github.com/wgahnagl))
- このリリースでは、`RunAsGroup`機能がGAに昇格しました。([#94641](https://github.com/kubernetes/kubernetes/pull/94641), [@krmayankk](https://github.com/krmayankk)) [SIG Auth and Node].
- LinuxとWindowsの両方で、kubeletとkubeadmの一時停止イメージが `v3.4.1`にアップグレードされました。([#98205](https://github.com/kubernetes/kubernetes/pull/98205), [@pacoxu](https://github.com/pacoxu))
- pause コンテナを更新して、疑似ユーザーとグループ `65535:65535` で実行するようにしました。これは、コンテナイメージのバージョン3.5のリリースとなります。([#97963](https://github.com/kubernetes/kubernetes/pull/97963), [@saschagrunert](https://github.com/saschagrunert)) [SIG CLI, Cloud Provider, Cluster Lifecycle, Node, Release, Security and Testing].
- 検証済みの最新バージョンのDockerを20.10にアップデート ([#98977](https://github.com/kubernetes/kubernetes/pull/98977), [@neolit123](https://github.com/neolit123)) [SIG CLI, Cluster Lifecycle and Node]
- kubelet が ConfigMap または Secret を純粋にコンテナの環境変数の設定という文脈でwatchしている場合、そのwatchをキャンセルする前に定義された期間だけ保持します。この変更により、大規模なクラスターにおける kube-apiserver の CPU とメモリの使用量が減少します。([#99393](https://github.com/kubernetes/kubernetes/pull/99393), [@chenyw1990](https://github.com/chenyw1990)) [SIG API Machinery, Node and Testing] 
  - 📝 Immutalbe Secret, ConfigMapと同様、kube-apiserverの負荷低減のための修正です。ConfigMap, Secretが環境変数のみで利用されている場合、ボリュームと違って更新に追従する必要がないので、watchを止めるようにしています。（2021/05/11 Update）


## Documentation

- kubelet のオプション `--volume-stats-agg-period` に負の値を設定すると、volumeの計算が無効になります。([#96675](https://github.com/kubernetes/kubernetes/pull/96675), [@pacoxu](https://github.com/pacoxu)) [SIG Node] (英語)

## Failing Test

- Kubelet: コンフォーマンステスト"HostPort validates that there is no conflict between pods with same hostPort but different hostIP and protocol"が失敗する原因になっていた、dockershimのHostPort実装のバグが修正されました。 ([#98755](https://github.com/kubernetes/kubernetes/pull/98755), [@aojea](https://github.com/aojea)) [SIG Cloud Provider, Network and Node]
  - 📝 dockershimでHostPortを利用する際に、hostIPを考慮しておらず、同じportかつ異なるIPアドレスで複数のHostPortを同時に利用できなかったバグを修正しているようです。（2021/05/11 Update）

## Bug or Regression

- `cri_stats_provider`が使用されている場合、kubeletのSummary APIで AcceleratorStatsが利用できます。 ([#96873](https://github.com/kubernetes/kubernetes/pull/96873), [@ruiwen-zhao](https://github.com/ruiwen-zhao)) [SIG Node]
- エフェメラルストレージのevictionにおけるNPEの修正 ([#98261](https://github.com/kubernetes/kubernetes/pull/98261), [@wzshiming](https://github.com/wzshiming)) [SIG Node]
- cgroup v2をつかったsystemdのcgroupの扱いを修正しました。 ([#98365](https://github.com/kubernetes/kubernetes/pull/98365), [@odinuge](https://github.com/odinuge)) [SIG Node]
- DockershimのWindowsコンテナ統計情報にアクセスする際のエラーを修正 ([#98510](https://github.com/kubernetes/kubernetes/pull/98510), [@jsturtevant](https://github.com/jsturtevant)) [SIG Node and Windows]
- cadvisor のマシンメトリクスの欠落を修正 ([#97006](https://github.com/kubernetes/kubernetes/pull/97006), [@lingsamuel](https://github.com/lingsamuel)) [SIG Node]
- これまで無視されていたPod Sandboxの特権に関する設定を修正 ([#96877](https://github.com/kubernetes/kubernetes/pull/96877), [@xeniumlee](https://github.com/xeniumlee))
- Status.Capacity や Status.Allocatable がないNodeオブジェクトが既に存在する場合に kubelet が register するとパニックするバグを修正 ([#95269](https://github.com/kubernetes/kubernetes/pull/95269), [@SataQiu](https://github.com/SataQiu)) [SIG Node]
- 遅いPodの終了に関するリグレッションを修正しました。この修正の前には、Podの終了にさらに時間がかかることがあります（最大1分）。APIサーバでPodが削除されたときにCNIリソースがクリーンアップされるようにした変更を元に戻し、修正されました ([#97980](https://github.com/kubernetes/kubernetes/pull/97980), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [SIG Node]
- containerdが再起動された後にCPU使用率が飽和するkubeletのバグを修正しました ([#97174](https://github.com/kubernetes/kubernetes/pull/97174), [@hanlins](https://github.com/hanlins)) [SIG Node]
- BtrfSでkubeletが起動できないバグを修正しました ([#98042](https://github.com/kubernetes/kubernetes/pull/98042), [@gjkim42](https://github.com/gjkim42)) [SIG Node]
- CPUManagerでコンテナマップアクセス時にレースが発生するバグを修正 ([#97427](https://github.com/kubernetes/kubernetes/pull/97427), [@klueska](https://github.com/klueska)) [SIG Node]
- cAdvisorがシングルソケットのマルチNUMAトポロジーを誤って検出するバグを修正しました ([#99315](https://github.com/kubernetes/kubernetes/pull/99315), [@iwankgb](https://github.com/iwankgb)) [SIG Node]
- 正しい containerd プロセスを特定するバグを修正しました ([#97888](https://github.com/kubernetes/kubernetes/pull/97888), [@pacoxu](https://github.com/pacoxu))
- failed Nodeで NoExecute taint が正しく設定されていない場合があるバグを修正 ([#96876](https://github.com/kubernetes/kubernetes/pull/96876), [@howieyuen](https://github.com/howieyuen)) [SIG Apps and Node]
- alwaysPullImages admission controller で新しいイメージがない update pod を無視する ([#96668](https://github.com/kubernetes/kubernetes/pull/96668), [@pacoxu](https://github.com/pacoxu)) [SIG Apps, Auth and Node]
- Kubelet はorphanedとなったボリュームディレクトリを自動的にクリーンアップするようになりました ([#95301](https://github.com/kubernetes/kubernetes/pull/95301), [@lorenz](https://github.com/lorenz)) [SIG Node and Storage]
- Windows の Kubelet.exe は、管理者として実行されているプロセスと 実行ユーザアカウントが組み込みの管理者グループにリストされていることを チェックするようになりました。 これは、プロセスがuid 0として実行されているかどうかをチェックするのと同じです ([#96616](https://github.com/kubernetes/kubernetes/pull/96616), [@perithompson](https://github.com/perithompson)) [SIG Node and Windows]
- Kubelet: kubeletが間違ったシグナルを受け取った後にパニックを起こさないように修正 ([#98200](https://github.com/kubernetes/kubernetes/pull/98200), [@wzshiming](https://github.com/wzshiming)) [SIG Node]
- Kubelet: inhibit lockを繰り返し取得するのを修正 ([#98088](https://github.com/kubernetes/kubernetes/pull/98088), [@wzshiming](https://github.com/wzshiming)) [SIG Node]
- Kubelet: WindowsでCPUの論理プロセッサ数が64以上の場合に発生する、CPU数を取得のバグを修正 ([#97378](https://github.com/kubernetes/kubernetes/pull/97378), [@hwdef](https://github.com/hwdef)) [SIG Node and Windows]
- WindowsでPod Log statsが出力されるようになりました ([#99221](https://github.com/kubernetes/kubernetes/pull/99221), [@jsturtevant](https://github.com/jsturtevant)) [SIG Node, Storage, Testing and Windows]
- probe結果に反応する際のPodの状態更新が速くなりました。startup probeが成功した場合に、最初のreadiness probeがより速く呼び出されるようになり、これによりPodがより速くreadyになります ([#98376](https://github.com/kubernetes/kubernetes/pull/98376), [@matthyx](https://github.com/matthyx))
- `kubelet_containers_per_pod_count` のバケットを再調整し、1 以上のメトリクスのみを表示するようにしました ([#98169](https://github.com/kubernetes/kubernetes/pull/98169), [@wawa0210](https://github.com/wawa0210))
- kubelet の "concurrent map read and map write" によるクラッシュエラーを解決 ([#95111](https://github.com/kubernetes/kubernetes/pull/95111), [@choury](https://github.com/choury)) [SIG Node]
- kubelet のログに含まれる `Failed to list *v1.Secret` または `Failed to list *v1.ConfigMap` というメッセージを修正しました ([#99538](https://github.com/kubernetes/kubernetes/pull/99538), [@liggitt](https://github.com/liggitt)) [SIG Auth and Node]
- ResourceQuotaがPod overheadを含めて計算するようになりました ([#99600](https://github.com/kubernetes/kubernetes/pull/99600), [@gjkim42](https://github.com/gjkim42))
  - 📝 Pod overheadについてはこちら: [enhancements/keps/sig-node/688-pod-overhead at master · kubernetes/enhancements · GitHub](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/688-pod-overhead)
- `dockershim`をランタイムとして使用する際に、startしていないPodのstartedAtやrunningのPodのfinishedAtを報告する際に、 負の数ではなく0の時間（1970年1月1日の真夜中）を返すようにした。([#99585](https://github.com/kubernetes/kubernetes/pull/99585), [@Iceber](https://github.com/Iceber))
- Static podsがgracefulに削除されるようになりました ([#98103](https://github.com/kubernetes/kubernetes/pull/98103), [@gjkim42](https://github.com/gjkim42)) [SIG Node]
- ノードのシャットダウン時にノードの状態を同期する。ノードがシャットダウン中の場合に新しいPodを拒否するPod admission handlerを追加。 ([#98005](https://github.com/kubernetes/kubernetes/pull/98005), [@wzshiming](https://github.com/wzshiming)) [SIG Node]
- static PodのUIDの計算は、各static Podがユニークな値を取得するように変更されました - これにより、1.20から1.21へのインプレースのkubeletアップグレードが実行された場合、すべてのstatic Podコンテナが再作成/再起動されます。マイナーバージョン間で kubelet をアップグレードする前にPodをdrainすることは、サポートされているアップグレード方法です。 ([#87461](https://github.com/kubernetes/kubernetes/pull/87461), [@bboreham](https://github.com/bboreham)) [SIG Node]
- Windowsで`Containerd`を使用している場合、`C:Windows\System32\drivers\etc\hosts`ファイルがkubeletで管理されるようになりました。 ([#83730](https://github.com/kubernetes/kubernetes/pull/83730), [@claudiubelu](https://github.com/claudiubelu))

## Other (Cleanup or Flake)

- `k8s.io/kubernetes/pkg/kubelet/apis` にあった kubelet のアノテーションとラベルのための API は、`k8s.io/kubelet/pkg/apis/` に移動しました ([#98931](https://github.com/kubernetes/kubernetes/pull/98931), [@michaelbeaumont](https://github.com/michaelbeaumont))
- dockershim に関連する Kubelet のコマンドラインフラグは、将来のリリースで dockershim とともに削除されるため、deprecation メッセージが表示されるようになりました ([#98730](https://github.com/kubernetes/kubernetes/pull/98730), [@dims](https://github.com/dims))
- 非推奨のfeature gate `RotateKubeletClientCertificate`, `AttachVolumeLimit`, `VolumePVCDataSource`, `EvenPodsSpread` が無条件に有効になり、コンポーネントの呼び出しで指定することができなくなりました ([#97306](https://github.com/kubernetes/kubernetes/pull/97306), [@gavinfish](https://github.com/gavinfish)) [SIG Node, Scheduling and Storage]
- v1.18以降でGAになっているfeature gate`WindowsGMSA`と`WindowsRunAsUserName`が削除されました ([#96531](https://github.com/kubernetes/kubernetes/pull/96531), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Node and Windows]

## Uncategorized

- DownwardAPIHugePages機能はベータ版です。 クラスタ内のすべてのワーカーのバージョンが1.20である場合、ユーザーはこの機能を使用できます。 この機能は、1.22ではすべてのインストールでデフォルトで有効になります。 ([#99610](https://github.com/kubernetes/kubernetes/pull/99610), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Node]