Kubernetes 1.22 の SIG-Network の変更内容をまとめました。SIG-Network に限りませんが、Kubernetes v1.22 では networking.k8s.io/v1beta1
の Ingress など様々なベータ API が削除されているため、アップデートの際はご注意ください。
過去の SIG-Network の変更内容
What's New (主な変更)
様々なベータ Kubernetes API の削除
いくつかの API は、GA (General Availability) になったことでベータ版の提供がされなくなります。この削除には次の API のベータバージョンが含まれています。ValidatingWebhookConfiguration
, MutatingWebhookConfiguration
, CustomResourceDefinition
, APIService
, TokenReview
, SubjectAccessReview
, CertificateSigningRequest
, Lease
, Ingress
, IngressClass
。完全なリストは Deprecated API Migration Guide とブログ記事 Kubernetes API and Feature Removals In 1.22: Here’s What You Need To Know を参照してください。
Ingress
, IngressClass
を含む、deprecated (非推奨) になっていたベータ版 API が、今回一気に廃止されています。Ingress
, IngressClass
のケースでは、networking.k8s.io/v1beta1
と extensions/v1beta1
の API が廃止され、Kubernetes v1.19 から導入された networking.k8s.io/v1
に移行する必要があります。
参考までに、以下は Ingress バージョンの歴史を簡単にまとめたものです。
リリース時期 | Kubernetes のサポート開始 | Ingress バージョン |
---|---|---|
2015年9月 | Kubetnetes v1.1.0 | experimental/v1alpha1 |
2016年3月 | Kubernetes v1.2.0 | extensions/v1beta1 |
2019年5月 | Kubernetes v1.14.0 | networking.k8s.io/v1beta1 |
2020年8月 | Kubernetes v1.19.0 | networking.k8s.io/v1 |
Ingress v1beta1
vs. v1
Ingress networking.k8s.io/v1beta1
と networking.k8s.io/v1
では、データの構造の一部も変わっているためご注意ください。主な違いは次の通りです。詳細は、公式ドキュメントの Deprecated API Migration Guide や、Kong のドキュメント Ingress v1 and v1beta1 Differences が参考になります。
-
spec.backend
がspec.defaultBackend
に変更 -
spec.rules.http.paths.backend
の変更-
serviceName
がservice.name
に変更 -
servicePort
が数値の場合service.port.number
に変更 -
servicePort
が文字列の場合service.port.name
に変更
-
-
spec.rules.http.paths.pathType
が必須になった-
Prefix
,Exact
,ImplementationSpecific
のいずれかを指定
-
以下は、一つの rule だけを持つ同一内容の Ingress を networking.k8s.io/v1beta1
と networking.k8s.io/v1
で表現した場合の差分です。
--- ingress-v1beta1.yaml 2021-08-24 11:57:02.000000000 +0900
+++ ingress-v1.yaml 2021-08-24 11:48:36.000000000 +0900
@@ -1,4 +1,4 @@
-apiVersion: networking.k8s.io/v1beta1
+apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myingress
@@ -9,5 +9,7 @@
- path: /hello
pathType: Prefix
backend:
- serviceName: myservice
- servicePort: 80
+ service:
+ name: myservice
+ port:
+ number: 80
networking.k8s.io/v1beta1 の例
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: myingress
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
serviceName: myservice
servicePort: 80
networking.k8s.io/v1 の例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myingress
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: myservice
port:
number: 80
マニフェストの API バージョンの変換 (kubectl-convert
)
マニフェストの場合、kubectl
の公式プラグインとして kubectl-convert
という、API バージョン間の変換プラグインが用意されているので、これを利用して変換することができます。公式ドキュメントにインストール手順 (Mac、Linux) が用意されています。
例えば、Ingress の場合は、以下のように --output-version
に networking.k8s.io/v1
を指定して変換します。
kubectl convert -f ingress-v1beta1.yaml --output-version networking.k8s.io/v1
client-go で API バージョンの変換はできない
client-go を使って Kubernetes API にアクセスするアプリケーションを開発している場合、後方互換性のために API バージョン間の変換をしたいことがあります。しかし、自分の知る限りはライブラリとしてサポートされない Kubernetes の内部パッケージ k8s.io/kubernetes/...
を利用しない限りは、API バージョン間の変換はできません。
自分が Prometheus の Ingress 用 Service Discovery で、v1beta1
, v1
両方の Ingress をサポートする PR (Kubernetes SD: Support networking.k8s.io/v1 Ingress #9205) を出したときは以下のように対応しました。
- サーバーの Kubernetes のバージョンを見てどちらの API を使うか判定
- Kubernetes v1.19 以上であれば
v1
Ingress を使用。それ以外はv1beta1
Ingress を使用
- Kubernetes v1.19 以上であれば
- 一部のフィールドしか見ていなかったため、
v1beta1
,v1
のアダプタを作成して型の差分を吸収
前述の kubectl-convert
も、元々 kubectl
のサブコマンドでしたが、kubectl
が Kubernetes の内部パッケージに依存しないように、プラグインとして分離されたようです (以下の kubectl convert: add deprecation warning for 1.13 #70820 のコメントを参照)。kubectl-convert
プラグイン自体は Kubernetes レポジトリの内部で管理されています。
// Convert must be removed from kubectl, since kubectl can not depend on
// Kubernetes "internal" dependencies. These "internal" dependencies can
// not be removed from convert. Another way to convert a resource is to
Kubernetes 1.21 と 1.22 の API 差分 (diff)
以下は、Kubernetes API (/api/
, /apis/
) から取得した、Kubernetes v1.21 と v1.22 の API リストの差分です。末尾に D
がつくものは deprecated であることを表します (Warning
ヘッダで判別可能)。Kubernetes 1.22 で多くの API が削除されたことが確認できます。
参考までに、今までの各 Kubernetes の API バージョン対応表についても以下の記事にまとめました。
API の確認に使ったスクリプトと API リスト元データは、こちらの gist に置きました。
--- k8s-1.21.list 2021-08-24 10:45:51.000000000 +0900
+++ k8s-1.22.list 2021-08-24 10:44:22.000000000 +0900
@@ -1,50 +1,36 @@
admissionregistration.k8s.io/v1/mutatingwebhookconfigurations
admissionregistration.k8s.io/v1/validatingwebhookconfigurations
-admissionregistration.k8s.io/v1beta1/mutatingwebhookconfigurations D
-admissionregistration.k8s.io/v1beta1/validatingwebhookconfigurations D
apiextensions.k8s.io/v1/customresourcedefinitions
-apiextensions.k8s.io/v1beta1/customresourcedefinitions D
apiregistration.k8s.io/v1/apiservices
-apiregistration.k8s.io/v1beta1/apiservices D
apps/v1/controllerrevisions
apps/v1/daemonsets
apps/v1/deployments
apps/v1/replicasets
apps/v1/statefulsets
authentication.k8s.io/v1/tokenreviews
-authentication.k8s.io/v1beta1/tokenreviews
authorization.k8s.io/v1/localsubjectaccessreviews
authorization.k8s.io/v1/selfsubjectaccessreviews
authorization.k8s.io/v1/selfsubjectrulesreviews
authorization.k8s.io/v1/subjectaccessreviews
-authorization.k8s.io/v1beta1/localsubjectaccessreviews
-authorization.k8s.io/v1beta1/selfsubjectaccessreviews
-authorization.k8s.io/v1beta1/selfsubjectrulesreviews
-authorization.k8s.io/v1beta1/subjectaccessreviews
autoscaling/v1/horizontalpodautoscalers
-autoscaling/v2beta1/horizontalpodautoscalers
+autoscaling/v2beta1/horizontalpodautoscalers D
autoscaling/v2beta2/horizontalpodautoscalers
batch/v1/cronjobs
batch/v1/jobs
batch/v1beta1/cronjobs D
certificates.k8s.io/v1/certificatesigningrequests
-certificates.k8s.io/v1beta1/certificatesigningrequests D
coordination.k8s.io/v1/leases
-coordination.k8s.io/v1beta1/leases D
discovery.k8s.io/v1/endpointslices
discovery.k8s.io/v1beta1/endpointslices D
events.k8s.io/v1/events
-events.k8s.io/v1beta1/events
-extensions/v1beta1/ingresses D
+events.k8s.io/v1beta1/events D
flowcontrol.apiserver.k8s.io/v1beta1/flowschemas
flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurations
networking.k8s.io/v1/ingressclasses
networking.k8s.io/v1/ingresses
networking.k8s.io/v1/networkpolicies
-networking.k8s.io/v1beta1/ingressclasses D
-networking.k8s.io/v1beta1/ingresses D
node.k8s.io/v1/runtimeclasses
-node.k8s.io/v1beta1/runtimeclasses
+node.k8s.io/v1beta1/runtimeclasses D
policy/v1/poddisruptionbudgets
policy/v1beta1/poddisruptionbudgets D
policy/v1beta1/podsecuritypolicies D
@@ -52,21 +38,12 @@
rbac.authorization.k8s.io/v1/clusterroles
rbac.authorization.k8s.io/v1/rolebindings
rbac.authorization.k8s.io/v1/roles
-rbac.authorization.k8s.io/v1beta1/clusterrolebindings D
-rbac.authorization.k8s.io/v1beta1/clusterroles D
-rbac.authorization.k8s.io/v1beta1/rolebindings D
-rbac.authorization.k8s.io/v1beta1/roles D
scheduling.k8s.io/v1/priorityclasses
-scheduling.k8s.io/v1beta1/priorityclasses D
storage.k8s.io/v1/csidrivers
storage.k8s.io/v1/csinodes
storage.k8s.io/v1/storageclasses
storage.k8s.io/v1/volumeattachments
-storage.k8s.io/v1beta1/csidrivers D
-storage.k8s.io/v1beta1/csinodes D
storage.k8s.io/v1beta1/csistoragecapacities
-storage.k8s.io/v1beta1/storageclasses D
-storage.k8s.io/v1beta1/volumeattachments D
v1/bindings
v1/componentstatuses D
v1/configmaps
Deprecation (非推奨)
- Service の
topologyKeys
フィールド (alpha) のサポートと、そのkube-proxy
の実装が削除されました。このフィールドは数サイクル前から deprecated となっていました。この機能は、Endpoint ごとの自動のトポロジーヒントと、Service のinternalTrafficPolicy
フィールド(alpha) の組み合わせで置き換えられます。(#102412, @andrewsykim) - ( Ingress e2e で) Ingress
v1beta1
が廃止されました (#102030, @aojea)
API Change (API の変更)
-
service.kubernetes.io/topology-aware-hints
アノテーションで、Auto
が有効な値となりました。(#100728, @robscott)-
もともと
auto
だったのが、Kubernetes でのネーミングルールに合わせて、Auto
が有効になったようです。(auto
も有効)
-
もともと
-
EndpointSlices Mirroring controller
はkubectl
によって作られるlast-applied-configuration
アノテーションをEndpointSlices
更新時にミラーしなくなりました。(#102731, @sharmarajdaksh) -
NetworkPolicyEndPort
がベータに昇格し、デフォルトで有効になりました。(#102834, @rikatz)-
NetworkPolicy の
endPort
フィールドは、port
フィールドと合わせて、ポートの範囲を表現できるものです。詳細は KEP-2079: Network Policy to support Port Ranges をご覧ください。
-
NetworkPolicy の
Feature (機能追加)
- Kubelet のユーザ空間での実行をサポートする、フィーチャーゲート
KubeletInUserNamespace
が追加されました。- ユーザ空間は kubelet の実行前に作成される必要があります。CRI などの全てのノードコンポーネントは、ユーザ空間で実行される必要があります。このフィーチャーゲートが有効なとき、kubelet は次の sysctl の値の設定時のエラーは無視します。
vm.overcommit_memory
,vm.panic_on_oom
,kernel.panic
,kernel.panic_on_oops
,kernel.keys.root_maxkeys
,kernel.keys.root_maxbytes
. (これらはコンテナではなく、ホスト向けの systectl の値です)。また kubelet は/dev/kmsg
オープン時のエラーも無視します。また、このフィーチャーゲートによって、kube-proxy がRLIMIT_NOFILE
設定時のエラーを無視するようになります。 - このフィーチャーゲートは、
kind
またはminikube
を使って、Rootless Docker/Podman 内で Kubernetes を実行するようなときに便利です。 (#92863, @AkihiroSuda) [SIG Network, Node and Testing]
- ユーザ空間は kubelet の実行前に作成される必要があります。CRI などの全てのノードコンポーネントは、ユーザ空間で実行される必要があります。このフィーチャーゲートが有効なとき、kubelet は次の sysctl の値の設定時のエラーは無視します。
- Endpoints が 1,000 以上のエンドポイントを持つ場合、切り詰めが行われるようになり、Endpoints リソースの
endpoints.kubernetes.io/over-capacity
アノテーションにtruncated
とセットされるようになりました。 (#103520, @swetharepakula) [SIG Apps and Network] - kube-proxy でログレベルを動的に設定するための、
/debug/flags/v
が公開されるようになりました。(#98306, @borgerli) [SIG Network]- 動的なログレベル変更は、以前から他のコンポーネント (kube-apiserver, kubelet, kube-scheduler) ではサポートされています。(Support dynamiclly set glog.logging.verbosity #63777)
- フィーチャーゲート
EndpointSliceProxying
とWindowsEndpointSliceProxying
は GA に昇格し、無条件で有効になりました。kube-proxy は、endpoint の情報として EndpointSlices を使うようになります。(#103451, @swetharepakula) - kube-proxy が V1 の
EndpointSlices
を使うようになりました。 (#103306, @swetharepakula)-
今までは
v1beta1
の EndpointSlice を参照していました。
-
今までは
-
net.ipv4.ip_unprivileged_port_start
を安全なsysctl
として扱うようになりました。(#103326, @pacoxu)- 安全な sysctl はホワイトリストとして管理されています。
- NetworkPolicy のバリデーションフレームワークが Windows をサポートしました。(#98077, @jayunit100)
- 新しいフィーチャーゲート
ExpandedDNSConfig
が利用できるようになりました。このフィーチャーによって、Kubernetes で拡張された DNS の設定を持つことができるようになります。(#100651, @gjkim42)-
DNS のサーチパスの最大(
MaxDNSSearchPaths
)が 6 から 32, サーチパスの文字列長の最大(MaxDNSSearchListChars
)が 256 から 2048 へと拡張されます。詳細は KEP-2595: Expanded DNS Configurationをご覧ください。
-
DNS のサーチパスの最大(
-
EndpointSliceTerminatingCondition
が Beta へと昇格しました。これにより、EndpointSlice のtermination
,serving
状態がデフォルトで有効になります。(#103596, @andrewsykim) -
EndpointSlice
が有効な kube-proxy で iptables または ipvs モードを私用している場合、externalTrafficPolicy: Local
を持った Service が、グレースフルターミネーションをサポートするようになりました。具体的には、ある Service の "Ready" なエンドポイントが存在しない状態でノードが Service への接続を受け、少なくとも1つの Terminating な Pod がノード上に存在するときは、kube-proxy はトラフィックをドロップせずに、Terminating な Pod へ送るようになります。これは、Pod が kill され、外部ロードバランサがそれを検知した場合の、レースコンディションが修正されます。(#97238, @andrewsykim) -
IngressClassNamespacedParams
フィーチャーゲートがベータに昇格し、デフォルトで有効になりました。これにより、IngressClass
は新たに 2 つのフィールドspec.paramters.namespace
とspec.parameters.scope
を持つようになります。(#101711, @hbagdi) -
ServiceInternalTrafficPolicy
機能がベータに昇格し、デフォルトで有効になりました。これにより、Service のinternalTrafficPolicy
フィールドがデフォルトで有効になります。(#103462, @andrewsykim) -
ServiceLBNodePortControl
がベータに昇格し、デフォルトで有効になりました。(#100412, @hanlins) -
SetHostnameAsFQDN
が GA に昇格し、無条件で有効になります。(#101294, @javidiaz)
Bug or Regression (バグまたはリグレッション)
- デフォルトの
view
とedit
の RBAC ロールに、EndpointSlice
のための権限が追加されました。(#101203, @mtougeron) - Endpoint が zone を持たないときに、
EndpointSlice
の describe がパニックになる問題が修正されました。(#101025, @tnqn) -
endpointslicemirroring
コントローラーで、endpoint のNotReadyAddresses
が対応するEndpointSlice
に Ready としてミラーされるバグが修正されました。(#102683, @aojea) - winkernel の kube-proxy で、ホストとネットワークがデュアルスタックをサポートしている場合のみに、デュアルスタックを使うよう修正されました。@jsturtevant) [SIG Network and Windows]
-
kube-proxy
のレイテンシメトリクスが、実行開始後に作られたEndpoints
のレイテンシしか計算していないバグが修正されました。いつ作成されたかに関わらず、すべてのEndpoints
オブジェクトは再起動時に処理される必要があります。(#100861, @aojea) -
kube-proxy
のモードが userpace のとき、EndpointSlices
は有効とならないようになりました (#100913, @JornShen)-
userspace モードでは
EndpointSlices
の実装がされていないためのようです。
-
userspace モードでは
-
EndpointSlice
の IP のバリデーションは、Endpoints
のものと一致するようになりました。(#101084, @robscott) - "kube-proxy" のログ "Skipping topology aware endpoint filtering since no hints were provided for zone" の warning が正しい条件で出されるようになりました。(#101857, @dervoeti)
-
system:aggregate-to-edit
ロールは、Endtpoints API への書き込み権限を持たないようになりました。Kubernetes 1.22 で新規にクラスタを作ったときは、edit
とadmin
ロールは、この権限を持たなくなります。既存のクラスタを Kubernetes v1.22 にアップグレードした場合は影響がありません。新規に作成した 1.22 のクラスタで、集約されたedit
とadmin
ロールの Endtpoints に対する書き込み権限を保ちたい場合は、https://github.com/kubernetes/website/pull/29025 を参照してください。(#103704, @robscott) [SIG Auth and Network] - コンフォーマンステストで
-
IPFamilyPolicy
がPreferDualstack
に設定された Service の現在の挙動について。クラスタがデュアルスタックにアップグレードされたときの現在の振る舞いは- IPFamilyPolicy = PreferDualstack に設定された Service は、Service オブジェクトが更新されるとアップグレードされます。例: 利用者がラベルを変更したとき
- この振る舞いが次のように変更されます。
- IPFamilyPolicy = PreferDualstack に設定された Service は、Service オブジェクトが更新されてもアップグレードされません。利用者が policy, type などを変更しても、既存の振る舞いは維持されます。(#102898, @khenidak) [SIG Network and Testing]
- Service の更新でデュアルスタックに自動的にアップグレードされてしまうと、割り当てられた IP アドレスが変わってしまうため問題があったようです。参考: Dual-stack updates w/ PreferDualStack changes IP assignments #101681
-
kube-proxy
のベースイメージdebian-iptables
が https://github.com/kubernetes/release/pull/2106 を取り入れるため v1.6.2 にアップデートしました。-
debian-iptables
: iptables-wrappers に合わせて、nft の行が legacy の行より多い場合に、nft モードを選択するようになりました。(#102590, @BenTheElder) - iptables の nft, legacy については iptables: The two variants and their relationship with nftables が参考になります。
-
その他 (Cleanup or Flake)
- e2e スイートで "SCTP" と書かれているにも関わらず、実際には SCTP を実装していないネットワークプラグインの振る舞いのテストしている記述を明確にしました。(#102509, @danwinship)
- フィーチャーゲート
ServiceLoadBalancerClass
はベータへと昇格し、デフォルトで有効になりました。(#103129, @XudongLiuHarold) -
proxy/ipvs/proxier.go
のログを構造化ログへと移行しました。(#97796, @JornShen) - CNI プラグインを v0.9.1 にアップデートしました。(#102328, @lentzi90)
- Calico を v3.19.1 にアップデートしました。(#102386, @JornShen)
今後のトピックの紹介
SIG-Network で取り組まれているトピックで、個人的に気になったものを紹介します。動きが活発なため、記載した状況については参考までにしていただければと思います。なお、Kubernetes の次期バージョン v1.23 での状況は、Kubernetes 1.23 Enhancements Tracking でトラッキングされる予定です。
- IPv4/IPv6 デュアルスタックの GA
- v1.23 で stable に昇格予定: KEP-563 - Moving IPv4/IPv6 dual-stack networking to stable in 1.23 #2860
- Issue: Add IPv4/IPv6 dual-stack support #563
- gRPC probe の追加
- Pod の Liveness/Readiness/Startup probe で gRPC のヘルスチェック をサポートする動き
- Issue: Add gRPC probe to Pod.Spec.Container.{Liveness,Readiness,Startup}Probe #2727
- KEP: Add support for gRPC probes to kubelet (KEP-2727) #2728
- クラスタスコープの NetworkPolicy (
ClusterNetworkPolicy
) の追加 -
Gateway API の公式 API への移行
- Gateway API は過去に "Service API" と呼ばれていたものがリネームされたもの
- 現在、experimental API (
x-k8s.io
) である Gateway API を、公式のk8s.io
に移行させる動き - KEP レビュー中: KEP-2829: Formalize Gateway API transition to k8s.io group #2830
- Issue: Migrate Gateway API to k8s.io Group #2829
- Gateway API Meeting Notes
-
CNI トラフィック制御のサポート
- Kubernetes v1.9 からアルファで存在する機能
- KEP レビュー中: KEP-2819: CNI traffic shaping support #2808 (元々あったものを復活させている)
- Issue: CNI traffic shaping support #2819
参考