Kubernetes 1.26 の SIG-Network の変更内容をまとめました。大きな変更はありませんが、着実に改善されています。
過去の SIG-Network の変更内容
- Kubernetes 1.25: SIG-Network の変更内容
- Kubernetes 1.24: SIG-Network の変更内容
- Kubernetes 1.23: SIG-Network の変更内容
- Kubernetes 1.22: SIG-Network の変更内容
- Kubernetes 1.21: SIG-Network の変更内容
- Kubernetes 1.20: SIG-Network の変更内容
- Kubernetes 1.19: SIG-Network の変更内容
- Kubernetes 1.18: SIG-Network の変更内容
- Kubernetes 1.17: SIG-Network の変更内容
- Kubernetes 1.16: SIG-Network の変更内容
- Kubernetes 1.15: SIG-Network の変更内容
- Kubernetes 1.14: SIG-Network の変更内容
以下は、Kubernetes v1.26 の Changelog を和訳したものです。 の部分は筆者の補足になります。
Kubernetes 1.25 と 1.26 の API 差分
Kubernetes API (/api/
, /apis/
) から取得した情報を使って、Kubernetes 1.25 と 1.26 の API の差分を確認しました。差分は以下になります。flowschemas
, prioritylevelconfigurations
の v1beta3 が追加され、その v1beta2 が廃止予定 (deprecated) となり, v1beta1 が削除されました。
- API の追加:
flowcontrol.apiserver.k8s.io/v1beta3/flowschemas
flowcontrol.apiserver.k8s.io/v1beta3/prioritylevelconfigurations
- API の削除:
autoscaling/v2beta2/horizontalpodautoscalers
flowcontrol.apiserver.k8s.io/v1beta1/flowschemas
flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurations
- Deprecation の指定:
flowcontrol.apiserver.k8s.io/v1beta2/flowschemas
flowcontrol.apiserver.k8s.io/v1beta2/prioritylevelconfigurations
各 Kubernetes の API バージョン対応表も、Kubernetes 1.26 時点での情報に更新しました。
API Change (API の変更)
- コンテナの
httpGet
を使ったpreStop
とpostStart
ライフサイクルハンドラは、指定されたscheme
とheaders
フィールドを尊重するようになりました。これにより、カスタムヘッダとHTTPS
へのスキーム変更が可能になり、startup/readiness/liveness probe と一貫性を持つようになります。scheme: HTTPS
が設定されたライフサイクルハンドラが、エンドポイントが実際には HTTP であるというエラーに遭遇したときは、以前のリリースとの互換性のため、HTTP でリクエストするようフォールバックします。この問題が起きた時、LifecycleHTTPFallback
イベントが Pod のネームスペースに記録され、kubelet のkubelet_lifecycle_handler_http_fallbacks_total
メトリックが増加されます。クラスタ管理者は、kubelet の--feature-gates=ConsistentHTTPGetHandlers=false
を設定することで、このライフサイクルの拡張を無効にできます。(#86139, @jasimmons) - API オブジェクトの
metav1.LabelSelectors
の指定は、エラーとなる無効なラベルの値が含まれていないことを検証するようになりました。既存の無効なオブジェクトの更新は可能ですが、新規のオブジェクトは有効なラベルセレクタを含む必要があります。(#113699, @liggitt) - 各フィーチャーゲートが有効かどうかを調べられる
kubernetes_feature_enabled
メトリックを追加しました。 (#112690, @logicalhan)-
コマンドで確認したい場合は、以下のように
kubectl get
の--raw
を使って直接/metrics
にアクセスすると便利です。
-
コマンドで確認したい場合は、以下のように
$ kubectl get --raw /metrics | grep ProxyTerminatingEndpoints
kubernetes_feature_enabled{name="ProxyTerminatingEndpoints",stage="BETA"} 1
- ループバックアドレスでの NodePort サービスを無効化できる kube-proxy のフラグ(
--iptables-localhost-nodeports
, デフォルト true)が追加されました。注意: これは iptables モードで ipv4 のときのみ適用されます。(#108250, @cyclinder) - aggregated discovery がアルファとなり、
AggregatedDiscoveryEndpoint
フィーチャーフラグで切り替えられるようになりました (#113171, @Jefftree)-
API リソースのディスカバリは、何度も HTTP リクエストが発生し負荷と遅延が問題となっていました。この機能では
APIGroupDiscovery
というリソースが導入され、これを List で取得することで一度の HTTP でリソース一覧が取れるようになっているようです。 - 参考: KEP-3352: Aggregated Discovery
-
API リソースのディスカバリは、何度も HTTP リクエストが発生し負荷と遅延が問題となっていました。この機能では
-
ServiceInternalTrafficPolicy
機能が GA となりました (#113496, @avoltz) - kube-proxy で "userspace" プロキシーモード (1 年以上 deprecated だった)が Linux、Windows どちらでもサポートされなくなりました。利用者は Linux では "iptables" または "ipvs"、Windows では "kernelspace" を使ってください。(#112133, @knabben)
-
MixedProtocolLBServiceA
が beta から GA になりました。(#112895, @janosi) -
EndpointSliceTerminatingCondition
フィーチャーゲートが GA になりました。このゲートは固定されるようになり、v1.28 で削除されます。(#113351, @andrewsykim)
Feature (機能追加)
- 大規模なクラスタで、kube-proxy の iptables バックエンドが service/endpoint の変更をより効率的に処理するようになりました。(#110268, @danwinship)
-
見た限り
MinimizeIPTablesRestore
というフィーチャーゲート(デフォルト false)を有効にしたときに動くロジックのようです。 - 参考: KEP-3453: Minimizing iptables-restore input size
-
見た限り
- kubeconfig の cluster info の下に、
DisableCompression
という新しいフィールド(default =false
)が追加されました。true
に設定されたとき、その kubeconfig を使ったクライアントからの apiserver へのリクエストに対するレスポンスは圧縮が無効になります。これはクライアント・サーバー間の帯域が十分(>30MB/s)か、サーバーの CPU に制約がある場合に、list コールのレイテンシの大幅に改善します。(#112309, @shyamjvs)-
フィールド名が
EnableCompression
ではなく否定形を使っているのは、RestConfig のフィールドや Go の httpライブラリに合わせたからとissue のコメントにありました。
-
フィールド名が
- アルファのメトリクススタビリティで、
pod_status_sync_duration_seconds
ヒストグラムが、Kubelet が Pod の状態変化を検出したときにそれを書き込むのにかかった時間を報告するようになりました。(#107896, @smarterclayton) [SIG Apps, Architecture, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scheduling, Storage and Testing] -
kubectl
に--disable-compression
フラグ (default = false) が追加されました。これが true のとき、apiserver
に対する全てのリクエストはレスポンスの圧縮が無効になります。これはクライアント・サーバー間の帯域が十分(>30MB/s)か、サーバーの CPU に制約がある場合に、list コールのレイテンシの大幅に改善します。(#112580, @shyamjvs) - API サーバートレーシングが、様々な span と span イベントを含むようになりました。(#113172, @dashpole) [SIG API Machinery, Architecture, Auth, Instrumentation, Network, Node and Scheduling]
-
TopologyAwareHints
の有効・無効時にイベントが発行されるようになりました。(#113544, @LiorLieberman)-
TopologyAwareHintsEnabled
,TopologyAwareHintsDisabled
という Reason のイベントが発行されるようです
-
-
ServiceIPStaticSubrange
機能が GA になりました。(#112163, @aojea)- v1.24 でアルファとして導入され 1.26 で無事 GA となりました
- 参考: https://qiita.com/tkusumi/items/da474798c5c9be88d9c5
- Kube-apiserver:
gzip
圧縮がレベル 4 からレベル 1 に変更し、10~50% 帯域幅の利用が増えることと引き換えに、大きい list コールのレイテンシを改善しました。これにより、非常に大きいページ化されていないリストコールの呼び出しがタイムアウトの制限を超えるまでのヘッドルームが増加しました。(#112299, @shyamjvs) -
ExpandedDNSConfig
機能がベータとなり、デフォルトで有効になりました。この機能はコンテナランタイムのサポートが必要な点に留意してください。(#112824, @gjkim42) [SIG Network and Testing]- DNS のサーチパスの最大が 6 から 32, サーチパスの文字列長の最大が 256 から 2048 へ拡張されるものです。
- 参考: KEP-2595: Expanded DNS Configuration
-
ProxyTerminatingEndpoints
機能がベータとなり、デフォルトで有効になりました。これが有効の時、トラフィックポリシーがlocal
でノード上に停止中 (terminating) 状態の pod しか存在しないときは、kube-proxy は停止中の pod にトラフィックを向けるようになります。(#113363, @andrewsykim) -
ComponentSLIs
フィーチャーゲートが有効の時、/metrics/slis
がkube-proxy
で利用可能となり、ヘルスチェックのメトリクスを取得できるようになります。(#113057, @Richabanker)
Bug or Regression (バグまたはリグレッション)
- コンテナの
/etc/resolv.conf
にホストのsearch .
が伝播しないようにしました。(#112157, @dghubble)-
alpine など musl ベースの DNS 解決時に
search .
があることで失敗する問題があったようです
-
alpine など musl ベースの DNS 解決時に
- Service の
appProtocol
の変更がロードバランサの更新を引き起こさないバグを修正しました。(#112785, @MartinForReal) [SIG Cloud Provider and Network] -
winkernel
proxier がサービスバックエンドの変更のたびに、プロキシールールのリークを引き起こす問題を修正しました。(#112837, @daschott) - endpointslice コントローラのバックオフの遅延時間の最大値を増加し、Service を同期するときに期待される遅延時間の並び(sequence of delays)と一致させました。(#112353, @dgrisonnet)
-
遅延時間の並び(sequence of delays)は Exponential backoff におけるによる間隔の並びのことです。本 PR では
1s, 2s, 4s, 8s, 16s, 32s, 64s, 128s, 256s, 512s, 1000s
の並びに統一されました。
-
遅延時間の並び(sequence of delays)は Exponential backoff におけるによる間隔の並びのことです。本 PR では
- kube-proxy は ipvs モードを指定したときに適切にシステムが設定されていないとき、iptables モードにフォールバックしなくなりました。代わりに単にエラーで終了するようになりました。(#111806, @danwinship) [SIG Network]
- kubeadm:
ClusterConfiguration
の networking フィールドを検証するときのバグを修正しました。(#112751, @SataQiu) - kubelet は、
--node-ip
の使用をやめたときに、Node の cloud node IP アノテーションを正しくクリーンアップするようになりました。この修正は、1.23 で external cloud provider で不要に--node-ip
を指定したことで 1.24 で問題が発生し、kubelet の引数から不要な--node-ip
を削除してもこのアノテーションが削除されず修正できなかった、という問題を修正します。(#112184, @danwinship) [SIG Network and Node] - kubelet: /etc/resolv.conf に複数の option 行があったとき、
Default
DNS ポリシーの Pod では全ての option を一行にマージするようになりました。(#112414, @pacoxu) [SIG Network and Node]- 以前までは複数の options 行があった場合は最後の一行のみが採用される実装だったようです。
- winkernel proxier が古い VIP を有効として扱ってしまう問題を解決しました。(#113521, @daschott)
- ノードにアサインされた
pod.Spec.PodCIDRs
の変更を検知したときに、kube-proxy が再起動されるようになりました。(#111344, @aojea)
その他 (Cleanup or Flake)
-
test/e2e/framework
をリファクタリングしコアフレームワークを小さくしました。リソースの監視、ログサイズの監視、メトリクスの収集、でデバッグ情報のダンプのようなオプショナルな機能は、個別の e2e テストスイートでインポートしなければなりません。今までのコアフレームワークの機能を再度有効する init パッケージが提供されます。この PR によってコードがコンパイルできない場合、コミットメッセージにあるスクリプトを使ってアップデートできます。(#112043, @pohly) - 既存の実装にばらつきがあるため、Kubernetes のネットワークプラグインのコンフォーマンスで、Service セッションアフィニティのタイムアウトのテストは必須でなくなりました。今後のリリースで、より良くコンフォーマンスを表現するコンフォーマンステストが開発される予定です。(#112806, @dcbw) [SIG Architecture, Network and Testing]
今後のトピックの紹介
SIG-Network で取り組まれているトピックで、個人的に気になったものを紹介します。
-
reworking the kube-proxy's architecture #2104
- kube-proxy の大幅な刷新 (v2) に関する取り組みです
- 2020 年 10 月から PR がレビュー中 のままですが、v1.27 のマイルストーン入ったようです
- 実装は Kubernetes Proxy NG (KPNG) というレポジトリで実装が進められています
- 特徴の一つは Kubernetes に関する処理を行うコントローラーと、iptables, ipvs などのバックエンドが gRPC で分離できることで、独自のバックエンドが簡単に実装できる点です
-
AdminNetworkPolicy support #2091
- クラスタスコープの NetworkPolicy である AdminNetworkPolicy のサポートです
- クラスタ管理者がクラスタレベルでのネットワークのポリシーをできるようにする機能です
- まだ API の CRD がマージされただけですが NetworkPolicy の不足をカバーしてくれる機能です
-
pod LifecycleHandler should support a sleep option #114465
- Kubernetes で安全に Pod を終了するときに必要な sleep を LifecycleHandler に組み込むという提案です
- sleep の必要性は @superbrothers さんの https://qiita.com/superbrothers/items/3ac78daba3560ea406b2 が参考になります
- この issue に気づかず自分も似た提案を SIG-Network の ML にポストしましたが、この issue が先にあったので撤回しました
-
sig/network
のラベルは付いていませんが関係ありそうなので紹介します
- Kubernetes で安全に Pod を終了するときに必要な sleep を LifecycleHandler に組み込むという提案です
参考
- SIG-Network KEPs SIG-Network の KEP が管理されているダッシュボード
- SIG-Network の議事録
- sig/network ラベル付きの open な issue