はじめに
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の変更点についてはこちらをご覧ください。
What's New (Major Themes)
Immutable Secrets and ConfigMaps
Immutable SecretsとImmutable ConfigMapsがGAになりました。これにより、特定のSecretやConfigMapの内容を、そのオブジェクトの存続期間中、不変であると指定することができます。kubeletは変更を監視/ポーリングしないため、apiserverの負荷が軽減されます。
📝 ボリュームとして利用されている(immutableではない)ConfigMap, Secretの内容が変わった場合、マウントされているデータも更新されます。これを実現するために、kubeletはSecret, ConfigMapの変化を監視していて、apiserverの負荷につながっています。この負荷を削減するために、Immutable Secret, Immutable ConfigMapが導入されました。Immutableと宣言されている場合、変化しないことが保証されているので、監視をする必要がなくなります。
Structured Logging in Kubelet
kubelet は構造化ロギング(structured logging)を採用しました。これは、リリースのスケジュール内で構造化ロギングを実現するためのコミュニティの努力のおかげです。プロジェクトでの構造化されたロギングは、現在も継続して行われています。参加に興味のある方は、keep an eye / chime in to the mailing list discussionをご覧ください。
📝 他のコンポーネントと同様、kubeletにも構造化ロギングが入りました。構造化ロギングについてはIntroducing Structured Logs | Kubernetesをご覧ください。
Known Issues
なし
Urgent Upgrade Notes
なし
Changes by Kind
Deprecation
- 試験的なWindows Hyper-Vコンテナ機能が削除されました (#97141, @wawa0210) [SIG Node and Windows]
- TokenRequestとTokenRequestProjectionフィーチャーゲートが削除され、無条件で有効化されるようになりました。CLIでこれらのフィーチャーゲートを指定している場合、削除してください。 (#97148, @wawa0210) [SIG Node]
API Change
-
ProbeレベルのterminationGracePeriodSecondsフィールドが追加されました (#99375, @ehashman) [SIG API Machinery, Apps, Node and Testing]
- 📝 KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2238-liveness-probe-grace-period
-
この機能はalphaのため、利用するためには
ProbeTerminationGracePeriod
feature gateを有効にする必要があります。(2021/05/11 Update) -
Podを削除した場合、コンテナ(のPID 1)にSIGTERMが送られ、その後
terminationGracePeriodSeconds
以内にプロセスが終了しない場合、SIGKILLで強制的にプロセスが終了されますが、この挙動はliveness probeが失敗してコンテナが終了する場合にも適用されます。すなわち、SIGTERMで終了しない場合terminationGracePeriodSeconds
だけコンテナの終了に時間がかかります。liveness probeで死んでいるとみなされた場合、早急に終了(して再起動)したいことも多いはずで、そのようなケースのためprobe levelのterminationGracePeriodSeconds
が導入されたのだと思われます。probeのterminationGracePeriodSeconds
を設定すると、PodのterminationGracePeriodSeconds
を上書きしてprobeごとの値を設定することができます。(2021/05/11 Update) - 筆者の環境で試してみたのですが、期待した動きにはなりませんでした。なにか間違ってそうなところがありましたら、コメントいただけると助かります 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, @SaranBalaji90) -
podresources APIにGetAvailableResourcesが実装されました (#95734, @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, @bobbypage)
- 📝 Blog: Graceful Node Shutdown Goes Beta | Kubernetes
- 📝 Doc: Nodes | Kubernetes
-
Immutable Secrets/ConfigMaps 機能がstableになりました。この機能により、Secret や ConfigMap オブジェクトに
immutable
フィールドを設定して、その内容を不変のものとしてマークすることができます。(#97615, @wojtek-t) [SIG Apps, Architecture, Node and Testing]
Feature
- CRIContainerLogRotationがGAになり、無条件で有効になります。 (#99651, @umohnani8)
- メモリを使用するEmptyDirのボリュームのサイズは、ホスト上のポッドで割り当て可能なメモリの最小値と、オプションでユーザーが提供する明示的な値で決定されます。 (#100319, @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, @fengzixu) [SIG Apps, Instrumentation, Node and Storage]
- DirectXのようなデバイスプラグインのため、devicemanagerをWindowsにポーティングしました。 (#93285, @aarnaud) [SIG Node, Testing and Windows]
- cAdvisor の JSON メトリクス (/stats/container, /stats//, /stats////) を kubelet から削除します。(#99236, @pacoxu)
- Sysctls が General Availability になり、無条件に有効になりました。(#99158, @wgahnagl)
- このリリースでは、
RunAsGroup
機能がGAに昇格しました。(#94641, @krmayankk) [SIG Auth and Node]. - LinuxとWindowsの両方で、kubeletとkubeadmの一時停止イメージが
v3.4.1
にアップグレードされました。(#98205, @pacoxu) - pause コンテナを更新して、疑似ユーザーとグループ
65535:65535
で実行するようにしました。これは、コンテナイメージのバージョン3.5のリリースとなります。(#97963, @saschagrunert) [SIG CLI, Cloud Provider, Cluster Lifecycle, Node, Release, Security and Testing]. - 検証済みの最新バージョンのDockerを20.10にアップデート (#98977, @neolit123) [SIG CLI, Cluster Lifecycle and Node]
- kubelet が ConfigMap または Secret を純粋にコンテナの環境変数の設定という文脈でwatchしている場合、そのwatchをキャンセルする前に定義された期間だけ保持します。この変更により、大規模なクラスターにおける kube-apiserver の CPU とメモリの使用量が減少します。(#99393, @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, @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, @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, @ruiwen-zhao) [SIG Node] - エフェメラルストレージのevictionにおけるNPEの修正 (#98261, @wzshiming) [SIG Node]
- cgroup v2をつかったsystemdのcgroupの扱いを修正しました。 (#98365, @odinuge) [SIG Node]
- DockershimのWindowsコンテナ統計情報にアクセスする際のエラーを修正 (#98510, @jsturtevant) [SIG Node and Windows]
- cadvisor のマシンメトリクスの欠落を修正 (#97006, @lingsamuel) [SIG Node]
- これまで無視されていたPod Sandboxの特権に関する設定を修正 (#96877, @xeniumlee)
- Status.Capacity や Status.Allocatable がないNodeオブジェクトが既に存在する場合に kubelet が register するとパニックするバグを修正 (#95269, @SataQiu) [SIG Node]
- 遅いPodの終了に関するリグレッションを修正しました。この修正の前には、Podの終了にさらに時間がかかることがあります(最大1分)。APIサーバでPodが削除されたときにCNIリソースがクリーンアップされるようにした変更を元に戻し、修正されました (#97980, @SergeyKanzhelev) [SIG Node]
- containerdが再起動された後にCPU使用率が飽和するkubeletのバグを修正しました (#97174, @hanlins) [SIG Node]
- BtrfSでkubeletが起動できないバグを修正しました (#98042, @gjkim42) [SIG Node]
- CPUManagerでコンテナマップアクセス時にレースが発生するバグを修正 (#97427, @klueska) [SIG Node]
- cAdvisorがシングルソケットのマルチNUMAトポロジーを誤って検出するバグを修正しました (#99315, @iwankgb) [SIG Node]
- 正しい containerd プロセスを特定するバグを修正しました (#97888, @pacoxu)
- failed Nodeで NoExecute taint が正しく設定されていない場合があるバグを修正 (#96876, @howieyuen) [SIG Apps and Node]
- alwaysPullImages admission controller で新しいイメージがない update pod を無視する (#96668, @pacoxu) [SIG Apps, Auth and Node]
- Kubelet はorphanedとなったボリュームディレクトリを自動的にクリーンアップするようになりました (#95301, @lorenz) [SIG Node and Storage]
- Windows の Kubelet.exe は、管理者として実行されているプロセスと 実行ユーザアカウントが組み込みの管理者グループにリストされていることを チェックするようになりました。 これは、プロセスがuid 0として実行されているかどうかをチェックするのと同じです (#96616, @perithompson) [SIG Node and Windows]
- Kubelet: kubeletが間違ったシグナルを受け取った後にパニックを起こさないように修正 (#98200, @wzshiming) [SIG Node]
- Kubelet: inhibit lockを繰り返し取得するのを修正 (#98088, @wzshiming) [SIG Node]
- Kubelet: WindowsでCPUの論理プロセッサ数が64以上の場合に発生する、CPU数を取得のバグを修正 (#97378, @hwdef) [SIG Node and Windows]
- WindowsでPod Log statsが出力されるようになりました (#99221, @jsturtevant) [SIG Node, Storage, Testing and Windows]
- probe結果に反応する際のPodの状態更新が速くなりました。startup probeが成功した場合に、最初のreadiness probeがより速く呼び出されるようになり、これによりPodがより速くreadyになります (#98376, @matthyx)
-
kubelet_containers_per_pod_count
のバケットを再調整し、1 以上のメトリクスのみを表示するようにしました (#98169, @wawa0210) - kubelet の "concurrent map read and map write" によるクラッシュエラーを解決 (#95111, @choury) [SIG Node]
- kubelet のログに含まれる
Failed to list *v1.Secret
またはFailed to list *v1.ConfigMap
というメッセージを修正しました (#99538, @liggitt) [SIG Auth and Node] - ResourceQuotaがPod overheadを含めて計算するようになりました (#99600, @gjkim42)
- 📝 Pod overheadについてはこちら: enhancements/keps/sig-node/688-pod-overhead at master · kubernetes/enhancements · GitHub
-
dockershim
をランタイムとして使用する際に、startしていないPodのstartedAtやrunningのPodのfinishedAtを報告する際に、 負の数ではなく0の時間(1970年1月1日の真夜中)を返すようにした。(#99585, @Iceber) - Static podsがgracefulに削除されるようになりました (#98103, @gjkim42) [SIG Node]
- ノードのシャットダウン時にノードの状態を同期する。ノードがシャットダウン中の場合に新しいPodを拒否するPod admission handlerを追加。 (#98005, @wzshiming) [SIG Node]
- static PodのUIDの計算は、各static Podがユニークな値を取得するように変更されました - これにより、1.20から1.21へのインプレースのkubeletアップグレードが実行された場合、すべてのstatic Podコンテナが再作成/再起動されます。マイナーバージョン間で kubelet をアップグレードする前にPodをdrainすることは、サポートされているアップグレード方法です。 (#87461, @bboreham) [SIG Node]
- Windowsで
Containerd
を使用している場合、C:Windows\System32\drivers\etc\hosts
ファイルがkubeletで管理されるようになりました。 (#83730, @claudiubelu)
Other (Cleanup or Flake)
-
k8s.io/kubernetes/pkg/kubelet/apis
にあった kubelet のアノテーションとラベルのための API は、k8s.io/kubelet/pkg/apis/
に移動しました (#98931, @michaelbeaumont) - dockershim に関連する Kubelet のコマンドラインフラグは、将来のリリースで dockershim とともに削除されるため、deprecation メッセージが表示されるようになりました (#98730, @dims)
- 非推奨のfeature gate
RotateKubeletClientCertificate
,AttachVolumeLimit
,VolumePVCDataSource
,EvenPodsSpread
が無条件に有効になり、コンポーネントの呼び出しで指定することができなくなりました (#97306, @gavinfish) [SIG Node, Scheduling and Storage] - v1.18以降でGAになっているfeature gate
WindowsGMSA
とWindowsRunAsUserName
が削除されました (#96531, @ialidzhikov) [SIG Node and Windows]
Uncategorized
- DownwardAPIHugePages機能はベータ版です。 クラスタ内のすべてのワーカーのバージョンが1.20である場合、ユーザーはこの機能を使用できます。 この機能は、1.22ではすべてのインストールでデフォルトで有効になります。 (#99610, @derekwaynecarr) [SIG Node]