LoginSignup
6

More than 1 year has passed since last update.

posted at

updated at

Organization

Kubernetes 1.20: SIG-API Machineryの変更内容

はじめに

Kubernetes 1.20がリリースされました :tada:

今回のリリースでは数年前のKubeConで発表のあったリクエストの処理に優先度をつけるAPI priority/Fairness(KEP-1040)がbetaになったり、api-serverに識別子を付与するkube-apiserver identity(KEP-1965)の変更が入っているためか、api-server周りの変更が多い印象です。アップグレード前の注意点もいくつかあるので要チェックです。あと個人的にはHPAがPodではなくContainerごとに設定できるようになったのは嬉しい変更です。

それでは、今回もAPI周りを担当するSIG-API Machineryの変更点をCHANGELOGからピックアップします。(:pencil: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です)

:warning: Urgent Upgrade Notes (アップグレード前の注意点)

  • API priority/Fairness(APF)はbetaに昇格しました。APFを有効にしたv1.19のAPIサーバはv1.20+のサーバと共に動かさないでください。 (#96527)
  • v1.10で非推奨となったAPIサーバでinsecureポートを公開する機能が削除されました。insecureアドレスの--addressフラグと、--insecure-bind-addressもAPIサーバでは利用できなくなります。フラグ自体の削除はv1.24予定です。また、--port--insecure-portフラグは0のみ設定可能で、こちらもv1.24で削除されます。(#95856)
  • dual-stack Service(アルファ)が追加されました。alpha APIへの破壊的な変更となります。この変更では、dual-stack APIのwrt Serivceにおいて、1フィールドのみのipFamilyから、以下のの3フィールドになりました。 デフォルト値をハンドリングするため多くのユーザはこれに伴う変更は必要ありません。ユーザがdual-stackを要求しない限り、Serviceはsingle-stackです。また、これらの機能はfeature gateのIPv6DualStackから切り替えられます。 (#91824)
    • ipFamilyPolicy(SingleStack, PreferDualStack, RequireDualStack)
    • ipFamilies(アサインするfamilyのリスト)
    • clusterIPs
  • TokenRequestとTokenRequestProjectionがGAになりました。この機能では、Podのライフタイムに沿ったSecretから参照できないservice account tokenを生成できます。詳細は、こちらを参照してください。また、TokenRequestとTokenRequestProjectionのfeature gatesはv1.21に削除されます。この変更に伴い、APIサーバの以下のフラグが必須値となります。(#95896)

    • --service-account-issuer: クラスタのライフタイムに渡ってService Account Tokenの発行者を識別するための識別子。
    • --service-account-key-file: 1つ以上の公開鍵を含んだファイルを設定します。
    • --service-account-signing-key-file: Service Account Tokenの署名に利用する、秘密鍵を含んだファイルを設定します。kube-controller-managerの--service-account-private-key-fileと同じファイルを設定できます。
  • GCコントローラが不正なownerReferenceを受け取ったときの非決定論的な挙動を解決しました。今後はchildとownerオブジェクトのnamespaceが一致しない場合、OwnerRefInvalidNamespaceをreasonに持つEventへ記録します。kubectl-check-ownerrefefrencesツールを利用すると、アップグレード前にも不正なownerReferenceが存在しないかチェックできます。(#92743)

    • 名前空間スコープのオブジェクトのownerReferenceが、同じ名前空間に存在しない場合オブジェクトのuidを参照していた場合、ownerが存在しないものとしてそのchildオブジェクトは削除されます。
    • クラスタスコープのオブジェクトのownerRefefrenceが、名前空間スコープのオブジェクトuidを参照していた場合、ownerが解決できないとしてそのchildオブジェクトはGCによって無視されます。
$ git clone https://github.com/kubernetes-sigs/kubectl-check-ownerreferences.git && \
  cd kubectl-check-ownerreferences && \
  make install
Cloning into 'kubectl-check-ownerreferences'...
...

$ kubectl-check-ownerreferences
No invalid ownerReferences found

# ~~適当にinvalidなownerreferenceを持ったobject作成~~

$ kubectl-check-ownerreferences
GROUP   RESOURCE   NAMESPACE   NAME                    OWNER_UID                              LEVEL   MESSAGE
        pods       default     hello-7d8df5b78-d64d6   a27035d1-7e84-41ef-92fd-5cbac4fafc0c   Error   no object found for uid
1 error, 0 warnings

:wastebasket: Deprecation (非推奨になったAPI)

  • EgressSelectorConfiguration APIのEgressSelectionタイプとして、controlplaneがサポートされました。Masterは非推奨となり、v1.22で削除される予定です。 (#95235)
  • v1alpha1 PodPreset APIとそのadmissionプラグインは削除されました。Pod作成時にPodの設定を書き換えたい場合は、Admission webhookを使ってください。 (#94090)

:earth_asia: API Changes (API周りの変更)

  • Serviceのタイプが既存のフィールドを必要としないものに変更されたとき、自動的にクリアされるようになりました。例えば、type=LoadBalancerからtype=ClusterIPに変更した場合、NodePortのアサインがクリアされます。これにより、ユーザは不要な値のクリーンアップに注意する必要がなくなります。 (#95196)
    • :pencil: Serviceのtypeを変えることは頻繁にないと思いますが、稀だからこそ気にすることが少なくなるのは嬉しい変更。
  • EndpointSliceにNodeNameフィールドが追加されました。この機能は、feature gateのEndpointSliceNodeNameから有効にできます。 (#96528)
    • 将来のリリースにおいてEndpointSlice topologyフィールドが非推奨となります。
    • EndpointSliceの"IP" addressタイプは、v1.17の非推奨を経て正式に削除されます。
    • discovery.k8s.io/v1alpha1APIは非推奨となりました。v1.21で削除されます。
  • BoundServiceAccountTokenVolumeを有効にした場合、クラスタ管理者はserviceaccount_stale_tokens_totalメトリクスから長期間のトークンに依存しているワークロード数をモニタリングできます。もしそのようなワークロードが存在しない場合、APIサーバに--service-account-extend-token-expiration=falseフラグを設定することで、長期間のトークンを無効化できます。(#96273)
    • :pencil: v1.13からalphaで入っている機能。最近はDay2意識してか運用に便利なメトリクスも追加されたり、新機能とセットで入ったりして便利ですね。
  • HPAが、コンテナのリソース使用量に基づいてスケールできるようになりました。(#90691)
    • :pencil: 前回のKubeCon Europeで発表のあった機能で、v1.19でギリギリ入らずv1.20でのリリースとなりました。 いままではPod単位のリソース消費量しか指定できなかったため、コンテナごとにリソースの消費傾向が違うとうまくスケールできないという問題点がありましたが、これが解決した形です。
  • kube-apiserverは、kube-apiserverの期限切れLeaseオブジェクトを削除するようになりました。この機能はfeature gateのAPIServerIdentityから有効にできます。これに伴い、kube-apiserverにidentity-lease-garbage-collection-check-period-secondsフラグが追加されました。 (#95895)
    • :pencil: 今回のchangelogにはこれ関係の変更が多いapiserver identity。現在は生存apiserverのリストをkubernetes endpointsのIPで識別していますが、これが有効になるとLearseオブジェクトで識別子が管理されるようになります。
  • kube-controller-manager: volume pluginで、localとloopbackアドレスからのアクセスを制限できるようになりました。この設定は--volume-host-allow-local-loopback=falseフラグを設定するか、--volume-host-cidr-denylistフラグで拒否するCIDRの範囲を指定することで有効にできます。(例: --volume-host-cidr-denylist=127.0.0.1/28,feed::/16) (#91785)
  • scheduler, controller-manager, cloud-controller-managerがLeaseLockを使うように修正しました。 (#94603)
    • :pencil: これらコントローラは今まで、endpointsleasesをresource lockに利用していました。
  • DNS-1123エラーメッセージにおいて、RFC 1123準拠ではないことを明示するようになりました。(#94182)
    • :pencil: この変更では、小文字のみを許可している旨をエラーメッセージに追加しています。
  • 注意: "failure-domain.beta.kubernetes.io/zone"と"failure-domain.beta.kubernetes.io/region"ラベルは非推奨になりました。代わりに"topology.kubernetes.io/zone"と"topology.kubernetes.io/region"を利用してください。プレフィックスのfailure-domain.betatopologyに変更すれば大丈夫です。(#96033)
  • Server Side ApplyがLabelSelectorフィールドをアトミックとして処理するようになりました。つまり、Selector全体は単一のwriterもしくはupdaterによって管理されることになります。(#93901)
  • 一つのLoadBalancer Serviceに対して、複数のprotocol値を設定できるようになります。この機能はデフォルト無効で、feature gateのMixedProtocolLBServiceから切り替えられます。 (#93130)
  • CSIDriverSpecに2つのフィールドを追加するため、feature gateにCSIServiceAccountTokenをが加わりました。(#93130)
  • ユーザはfeature gateを設定することで、cronjob controller v2を利用できます。このコントローラは、将来的なリリースでデフォルトのコントローラになります。(#93370)
    • :pencil: cronjobのGAに向けてコントローラv2がきましたね。全貌はKEP-19参照

:sparkle: Features (機能追加)

  • APIサーバが書き込みリクエストを処理する前に、storageversionsを更新するStorageVersionAPIがfeature gateに追加されました。この機能では、storage migratorによるビルドインリソースのバージョン移行が可能になります。この機能を利用するためには、internal.apiserver.k8s.io/v1alpha1 APIの有効かと、APIServerIdentityのfeature gateの有効化も必要です。 (#93873)
  • CRD: structural schemasにおいて、nullableになっていないmapフィールドがドロップされるようになりました。デフォルト値が設定されている場合はその値が設定されます。同じく、nullableではないリスト内にnullアイテムが存在している場合は、バリデーションに失敗します。(#95423)
    • :pencil: structural schemasの変更も着々と進んでいます。まだschemaを生成できてない(or違反している)プロジェクトがあれば修正を勧めたほうが良さそうです。
  • client-goのcredentialプラグインでは、現在のクラスタ情報をKUBERNETES_EXEC_INFO環境変数経由で渡せるようになりました。(#95489)
  • api-extensionsカテゴリが導入されました。このカテゴリでは、kubectl getなどでmutating admission configやvalidation admission config, CRDやAPIServiceを取得できます。 (#95603)
    • :pencil: こんなかんじ
$ kubectl get api-extensions
NAME                                                                     SERVICE   AVAILABLE   AGE
apiservice.apiregistration.k8s.io/v1.                                    Local     True        3m1s
apiservice.apiregistration.k8s.io/v1.admissionregistration.k8s.io        Local     True        3m1s
apiservice.apiregistration.k8s.io/v1.apiextensions.k8s.io                Local     True        3m1s
...
  • kube-apiserverが自身を識別するためにLease objectを維持するようになりました。この機能はfeature gateのAPIServerIdentityから切り替えられます。これに伴い、identity-lease-duration-secondsとidentity-lease-renew-interval-secondsの2つのフラグがkube-apiserverに追加されました。(#95533)
  • kube-apiserver: etcdのhealth checkのタイムアウト値を変更できるようになりました。今までと同じ動きとなるように、デフォルト値は2秒になっています。(#93244)
  • kube-apiserver: ローテートしたauditログファイルを圧縮するために、--audit-log-compressフラグが追加されました。(#94066)
    • :pencil: 有効にした場合gzipで圧縮されます。
  • 現在ベータのRootCAConfigMap feature gateがデフォルトで有効になりました。これにより、kube-controller-managerが"kube-root-ca.crt`を各namespaceのConfigMapとして公開するようになります。このConfigMapには、kube-apiserverとの接続を検証するためのCA bundleが含まれています。 (#96197)

:bug: Bug or Regression (バグやリグレッションの修正)

  • PVC StorageClassがツリー外のプロビジョナーによって既に更新されていた場合、ボリュームの拡張コントローラがPVCへのvolume.kubernetes.io/storage-resizerアノテーション付与を妨げる問題が解決しました。(#94489)
  • タイムアウトパラメータの処理は、既存クライアントの下位互換性を損なうため、1.20.0-beta.2でrevertされました。(#96727)
  • eventsのwatch cacheが無効化されました。(#96052)
    • :pencil: eventに対してwatchのcacheが有効になっていると性能に影響がでるため無効化されました
  • Dual-stack: dual-stackのfeature gateがデフォルト有効になった時に、nodeipamが既存のsingle-stackクラスタで互換性を持つように修正されました。 (#90439)
  • create/update/patchリクエストのowner referenceエントリに重複があった場合、APIレスポンスのヘッダに警告を載せるようになりました。クライアントは、このような重複したowner referenceを持つリクエストの送信をやめなければなりません。このようなリクエストは、早ければv1.24でリジェクトされます。(#96185)
  • SubjectAccessReviewクライアントのDelegatingAuthorizationOptionsにデフォルトタイムアウトが設定されるようになりました。(#95725)
  • JSON pathパーサがrangeがからの時にエラーになるバグが修正されました。(#95933)
  • client-goのprometheus metricsが正しくAPI pathを公開できるように修正されました。(#74363)
  • kube-apiserverによってレポートされるetcd_object_countsメトリクスが修正されました。(#94773)
  • CRDオブジェクトに関するkube-apiserverメトリクスで、verbsが間違って報告されていた問題を修正しました。(#93523)
  • k8s.io/apimachinery/pkg/api/meta.SetStatusCondition更新時にObservedGenerationを更新するように修正されました。(#95961)
  • CRDでarray typeにx-kubernetes-preserve-unknown-fieldsが付与されているschemaがSchemaErrorになる問題が修正されました。(#94888)
  • 時間が前後する場合、kube-apiserverがメモリリークする問題が修正されました。(#96266)
  • client-goにおいて、カスタマイズされたDial, Proxy, GetCert configを持つ新しいクライアントが、古いHTTP transportsを取得する可能性がある問題が修正されました。(#95427)
  • 1.17.0-1.18.5のAPIサーバが"Too large resource version"エラーから復帰しないreflectorのバグが修正されました。(#94316)
  • ポートを指定しなくてもipv6のPodにプロキシされる問題を修正しました。(#94834)
  • クラスタスコープのsubresource用のfake clientを生成するときのバグが修正されました。(#946586)
  • HTTP/2のconnection health checkは全Kubernetes clientにおいてデフォルトで有効になっています。必要に応じてHTTP2_READ_IDLE_TIMEOUT_SECONDSおよび、HTTP2_PING_TIMEOUT_SECONDS環境変数から設定を変更してください。HTTP2_READ_IDLE_TIMEOUT_SECONDSが0に設定されている場合、この機能は無効になります。(#95981)
  • ユーザが不正なタイムアウトをリクエストURLで指定した場合、そのリクエストはHTTP 400として中止されます。
    • ユーザが指定したタイムアウトがapiserverが許可する最大値を超える場合、このリクエストもHTTP 400になります。(#96061)
  • K8s.io/apimachinery: runtime.DefaultUnstructuredConverter.FromUnstructuredは、integerフィールドから型付きfloat値への変換を処理するようになりました。(#93250)
  • kube-apiserverはGA時に削除されるはずだったnon-alphaレベルのAPIを停止します。alphaレベルのAPIは、CIが壊れないよう提供を続けます。(#96525)
  • デフォルトのetcdサーババージョンが3.4.13に更新されました。(#94287)

:microscope: Other (その他の修正)

  • Namespace APIオブジェクトの作成のため送信されていたAdmissionReviewオブジェクトは、常にnamespace属性へ挿入されるようになりました。(以前は、Namespace作成のPOSTリクエストにおいて、namespace属性は空になっていました。また、server-side-applyのPATCHリクエストによってNamespace生成時に挿入されていました。) (#95012)
  • debian-iptables:buster-v1.3.0に更新しました。(#94733)
    • iptableは1.8.5を利用します
    • ベースイメージはdebian-base:buster-v1.2.0に更新しました
    • cluster/images/etcd: etcd:3.4.13-1のイメージをビルドします
      • 利用するイメージはdebian-base:buster-v1.2.0です。
  • client-goヘッダのログに(ログレベル9以上)マスクされたAuthorizationヘッダがのるようになりました。(#95316)
  • kube-apiserverにおいて、(1.16で非推奨になった)SelfLinkの伝搬を停止しました。(#94397)
  • etcdのクライアントをv3.4.13に更新しました。(#94259)
  • kubectl get ingressのデフォルトではnetworking.k8s.io/v1が返るようになりました。(以前返っていたのはv1.14で非推奨になったextensions/v1beta1です)非推奨になったリソースを取得するには、kubectl get ingress.v1beta1.extensionsのように明示的なバージョン指定が必要です。

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
What you can do with signing up
6