本記事は、Kubernetes 変更内容共有会(v1.27) の SIG-Node(kubelet)に関する資料として準備されました。
Kubernetes 1.27の CHANGELOG から、SIG-Nodeに関するところを抜粋して紹介します。
は筆者(@y1r96)による補足です.
所感
重要な機能の追加としては、 NodeLogQuery
があります。Kubernetes blogはこちら。
Kubernetes ノードに問題が生じた可能性がある時、ノードにSSH接続して、ログを調査することがよくあります。NodeLogQuery
を使用すると、SSHすることなく、kubectl を使って journalctl
相当のログ収集を行うことができます。また、/var/log/
ディレクトリ以下のログも収集することができるそうです。
また、引き続き Dynamic Resource Allocation 関連の機能開発も進んでいます。例えば PR #114364 では、CNIが呼ばれる前に DRA の PrepareResources API が呼ばれることを保証することで、PrepareResource 時点でネットワークデバイスの初期化を実施し、そのあとに CNI を使って Pod に attach する、ということができるようになったそうです。
他にも、 KEP-127: Support User Namespaces in stateless pods では、stateless な Pod に対して、user namespaceが利用できるようになります。user namespace は、uid/gid の空間を別個に用意する namespace 機能で、コンテナ内では特権 (uid=0, gid=0) ですが、ホストではそうではない、というような mapping を設定できます。これにより、コンテナ内のプロセスが特権で動作していて、何らかの手段でコンテナからホストに出ることができたとしても、ホストでは特権ではないので、大きな影響はない、というようなことができます。
Urgent Upgrade Notes
- 再起動されない全てのPodに正しく terminal phase を付与するようになりました。とくに、Pending中に削除されたPodにFailed phaseを付与したり、Running中に削除されたPodに terminal phase (つまり、Podの終了コードに基づく Succeeded か Failed )を付与します。これは、Pod Failure Policy (JodPodFailurePolicy と PodDistruptionConditions feature gate が有効になっているもの)を使うJob が、削除された時に、Pending phaseでスタックする可能性があったことを直すものです。コントローラの開発者で、RestartPolicy=AlwaysなPodが、決して Succeeded phase に入らないことに依存している場合、これに適応する必要があるかもしれません。これは、RestartPolicy=AlwaysなPodが、Pod削除かgraceful node shutdownの2つのシナリオで、Succeeded phaseに移行するように変更されたためです。 (#115331, @mimowo) [SIG Cloud Provider, Node and Testing] [sig/node,sig/testing,sig/cloud-provider]
Changes by Kind
Deprecation
- Node オブジェクトの deprecated なフィールド
spec.externalID
をセットしたリクエストについて、warning レスポンスがかえるようになりました。(#115944, @SataQiu) [SIG Node] [sig/node]-
spec.externalID
はもともと、パブリッククラウドにおける instance id のような、ノードに紐づく外部のIDが設定されていたようです。(参照)
-
API Change
- feature gate
NodeLogQuery
が追加され、クライアントサイドでのリーダの実装やノードへのログインをすることなくkubectlを使って、クラスタ管理者にログのストリーミングを提供できるようになりました。(#96120, @LorbusChris) [sig/node,sig/api-machinery,sig/apps,sig/windows,sig/cli,sig/testing] - Kubelet の API QPS limit が拡張されました。(#116121, @wojtek-t) [sig/node,sig/api-machinery]
- QPS が 10倍に設定されたようです。
- GRPC プローブが GA しました。
GRPCContainerProbe
feature gate はデフォルトにロックされていて、v1.29で削除されます。この feature gate を明示的に有効化している場合は、削除してください。(#116233, @SergeyKanzhelev) [sig/node,sig/api-machinery,sig/apps] -
Kubelet Topology Manager
が GA しました。(#116093, @swatisehgal) [sig/node,sig/api-machinery,sig/testing]- Topology Manager についてはスライドをご参照ください。この機能を用いることで、サーバ内のNUMA構成を考慮したデバイスの確保が実現でき、「NUMA的に近い」デバイスを同一のPodにつけることができます。
-
KubeletTracing
が beta に昇格しました。この feature gate はデフォルトで有効です。(#115750, @saschagrunert) [sig/node,sig/instrumentation]- KEPはこちら。 OpenTelemetry コレクタと接続することで、Kubeletのトレース情報を収集することができます。
- seccomp profile の defaulting が GA しました。kubelet の
--seccomp-default
flag か、seccompDefault
kubelet configuration field をtrue
に設定することで、そのノード上のPod で、RuntimeDefault
seccomp Profile が利用されるようになります。カーネルやコンテナランタイムのバージョンによっては、ワークロードのパフォーマンスに悪い影響を与えるかもしれません、これらを特定して緩和する方法は、seccomp tutorialにまとめられています。 (#115719, @saschagrunert) [SIG API Machinery, Node, Storage and Testing] [sig/storage,sig/node,sig/api-machinery,sig/testing] -
resource.k8s.io
API のAllocationResult
構造体に破壊的変更を行いました。この変更によって、DynamicResourceAllocation
向けのkubelet pluginに、複数のリソースドライバコントローラからの割り当てを提供することができるようになります。(#116332, @klueska) [sig/scheduling,sig/node,sig/api-machinery,sig/apps,sig/cli,sig/testing] - Kubelet:
maxParallelImagePulls
フィールドを設定することで、並行にkubeletが実行するimage pullの数を制御することができます。 (#115220, @ruiwen-zhao) [SIG API Machinery, Node and Scalability] [sig/scalability,sig/node,sig/api-machinery] - Kubelet:
MemoryThrottlingFactor
のデフォルト値の0.9
への変更と、memory.high
を計算する式の変更を行いました。(#115371, @pacoxu) [sig/node,sig/api-machinery,sig/apps]- limits.memory をギリギリまで使うワークロードのパフォーマンスを改善するため、0.8から0.9に増やしたそうです。(参考)
- deprecated になっていた
--enable-taint-manager
と--pod-eviction-timeout
引数を削除しました。(#115840, @atosatto) [sig/node,sig/api-machinery,sig/apps,sig/testing] -
DynamicResourceManagement
のv1alpha1
の kubelet plugin API を削除しました。すべてのプラグインはv1alpha2
に移行する必要があります。 (#116558, @klueska) [sig/scheduling,sig/node,sig/api-machinery,sig/apps,sig/cli,sig/testing] -
PodDistruptionBudget
のspec.unhealthyPodEvictionPolicy
が beta に昇格し、デフォルトで有効になりました。有効になっているサーバでは、このフィールドはAlwaysAllow
に設定されることがあり、常に PodDistruptionBudget でカバーされる unhealthy pod が常に削除されることを許します。(#115363, @ravisantoshgudimetla) [SIG Apps, Auth and Node] [sig/node,sig/auth,sig/apps] -
DownwardAPIHugePages
kubelet feature が GA しました。(#115721, @saschagrunert) [SIG Apps and Node] [sig/node,sig/apps]- DownwardAPI で hugepage の requests と limits がとれるようになる機能です。
-
Requests
に関する API リファレンスが更新され、Limits を超えられないことが説明されました。 (#115434, @ehashman) [sig/node,sig/docs,sig/architecture]- ご存知かと思いますが、Podの Resource Request は、Resource Limit よりも小さい値を指定する必要があります。
-
UpdateContainerResources
CRI API が Linux と Windows でサポートされるようになりました。(#102884, @vinaykul) [sig/scheduling,sig/node,sig/api-machinery,sig/apps,sig/instrumentation,sig/testing]- UpdateContainerResourcesはこのようなAPIです。
- Kubelet:
--container-runtime-endpoint
と--image-service-endpoint
が kubelet config に移行されました。(#112136, @pacoxu) [sig/scalability,sig/node,sig/api-machinery] -
resource.k8s.io/v1alpha1
がresource.k8s.io/v1alpha2
に移行しました。クラスタを更新するまえに、ResourceClaim, ResourceClaimTemplate, ResourceClass, PodScheduling オブジェクトは削除される必要があります。この変更は内部的なものなので、YAMLファイルは apiVersion 以外変更する必要がありません。(#116299, @pohly) [sig/scheduling,sig/node,sig/api-machinery,sig/apps,sig/cli,sig/testing]
Feature
-
NewVolumeManagerReconstruction
が追加されデフォルトで有効になりました。これにより、kubelet起動時にマウントされたボリュームの探索が更新されます。kubeletが起動時にスタックしたり、削除されたPodのボリュームのマウントが解除されない場合は、issueを起票してください。(#115268, @jsafrane) [sig/storage,sig/node] - Topology Manager のメトリクスが追加され、発生したadmission requestとエラーについて追跡できるようになりました。(#115137, @swatisehgal) [sig/node,sig/testing]
-
メトリクス名は
kubelet_topology_manager_admission_requests_total
,kubelet_topology_manager_admission_errors_total
。
-
メトリクス名は
- Topology Manager のメトリクスが追加され、Topology Manager でのadmissionにかかった時間が測れるようになりました。(#115590, @swatisehgal) [sig/node,sig/testing]
-
メトリクス名は
kubelet_topology_manager_admission_duration_ms
。
-
メトリクス名は
-
UserNamespacesStatelessPodsSupport
feature gate を有効にすることで、分離された user namespace で、stateless pod を実行することができます。(#116377, @giuseppe) [SIG Apps, Node and Storage] [sig/storage,sig/node,sig/apps]- KEPはこちら。 user namespace によって、pod 内のプロセスに特権をもたせていたとしても、ホストでは非特権なuid/gidにすることができるようになります。コンテナ内のプロセスがホストにアクセスできたとしても、ホストでは、特権を失っており問題がない、というふうなことを実現できます。
- Dynamic Resource Allocation framework が network device に対しても利用できるようになりました。(#114364, @bart0sh) [SIG Node] [sig/node]
-
もともとは、CNI が呼ばれるタイミングと、
PrepareResources
API が呼ばれるタイミングが逆転していたため、正しく Prepare したのちに NIC を Pod につけることができませんでした。
-
もともとは、CNI が呼ばれるタイミングと、
- GRPC probe の linger option が 1s に設定されて、TIME-WAIT state を改善するようになりました。(#115321, @rphillips) [SIG Network and Node] [sig/network,sig/node]
- Evented PLEG が Beta になりました。(#115967, @harche) [sig/node]
- KEPはこちら。PLEG は Pod Lifecycle Event Geneletor の略です。CRI からコンテナの情報を取得する方法を、polling から event 駆動に変更することで、更新をすばやく少ないCPU時間で取得できるようにすることを目指しています。
- Kubelet の TCP / HTTP probe がよりネットワークのリソース(conntrack entries, sockets) を効率的に使用するようにしました。これは、
TIME-WAIT
の長さをデフォルトの60秒から1秒に短縮する、ということで実現されています。これにより kubelet が socket を開放し、conntrack entryや割り当てられた ephemeral port を開放できるようになります。(#115143, @aojea) [sig/network,sig/node] - Kubelet が pod に
net.ipv4.ip_local_reserved_ports
sysctl を使うことをデフォルトで許可するようになり、minimal kernel version が 3.16 になりました。Pod Security Admission は v1.27 以上で、baseline および restricted ポリシーでこれを許可します。(#115374, @pacoxu) [SIG Auth, Network and Node] [sig/network,sig/node,sig/auth]
Documentation
- CRI API における reason フィールドが、OOM Killer によってコンテナが終了された時に、
OOMKilled
になることをドキュメントしました。(#112977, @mimowo) [sig/node] - Requests が Limits を超えた場合のエラーメッセージに、Limits の値が含まれるようにしました。(#112925, @SergeyKanzhelev) [sig/node,sig/apps]
Falling Test
- Windows における Kubelet の
--resolv-conf=Host
オプションが、Pod DNS Policy を想定通り設定します。(#110566, @claudiubelu) [sig/network,sig/node,sig/windows,sig/testing]
Bug or Regression
- Host Path Provisioner によって作成された Host Path Bolume の
SELinux
ラベルを修正 (#112021, @mrunalp) [sig/storage,sig/node] - Windows における CPU Limits の計算が、64 論理Processer を超えるとおかしかった問題を修正 (#114231, @mweibel) [sig/node,sig/windows]
- 実際にはPodにマウントされていないディレクトリがあるとき、これをアンマウントしようと試行してしまうことで、Pod の終了がスタックする問題を修正 (#115769, @mochizuki875) [sig/storage,sig/node]
- コンテナランタイムが終了時にエラーを返したことで、kubeletが再起動されるまで、force delete された pod の終了に失敗する。ランタイムのエラーに関してテストを強化し、もっと頑健な reconcile を実装することで、static pod (とくに、固定されたUIDを利用するもの)が再起動できるようにした。副作用として、static pod の再起動にかかるレイテンシが短縮され(平均時間で4秒から2秒)、pod 設定の変更がより早く反映されるようになった。新しいメトリック
kubelet_known_pods
が Alpha 安定性として追加され、kubelet が追跡しているPodの数を報告するようになった。オペレータはこのメトリックを使って、終了していない孤立したPodの増加を確認することができる。(#113145, @smarterclayton) [SIG API Machinery, Auth, Cloud Provider, Node and Testing] [sig/node,sig/api-machinery,sig/auth,sig/testing,sig/cloud-provider] - ユーザが ephemeral container を static pod に追加しようとした時に、わかりやすい validation error が出力されるようになった。(#114086, @xmcqueen) [sig/node,sig/apps]
- service か image のエンドポイントがエラーを返す時に、kubelet の起動が CRI connection に失敗する。(#115102, @saschagrunert) [sig/node]
- Kubelet: image pull が終了したときの recording issue を修正 (#114904, @TommyStarK) [SIG Node] [sig/node]
- Kubelet:
fsquota
のモニタリングが有効な時、ConfigMaps
のレンダリングが停止するバグを修正 (#112624, @pacoxu) [sig/storage,sig/node] - 破壊的変更の可能性 - Windows における統計収集の頻度を1秒から10秒に変更 (#116546, @marosset) [SIG Node and Windows] [sig/node,sig/windows]
- key encipherment の利用に関する API validation を緩和し、 kubelet が指定された使い方をするようになった (#111660, @pacoxu) [sig/node,sig/api-machinery,sig/auth,sig/apps]
- Windows 環境において、複数のプロセッサグループがある際の CPU usage が正しく計算されるようになった (#110864, @claudiubelu) [SIG Node, Testing and Windows] [sig/node,sig/windows,sig/testing]
Other (Cleanup or Flake)
- Node-local kubelet
podresource
API における基本的な DoS 防止を実装 (#116459, @ffromani) [SIG Node and Testing] [sig/node,sig/testing] - FormatMap の性能を最悪ケースについて2倍、4倍程度改善 (#112661, @aimuz) [SIG Node] [sig/node]
- Kubelet: deprecated flag
--container-runtime
を削除 #114017, @calvin0327) [SIG Cloud Provider and Node] [sig/node,sig/cloud-provider] - Kubelet: deprecated flag
--master-service-namespace
を削除 (#116015, @SataQiu) [sig/node] - AWS kubelet credential provider を削除。代わりに、
ecr-credential-provider
という名前の external kubelet credential provider binary を利用してください。(#116329, @dims) [SIG Node, Storage and Testing] [sig/storage,sig/node,sig/testing] -
CSIInlineVolume
,CSIMigration
,DaemonSetUpdateSurge
,EphemeralContainers
,IdentifyPodOS
,LocalStorageCapacityIsolation
,NetworkPolicyEndPort
,StatefulSetMinReadySeconds
が v1.25 で GA していたが、feature gate が削除された。(#114410, @SataQiu) [SIG Node] [sig/node]