本記事は,Kubernetes 変更内容共有会(v1.26) の SIG-Node(kubelet)に関する資料として準備されました.Kubernetes 1.26の CHANGELOG から,SIG-Nodeに関するところを抜粋して紹介します.
は筆者(@y1r96)による補足です.
所感
柔軟にリソースを管理する機能 ResourceClaim
APIが利用できるようになりました.このAPIにより,これまでDevice Pluginで実現されてきたノード単位のデバイスだけではなく,クラスタ単位のデバイスなどユーザ定義の階層ごとに特別なリソースを定義できます.KEPでは,ユースケースとして,コンテナ起動時に特権でのリプログラミングが必要なFPGAデバイスや,NVIDIAのMIGのようにGPUを分割して複数のPod / Containerから共有する機能,optional なデバイス, ファブリックデバイス(network / link)などが挙げられていました.
他にも,Topology Managerの拡張として --topology-manager-policy-options
フラグが追加され,NUMAノードの距離に応じた割り当てが可能になる prefer-closest-numa-nodes
オプションが追加されました.これまで,2-wayのサーバで各ソケットに複数のNUMAノードが存在する場合に,kubeletがソケット内に閉じたワークロードの配置とソケットをまたぐ配置を区別しない割り当てを行っていましたが,この挙動が改善されるようで,とても楽しみにしています.弊社のインターンさんによるブログ「KubernetesクラスタにおけるGPU-NIC割り当ての改善によるRDMAの高速化」も関連するところがありますので,興味のある方はぜひご参照ください.
Urgent Upgrade Notes
SIG-Nodeに関するものはとくにありません.
Changes by Kind
Deprecation
SIG-Nodeに関するものはとくにありません.
API Change
-
ResourceClaim
API (resource.k8s.io/v1alpha1
内) が追加されました(DynamicResourceAllocation
feature gate が必要です).この新しいAPIは,これまでの Device Plugin に比べ,ノード単位,クラスタ単位などユーザ定義の階層ごとに特別なリソースの種類を定義できるので,より柔軟性があります. (#111023, @pohly)-
- KEPはこちら,公式ブログはこちらです.
- APIの追加:
- ResourceClass: storageClass のようなもので,クラスタ管理者が追加して,resource driverとの結び付けや,パラメータを指定する
- ResourceClaim: persistentVolumeClaim のようなもので,どのようなリソースがほしいかを定義する
- ResourceClaimTemplate: persistentVolumeClaimTemplate のようなもので,podSpecのなかでまとめて resourceClaim を定義する時に使う
- PodScheduling: コントロールプレーンとresource driverの間で調停を行うためのオブジェクト
- 実装する際に開発する必要のあるコンポーネント:
- controller: 中央でこれらを管理するためのコンポーネント
- kubelet plugin: kubelet にリソースを提供するためのコンポーネント(DaemonSet)
- Device Plugin と同様に gRPC で kubelet と通信をする
- NodePrepareResource rpc: デバイスの準備をするとき
- NodeUnprepareResource rpc: デバイスの利用が完了したとき
- Device Plugin と同様に gRPC で kubelet と通信をする
-
-
コンテナの
preStop
とpostStart
ライフサイクルハンドラのうちhttpGet
を利用するものについては,指定されたスキームとヘッダを尊重するようになりました.例えばカスタムヘッダを設定したり,スキームをHTTPSに設定したりできるので, container startup/readiness/liveness プローブと同様のことができるようになります.スキームをHTTPSに設定したハンドラは,HTTPにフォールバックされるとエラーを報告します.このとき,LifecycleHTTPFallback
が pod のイベントに記録されるとともに,kubelet_lifecycle_handler_http_fallbacks_total
メトリクスが加算されます.クラスタ管理者は--feature-gates=ConsistentHTTPGetHandlers=false
を設定することで,この機能を無効化することもできます. (#86139, @jasimmons) -
Kubelet に
DisruptionTarget
という failure condition が追加されました (graceful node shutdown. node pressure eviction) (#112360, @mimowo)- KEPはこちらです.リトライすべき失敗とリトライする必要がない失敗を区別することで,failure conditionごとに適切に処理することができるようになります.
-
--topology-manager-policy-options
フラグが kubelet に追加されました.これは, Topology Manager のポリシーを微調整するために使われるものです.最初のオプションではprefer-closest-numa-nodes
というNUMAノード間が近いときも許すようにするポリシーが追加されました.(#112914, @PiotrProkop)-
- KEPはこちらです.
- 近年のCPUは,1ソケット内に分割されたL3キャッシュを持っていたりチップレットで作られていたりと,コア間レイテンシが異なる場合があります.そのため,1ソケット内に複数のNUMAノードを設定することで,アプリケーションにより細粒度なNUMA情報を与えることができるようになっています.しかし,kubeletは「NUMAノード間の距離」を扱うことができず,代わりに「同じ」か「異なる」の2通りで判断していました.これにより,1ソケット内にワークロードを収められる場合でも,ソケットをまたいだ配置をしてしまったりと最適でない割り当てをしてしまうことがありました.
prefer-closest-numa-nodes
はcAdvisorから提供される「NUMAノード間の距離」を考慮して割り当てをすることで,よりワークロードの割り当てを改善します.
-
-
CFS クオータのデフォルト値を 100ms に設定し,
cpuCFSQuotaPeriod
の最小値を 1ms にして,Linux kernel の実装と合わせます.(#112123, @paskal) -
Kubelet の external Credential Provider 機能がGAしました.Credential Provider Plugin と Credential Provider Config APIs は
v1beta1
からv1
に APIの変更なしに更新されました. (#111616, @ndixita) -
DynamicKubeletConfig
feature gate が API サーバから削除されました.古いノードでも dynamic kubelet reconfiguration は利用できなくなりました.これは Kubernetes version skew policy にも適合しています. (#112643, @SergeyKanzhelev)- DynamicKubeletConfig は,ConfigMap を使ってkubeletの設定を変更できる機能でしたが,v1.11からずっとbetaだったためv1.21で非推奨になったようです.
Feature
-
NodeOutOfServiceVolumeDetach
がベータになりました.(#113511, @xing-yang)- graceful ではないノードの停止などで StatefulSet の PV が外れないことで,別のノードに再スケジュールができない問題などをケアする機能です.
-
pod_status_sync_duration_seconds
ヒストグラムがアルファメトリクスとして報告されるようになりました.これにより,kubeletがpod statusの変更をどの程度の時間で反映できるかを推測することができます.(#107896, @smarterclayton) - cAdvisor の代わりに CRI から container および pod のメトリクスを回収する機能のアルファサポートを追加しました. (#113609, @haircommander)
- cpumanager の cpu allocation と pinning を確認するためのメトリクスが追加されました.(#112855, @fromanirh)
- kubelet再起動後の SELinux mount context が再構築されるようになりました. 機能
SELinuxMountReadWriteOncePod
は完全に実装され,kubeletはプロセス再起動後に SELinux context のキャッシュを失わなくなりました. (#113596, @jsafrane) - Evented PLEG feature gate がサポートされました. (#111384, @harche)
-
- KEPはこちら です.
- PLEG とは,Pod Lifecycle Event Generator の略です.
- Kubeletは,CRI経由で定期的にコンテナの情報を取得して,ステータスを更新しています.現在はコンテナの情報を取得するためにpollingを使っていますが,これはコンテナの情報が更新されていないときも変化があるかどうかを処理して検知する必要があるため,多くのCPU時間を浪費しています.これを解決するため,イベントを使ってCRI実装から更新をそのまま入手できるように開発が進められています.
- しかしながら,イベントは取りこぼす可能性があるので,(list + watchで構成されるinformerと同様に)relist と組み合わせつつ listする頻度を下げることを目的としているようです.
-
-
pod_start_sli_duration_seconds
メトリクスが追加されました. (#111930, @azylinski) -
--container-runtime-endpoint
フラグが空でないように検証を追加しました. (#112542, @astraw99) - Kubelet cpu manager が GA しました. (#113018, @fromanirh)
- Kubelet device manager が GA しました.(#112980, @swatisehgal)
-
ComponentSLIs
feature gate が有効な時,/metrics/slis
が有効になり,ヘルスチェックメトリクスを利用できるようになりました.(#113030, @Richabanker) - cAdvisor が v0.46.0 に更新されました. (#113769, @bobbypage)
Documentation
Bug or Regression
-
search .
をコンテナ内の/etc/resolv.conf
に入れないようにしました (#112157, @dghubble)-
もともと
search .
は Alpine のような musl libc を使う環境下では追加してはいけない検索ドメインでしたが,バグでホストから伝搬してしまう可能性があったようです.
-
もともと
- runc を v1.1.4 に更新しました (#113719, @pacoxu)
- kubelet が
kubectl exec
するときに誤った名前のコンテナを選ぶバグを修正しました (#113041, @saschagrunert) - コンテナのcpu requestが明示的に0に設定されたときの相対的なCPU優先度を,cpu limitの値を使うのではなく,最も低い優先度に設定することで,他のpodのcpuを枯渇させる問題が発生しないようにします. (#108832, @waynepeking348)
-
PodAndContainerStatsFromCRI
機能を修正して,cAdvisorからのメトリクスを組み合わせないようにしました (#113291, @mengjiao-liu) - Kubelet が
--node-ip
フラグを指定していない場合にcloud node IP アノテーションをクリーンアップできるようにします. (#112184, @danwinship) - devicemanager における起動クラッシュを修正しました.(#113021, @rphillips)
- kubelet_getters.go におけるスパムのようなログ
Path does not exist
を修正しました (#112650, @rphillips) - kubelet: スタンドアロンモード時のreflector起動時の nil pointer を修正しました (#113501, @pacoxu)
- kubelet:
/etc/resolv.conf
に複数行の option 行があるとき,Default
DNS ポリシーのときはそれらをpod内において1行にまとめるようにします. (#112414, @pacoxu) -
LocalStorageCapacityIsolationFSQuotaMonitoring
を Alpha に戻しました (#112076, @rphillips) - Pod ログが
--timestamps
オプションを使ったときでも壊れないようにします. (#113481, @rphillips) - pod admission error message を改善しました. (#112644, @vitorfhc)
-
golang.org/x/text
を `v0.3.8`` に更新してCVE-2022-32149に対処しました. (#112989, @ameukam)
Other (Cleanup or Flake)
-
kubelet_kubelet_credential_provider_plugin_duration
はkubelet_credential_provider_plugin_duration
に,kubelet_kubelet_credential_provider_plugin_errors
はkubelet_credential_provider_plugin_errors
に改名しました (#113754, @logicalhan) - Container Runtime Interface (CRI) の
v1alpha2
のサポートをやめて,v1
を実装することを必須にしました. (#110618, @saschagrunert) -
PodOverhead
feature gate を,v1.24からGAしているので削除しました. (#112579, @SergeyKanzhelev) - コンテナイメージのガベージコレクションに失敗したときのログをよりわかりやすくしました. (#112631, @tzneal)
- OpenStack の in-tree cloud provider と,Cinder の in-tree volume provider を削除しました.外部のcloud provider と csi driver を cloud-provider-openstack からインストールしてください. (#67782, @dims)
-
GlusterFS
の in-tree storage driver は v1.25 から非推奨になって,v1.26で完全に削除されました. (#112015, @humblec)