本記事は,Kubernetes 変更内容共有会(v1.23) の SIG-Node(kubelet)に関する資料として準備されました.Kubernetes 1.23の CHANGELOG から,SIG-Nodeに関するところを抜粋して紹介します.
は筆者(@y1r96)による補足です.
所感
エフェメラルコンテナ(Pod作成後に,デバッグ用のコンテナなどを追加して同じnamespaceでデバッグする機能)がBetaに昇格しました.小さいイメージを使っている場合にもデバッグがやりやすくなっていいですね.また,Generic エフェメラルボリューム がGAしました.これは,色々なstorageClass上にエフェメラル(podと同じ生存期間)なPVを設定できる機能で,ローカルボリュームやメモリでは足りない大きな容量のエフェメラルなPVを設定するときに便利そうです.また,CPU Managerの機能拡張(ポリシーオプションの追加や様々なNUMA環境のサポート)も行われており,高性能計算的な計算負荷が大きいワークロードをKubernetesに載せることがやりやすくなりました.
Urgent Upgrade Notes
- seccomp annotations
seccomp.security.alpha.kubernetes.io/pod
とcontainer.seccomp.security.alpha.kubernetes.io/[name]
が v1.19 からdeprecatedになり,v1.25で削除されることになりました.かわりに,seccompProfile
API を使って設定してください.(#104389, @saschagrunert)
Changes by Kind
Deprecation
- kubeletのdeprecatedだったオプション
--experimental-bootstrap-kubeconfig
が削除されました.かわりに,--bootstrap-kubeconfig
を使って設定してください. (#103172, @niulechuan)
API Change
- エフェメラルコンテナがBetaになり,デフォルトで有効になりました. (#105405, @verb)
- UDPサービスにおける接続がstaleであることを判定するロジックがエンドポイントのreadinessを考慮していなかった,kube-proxyのregression bugを修正しました.(#106163, @aojea)
- Kubeletにおけるlogのverbosityとflush頻度をコマンドライン引数でしか設定できませんでしたが,設定ファイルからも設定できるようになりました. (#106090, @pohly)
- JSON log outputが設定可能になり,infoメッセージを標準出力,errorメッセージを標準エラー出力に出力できるようになりました.infoメッセージはバッファリングにも対応しています.デフォルトの動作は,以前のようにどちらも標準出力にバッファリングなしで出力します. (#104873, @pohly)
- KubeletがノードのOSラベルとpodのOSラベルを照合して,一致しない場合は拒否するようにします. (#105292, @ravisantoshgudimetla)
-
v1.23から追加された
podSpec.os
の情報を使って照合を行うようです.
-
v1.23から追加された
- KubeletConfigration v1beta1 の
ResolverConfig
の型がstring
から*string
に変更になりました. (#104624, @Haleygo) - v1.17からgraduateしてstableになった
NodeLease
feature gateが削除されました. (#105222, @cyclinder) - deprecated だった
--seccomp-profile-root
引数と,seccompProfileRoot
config が削除されました. (#103941, @saschagrunert) - pod priority ベースの graceful なノードシャットダウンをサポートしました. (#102915, @wzshiming)
- プライオリティごとにpodの終了に要する時間を設定することができます.例えば高プライオリティなpodは,通常のプライオリティのpodに比べ停止まで長時間待つ,というふうな設定をすることができます.詳しくはKEP-2712 をご参照ください.
- Generic エフェメラルボリューム が GA しました.現在は無条件に有効です.(#105609, @pohly)
-
エフェメラルボリューム とは,podの生存期間と同じ生存期間を持つボリュームのことで,有名な例としては
emptyDir
があります. Generic エフェメラルボリュームとは,このようなボリュームを任意のPersistentVolumeClaimTemplate
をインラインに埋め込んで定義できる機能です.
-
エフェメラルボリューム とは,podの生存期間と同じ生存期間を持つボリュームのことで,有名な例としては
- Kubeletの
--register-with-taints
オプションが,config fileのregisterWithTaints
というフィールドから設定するようになりました. (#105437, @cmssczy)
Feature
-
CPUManager
のポリシーオプションがBetaになり,標準で使えるようになりました,また,ポリシーオプションについてそれぞれAlphaやBetaが設定されるようになりました. (#105012, @fromanirh) -
CPUManager
のstaticポリシーにdistribute-cpus-across-numa
オプションが追加されました.有効にすると,CPUManager
がCPU割り当てに複数のNUMAノードが必要な場合,その複数個のNUMAノード上にCPUを均等に割り付けることになります.-
CPUManager
とは,v1.12からbetaになったPodのCPU要求を予めCPUコアに割り付ける機能のことです.policyには何も行わないnone
と,割り付けを行うことで予めpodが使うコアを決めておくstatic
があります.これまではstaticポリシーのオプションとしてfull-pcpus-only
があり,これは仮想コア(vCPU)ではなく物理コアを割り付けるものでした.この変更ではさらに,複数のNUMAノードに均等に割り付けるdistribute-cpus-across-numa
オプションを追加することになります.
-
- Portworxプラグインのサポートがcsi-translation-libに追加されました.これにより,
CSIMigrationPortworx
feature gateが使えるようになります.(#103447, @trierra)- PortworxはPure Storage社のストレージ・ソリューションで,同社製のストレージ・アプライアンス上のストレージと連携する機能のようです.
-
PodAndContainerStatsFromCRI
feature gateが実装され,ユーザがcAdvisor
ではなくCRI由来のPod Statsを利用することができるようになります. (#103095, @haircommander) - pinされたimageのgarbage collectionを行わないように,ユーザが設定できるようになりました. (#103299, @wgahnagl)
- CRIのv1 APIがデフォルトで使われるようになりました.コンテナランタイムがv1 APIをサポートしていない場合は,v1alpha2 APIが利用されます. (#106501, @ehashman)
- ノードラベルのreconciliationが,フラグ
--node-status-update-frequency
で設定できる間隔で実行されます (#104613, @ravisantoshgudimetla)-
ノードのラベル(
kubernetes.io/os
,kubernetes.io/arch
)が定期的にreconcileされているので,podSpec.os
などと照合したpod schedulingが行えるようになりました.
-
ノードのラベル(
- PodResource API の
GetAllocatableResources
エンドポイントがBetaになり,デフォルトで有効になりました.(#105003, @swatisehgal)- このAPIについては,v1.21の変更内容共有 でryotarai-sanが紹介しているようです.
-
CSIMigrationGCE
フラグがデフォルトで有効になりました.(#104722, @leiyiz) - feature
DownwardAPIHugePages
がデフォルトで有効になりました.(#106271, @mysunshine92) - system-validators ライブラリが v1.6.0 になりました (#106323, @neolit123)
Bug or Regression
- Kubeletがrejectしたpodがしばらくの間acceptだと考慮されてしまい,ノードにフィットするいくらかのpodがrejectされていました.また,終了中のpod(ただし,failedだと表示されている)もリソースを使ってしまっていたことも考慮されるようになりました. (#104817, @smarterclayton)
-
Kubelet Graceful Shutdown
に関するKubernetes Eventが追加されました (#101081, @rphillips) - ContainerdにおけるWindows Networkの統計情報がサポートされるようになりました (#105744, @jsturtevant)
- SecretやConfigMapが正しくマウントできない問題を修正するため,watch based managerの初期化が遅いときにリフレクタを早く終了しないようにします.(#104604, @wojtek-t)
- Kubeletにおいて証明書のローテーションを行わない場合,カスタムダイヤラを使用しないようにしてください.そうすることでTCP接続を再利用でき,apiserverとkubelet間に1つの接続が存在するようにできます.もし,ユーザがHTTP/1.1を利用してstaleな接続についての問題を実験したい場合は,kubeletに環境変数
DISABLE_HTTP2
を設定することで以前の振る舞いを強制することができます.(#104844, @aojea) - exec probe がtimeout した場合のevent messageを改善しました (#106201, @yxxhero)
- Evicted や他の terminated なpodが,
Running
phase に戻らないようにします. (#105462, @ehashman) - どれだけのリソースが現在使用されていて,いつ,より多くのpodを受け入れることができるのか判断する計算から,Kubeletが既に完了したpodを正しく除くことができていないregressionを修正しました.(#104577, @smarterclayton)
- Credential Provider Config fileで与えられた環境変数を追加していなかったことで,外部のcredential provider binaryが正しく実行できていなかった問題を修正しました. https://github.com/kubernetes/kubernetes/issues/102750 を参照ください.(#103231, @n4j)
- cgroup v1とsystemd driverを利用しているとき,たまにpodのcgroupがフリーズする問題を修正しました (#104528, @kolyshkin)
- Graceful node シャットダウンによって,期待されるinhibit delayよりも実際のinhibit delayの方が大きくなることを許します. (#103137, @wzshiming)
- Kubelet が Generic Ephemeral Volumes に関する
kubelet_volume_stats_*
メトリクスを報告していない問題を修正しました (#105569, @pohly) - KubeletのNode Grace Shutdownがshutdown時にprobeを終了するようにします (#105215, @rphillips)
- Kubeletのログローテーションに関するファイルディスクリプタがリークしていたのを修正します (#106382, @rphillips)
- Kubeletが起動時にフラグを出力するとき,最終的なロギング設定が利用されるようにします (#106520, @pohly)
- Pod SecurityContext の sysctls の名前にスラッシュが入っているのをサポートするようにします.(#102393, @mengjiao-liu)
- InitコンテナがOOM Killされた場合に,Podがスタートしない.(#104650, @yxxhero)
- PodResources interface が変更され,isolated CPUsしか返さないようになった.(#97415, @AlexeyPerevalov)
- dockershim経由で統計情報を取得するためdockerを呼び出す回数を減らした.Windows環境においてレイテンシが小さくなり,Linux環境においてはcpu cyclesが削減された.(#104287, @jsturtevant)
-
kubelet_started_pods_errors_toral
メトリクスからエラーメッセージラベルを取り除いた (#105213, @yxxhero) - static podsを更新するときに,grace periodが尊重されるようになった (#104743, @gjkim42)
- バイナリをPIEモードでビルドするようにしたのをやめた (#105352, @ehashman)
- dockershim CRI API version を
v1alpha2
に戻した (#106808, @saschagrunert) - static pod が削除され,固定されたUIDで再作成されたとき,podが正しく再起動されていなかった (#104847, @smarterclayton)
Other (Cleanup or Flake)
- socketとNUMAノードの対応が1:1でないとき,NUMAノード全体をCPUManagerにおいて割り当てることができるようにしました (#102015, @klueska)
- 近年のCPUはCPUソケットとNUMAノードが1:1対応していないことがあります.例えばAMD EPYCは各CPUソケット内に複数のメモリコントローラを内蔵しており,各コアから見ると近いメモリコントローラと,遠いメモリコントローラがあります.それを考慮してtask schedulingを行うためにNUMAとしてOSに見せる設定をしている場合は,CPUソケット内に複数のNUMAノードがあることになります.
-
StartupProbe
feature gate は, v1.20からGAしており,無条件に有効です.このfeature gateが指定できなくなりました.(#104168, @ialidzhikov) -
SupportPodPidsLimit
とSupportNodePidsLimit
feature gate は,v1.20からGAしており,無条件に有効です.これらのfeature gateが指定できなくなりました. (#104163, @ialidzhikov) -
cri-tools
の依存が v1.22.0 に更新されました (#104430, @saschagrunert)