LoginSignup
11
3

More than 1 year has passed since last update.

Kubernetes 1.22: SIG-Network の変更内容

Last updated at Posted at 2021-08-24

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 を参照してください。

:pencil: Ingress, IngressClass を含む、deprecated (非推奨) になっていたベータ版 API が、今回一気に廃止されています。Ingress, IngressClass のケースでは、networking.k8s.io/v1beta1extensions/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

:pencil: Ingress v1beta1 vs. v1

Ingress networking.k8s.io/v1beta1networking.k8s.io/v1 では、データの構造の一部も変わっているためご注意ください。主な違いは次の通りです。詳細は、公式ドキュメントの Deprecated API Migration Guide や、Kong のドキュメント Ingress v1 and v1beta1 Differences が参考になります。

  • spec.backendspec.defaultBackend に変更
  • spec.rules.http.paths.backend の変更
    • serviceNameservice.name に変更
    • servicePort が数値の場合 service.port.number に変更
    • servicePort が文字列の場合 service.port.name に変更
  • spec.rules.http.paths.pathType が必須になった
    • Prefix, Exact, ImplementationSpecific のいずれかを指定

以下は、一つの rule だけを持つ同一内容の Ingress を networking.k8s.io/v1beta1networking.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

:pencil: マニフェストの API バージョンの変換 (kubectl-convert)

マニフェストの場合、kubectl の公式プラグインとして kubectl-convert という、API バージョン間の変換プラグインが用意されているので、これを利用して変換することができます。公式ドキュメントにインストール手順 (MacLinux) が用意されています。

例えば、Ingress の場合は、以下のように --output-versionnetworking.k8s.io/v1 を指定して変換します。

kubectl convert -f ingress-v1beta1.yaml --output-version networking.k8s.io/v1

:pencil: 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 を使用
  • 一部のフィールドしか見ていなかったため、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

:pencil: 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)
  • (:pencil: Ingress e2e で) Ingress v1beta1 が廃止されました (#102030, @aojea)

API Change (API の変更)

  • service.kubernetes.io/topology-aware-hints アノテーションで、Auto が有効な値となりました。(#100728, @robscott)
    • :pencil: もともと auto だったのが、Kubernetes でのネーミングルールに合わせて、Auto が有効になったようです。(auto も有効)
  • EndpointSlices Mirroring controllerkubectl によって作られる last-applied-configuration アノテーションを EndpointSlices 更新時にミラーしなくなりました。(#102731, @sharmarajdaksh)
  • NetworkPolicyEndPort がベータに昇格し、デフォルトで有効になりました。(#102834, @rikatz)

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]
  • 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]
  • フィーチャーゲート EndpointSliceProxyingWindowsEndpointSliceProxying は GA に昇格し、無条件で有効になりました。kube-proxy は、endpoint の情報として EndpointSlices を使うようになります。(#103451, @swetharepakula)
  • kube-proxy が V1 の EndpointSlicesを使うようになりました。 (#103306, @swetharepakula)
    • :pencil: 今までは v1beta1 の EndpointSlice を参照していました。
  • net.ipv4.ip_unprivileged_port_start を安全な sysctl として扱うようになりました。(#103326, @pacoxu)
  • NetworkPolicy のバリデーションフレームワークが Windows をサポートしました。(#98077, @jayunit100)
  • 新しいフィーチャーゲート ExpandedDNSConfig が利用できるようになりました。このフィーチャーによって、Kubernetes で拡張された DNS の設定を持つことができるようになります。(#100651, @gjkim42)
    • :pencil: DNS のサーチパスの最大(MaxDNSSearchPaths)が 6 から 32, サーチパスの文字列長の最大(MaxDNSSearchListChars)が 256 から 2048 へと拡張されます。詳細は KEP-2595: Expanded DNS Configurationをご覧ください。
  • 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.namespacespec.parameters.scope を持つようになります。(#101711, @hbagdi)
  • ServiceInternalTrafficPolicy 機能がベータに昇格し、デフォルトで有効になりました。これにより、Service の internalTrafficPolicy フィールドがデフォルトで有効になります。(#103462, @andrewsykim)
  • ServiceLBNodePortControl がベータに昇格し、デフォルトで有効になりました。(#100412, @hanlins)
  • SetHostnameAsFQDN が GA に昇格し、無条件で有効になります。(#101294, @javidiaz)

Bug or Regression (バグまたはリグレッション)

  • デフォルトの viewedit の 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)
    • :pencil: userspace モードでは EndpointSlices の実装がされていないためのようです。
  • 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 で新規にクラスタを作ったときは、editadmin ロールは、この権限を持たなくなります。既存のクラスタを Kubernetes v1.22 にアップグレードした場合は影響がありません。新規に作成した 1.22 のクラスタで、集約された editadmin ロールの Endtpoints に対する書き込み権限を保ちたい場合は、https://github.com/kubernetes/website/pull/29025 を参照してください。(#103704, @robscott) [SIG Auth and Network]
  • コンフォーマンステストで
    • Services should serve multiport endpoints from pods
    • Services should serve a basic endpoint from pods
    • 上記は API オブジェクトの検証をするだけで、実際の Service の実装上での検証は実施していませんでした。これらのテストは、テスト対象の Service が endpoints へ転送されたトラフィックを転送できるか検証するようになりました。(#101709, @aojea) [SIG Network and Testing]
  • IPFamilyPolicyPreferDualstack に設定された Service の現在の挙動について。クラスタがデュアルスタックにアップグレードされたときの現在の振る舞いは
    • IPFamilyPolicy = PreferDualstack に設定された Service は、Service オブジェクトが更新されるとアップグレードされます。例: 利用者がラベルを変更したとき
    • この振る舞いが次のように変更されます。
    • IPFamilyPolicy = PreferDualstack に設定された Service は、Service オブジェクトが更新されてもアップグレードされません。利用者が policy, type などを変更しても、既存の振る舞いは維持されます。(#102898, @khenidak) [SIG Network and Testing]
    • :pencil: Service の更新でデュアルスタックに自動的にアップグレードされてしまうと、割り当てられた IP アドレスが変わってしまうため問題があったようです。参考: Dual-stack updates w/ PreferDualStack changes IP assignments #101681
  • kube-proxy のベースイメージ debian-iptableshttps://github.com/kubernetes/release/pull/2106 を取り入れるため v1.6.2 にアップデートしました。

その他 (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)

:pencil: 今後のトピックの紹介

SIG-Network で取り組まれているトピックで、個人的に気になったものを紹介します。動きが活発なため、記載した状況については参考までにしていただければと思います。なお、Kubernetes の次期バージョン v1.23 での状況は、Kubernetes 1.23 Enhancements Tracking でトラッキングされる予定です。

参考

11
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3