Help us understand the problem. What is going on with this article?

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

はじめに

ついにKubernetes v1.18がリリースされました :tada:

今回のSIG-API Machinery12には大きな新機能の追加はありませんが、このタイミングでIngressリソースに変更が入ったり、client-goにcontextが入ったりと予想してなかった変更が入っていて面白いリリースでした。その分(client-go使っている人は特に!)アップグレード前の事前準備に注意しましょう。

この記事はKubernetesのCHANGELOG v1.18から、SIG API Machineryに関連する項目をピックアップして翻訳したものです。他のSIGについてもZ Labの他のメンバーが紹介しているのでそちらもご参照ください :pray:

:pencil: が付いている文章は公式内容ではなく筆者の補足事項です。

:mega: What's New (新情報)

Serverside Apply - Beta 2

1.16でベータに昇格したServer-side Applyが1.18でBeta2になりました。新バージョンでは、全Kubernetesオブジェクトに対してフィールド変更の追跡と管理ができます。これにより、リソースの何がいつ変更されたのかを把握できます。

Extending Ingress with and replacing a deprecated annotation with IngressClass

Kubernetes 1.18では、IngressにpathTypeフィールドと新しいIngressClassリソースが追加されました! pathTypeフィールドはパスのマッチ方法を指定できます。デフォルトのImplementationSpecificタイプに加えて、新たにExactPrefixが追加されました。

IngressClassリソースはKubernetesクラスタ内のIngressタイプを示すために利用します。Ingressは新規追加されたingressClassNameフィールドを利用して、関連づけるクラスを指定できます。これにより、廃止になったkubernetes.io/ingress.classアノテーションは新しいフィールドに置き換えられます。

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

:pencil: ここではclient-goのみ紹介しますが、ほかにも色々あるので他の記事も参照してください。

client-go

生成されたclientset、dynamic/metadata/scaleクライアントのメソッドは第一引数にcontext.Contextをとるようになりました。また、Create、Update、Patchメソッドはそれぞれ引数にCreateOptions、UpdateOptions、PatchOptionsをとります。Delete及びDeleteCollectionメソッドはDeleteOptionsを参照ではなく値として受け付けるようになりました。
以前のインタフェースで生成されたclientsetは、新しいAPIへの逐次的な移行を可能にするために、新しい「非推奨」パッケージで追加されました。非推奨パッケージは1.21のリリース時に削除されます。この移行をサポートするためのツールは http://sigs.k8s.io/clientgofix で提供されています。

:pencil: 移行ツールのclientgofixはcloneしてmake installで直接インストールします。実行すると(デフォルトでは)コードが書き換えられます。やってくれることは、contextとmetav1パッケージのインポート、context.TODO()の挿入、参照渡し or nilだったDeleteOptionsの修正、各種XXXOptionsの挿入です。

$ clientgofix ./...
loaded 203 packages in 17.885371155s
/path/to/file.go
  12: Get: added context import
  12: Get: inserted context.Context as arg 0
/path/to/file2.go
  57: Do: added context import
  57: Do: inserted context.Context as arg 0
  74: Do: inserted context.Context as arg 0

:wastebasket: Deprecations and Removals (廃止および削除)

kube-apiserver

  • すでに廃止になっていた以下のAPIが削除されます #85903
    • apps/v1beta1apps/v1beta2 (今後はapps/v1を使ってください)
    • extensions/v1beta配下のdaemonsetsdeploymentreplicasets (今後はapps/v1を使ってください)
    • extensions/v1beta配下のnetworkpolicies (今後はnetworking.k8s.io/v1を使ってください)
    • extensions/v1beta配下のpodsecuritypolicies (今後はpolicy/v1beta1を使ってください)

kubelet

  • StreamingProxyRedirects機能の--redirect-container-streamingフラグが廃止になりました。このフラグは(kubeletを経由するプロキシのストリーミングリクエストは)デフォルト無効でしたが、現在--redirect-container-streaming=trueフラグを設定している場合この設定の修正が必要です。v1.20以降にこのフラグは削除される予定です。

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

New API types/versions

Ingressの設定を改善するため、新しいIngressClassリソースが追加されました。#88509

New API fields:

autoscaling/v2beta2のHorizontalPodAutoscalerにスケール方法を設定するspec.behaviorフィールドが追加されました。behaviorフィールドはスケールアップやダウンに対して個別に設定できます。どちらの場合も、安定ウィンドウ、ポリシーのリスト、そしてどのポリシーを選択するかを指定できます。ポリシーでは、追加や削除されるPodの絶対数や割合を制限できます。#74525

:pencil: 詳しい指定方法については、このKEPに記述されています。

Other

  • 現在BetaのServerSideApplyは全ての新規オブジェクトに対してフィールドの変更管理を可能にします。metadataのmanagedFieldsに自身を管理するオブジェクトと管理しているオブジェクトのリストが設定されます。
  • CustomResourceDefinition schemaのx-kubernetes-list-map-keysは、全リストアイテムがユニークになるようなプロパティを設定するためのものです。詳しくは k8sドキュメント: マージ戦略 を参照してください。#88076
  • x-kubernetes-list-type: mapx-kubernetes-list-type: setが設定されているCustomResourceDefinition schemaも、リストアイテムが一意であることがバリデーションされるようになりました。#84920

:page_facing_up: Configuration file changes (設定ファイルの変更)

kube-apiserver

--egress-selector-config-fileフラグに対して、apiserver.k8s.io/v1beta1のEgressSelectorConfigurationオブジェクトを定義したファイルを設定できるようになりました。また、network-proxyの接続方法に、HTTPかGRPCを選択できるようになりました。#87179

:pencil: 今まではGRPCをサポートしていませんでした。またChangeLogの文章には書かれていませんが、トランスポートプロトコルもTCPに加えてUDS(UnixDomainSocket)が追加されています。デフォルト値もUDSに変更になりました。詳しくはこちらのKEP - Network Proxyをご参照ください。

kube-proxy

  • kube-apiserverと同じように、kube-controller-managerとkube-schedulerもプロファイリングをデフォルトで公開するようになりました。--enable-profiling=falseを付与すると無効化できます。#88663
  • kube-controller-managerに--endpointslice-updates-batch-periodが追加されました。このフラグは、Podの変更によるEndpointSliceの更新数を削減するために利用できます。#88745

:rocket: Features graduated to GA (GAになった機能)

  • TaintBasedEvictionsがGAしました。#87487
  • 前のリリースで常時有効になったCustomResourceValidation、CustomResourceSubresources、CustomResourceWebhookConversion、CustomResourcePublishOpenAPI、CustomResourceDefaultingはfeature gatesから削除されます。#87475

:sparkles: Feature(機能追加)

  • (リクエストの比率が高い場合の)API request throttlingログは、client-goのログレベル2で表示されるようになりました。これは、Throttling request took 1.50705208s, request: GET:<URL>というフォーマットで表示されているメッセージで、管理者がクラスタをチューニングする必要があるかもしれない状態を示します。#87740
  • APIサーバに--goaway-chanceフラグが追加されました。これは、リクエストの割合に応じて接続をグレースフルに終了(GOAWAY)するものです。これは、HTTP/2クライアントが単一のAPIサーバでスタックすることを防ぎます。#88567

:pencil: HTTP2でAPIサーバとクライアントを接続した場合、別のAPIリクエストでも同じAPIサーバにヒットするためリクエストの負荷分散ができないということを解決するものです。このフラグを追加すると、確率的にHTTP2クライアントにGOAWAYを送信し、処理中のwatchリクエストを処理した後に接続が切られます(つまりこのタイミングで不可分散されます)。ロードバランサを利用していないクラスタ、masterがHA構成ではないクラスタでの利用はNGです。

  • kubeadm: 試験的なPublicKeysECDSAをfeature gateに追加しました。これにより、kubeadm initでECDSA証明書を使ったクラスタを生成できます。また、ECDSA証明書の場合でもkubeadm alpha certs renewを使って証明書の更新ができます。ただし、別のアルゴリズム(RSAとECDSA)へスイッチすることはできません。#86953
  • kubectlに--dry-run=serverオプションを付与すると、apply/patch/create/run/annotate/label/set/autoscale/drain/rollout undo/exposeコマンドの場合Server側でdry-runを実行できるようになりました。#87714
  • CNI versionがv0.8.5に更新されました。#78819
  • Webhooksがnetwork proxyをalpha機能としてサポートしました。#85870
    • :pencil: つまり、認証認可用のwebhookをnetwork proxyにも設定できます。
  • クライアント証明書のファイルが提供/変更された場合、新規接続用にファイルをリロードし、それまでの接続はクローズします。#79083
  • kubeconfigファイル、またはkubeletの--tls-server-nameフラグによりTLSサーバ名を上書きできるようになりました。#88769

:microscope: Misc (その他の軽微な修正)

:pencil: 個人的な注目ポイントはkube-apiserverのlogがgreppableになったこと、/readyzがシャットダウン時に正しいタイミングでエラーを返すようになったこと、kube-apiserverのローリングアップグレード中にwatch(主にkubelet/kube-proxy)が壊れる問題が修正された点です。

  • api-serverのlogをgrepしやすいフォーマットに修正しました。#87203
  • 必須ではない値が設定されていないリクエストをkubectlが間違えてリジェクトしないように、nullが設定されているOpenAPI schemaを公開されないようフィルタしました。#85722
  • シャットダウン開始後、/readyzがerrorを即座に返すよう修正しました。以前は--shutdown-delay-durationで指定された時間が経過されるまでエラーになっていませんでした。#88911
  • watchリクエスト中にkube-apiserverでメモリリークが発生する可能性のある問題を修正しました。#85410
  • shared objectを何度も変更しようとするEndpointSlice controllerのバグが修正されました。#85368
  • コントロールプレーンのローリングアップグレード中にEtcdのLISTが大量に走り可用性が落ちる問題が修正されました。#86430
  • 複数バージョンを定義したCustom Resource(CR)が、何もしない(no-op)patchやCRの更新時にmetadata.generationがインクリメントされ問題が修正されました。#88995
  • サブプロトコルのネゴシエーションのため、クライアントとサーバのprotocol設定が必須になりました。#86646
  • api-serverがサーブしている証明書のnameへ明示的にSNI証明書用のIPアドレスが設定されていた場合、接続時のレスポンスとして優先されます。#85308
  • CVE-2020-9283を修正したバージョンのgolang.org/x/cryptoに更新しました。#88381
  • YAMLのパース性能が向上しました。#85458
    • :pencil: gopkg.in/yaml.v2がv2.2.4からv2.2.7にアップデートされています
  • kube-aggregator: 現在のサービスの状態を反映するために、unavailableGaugeメトリクスが常に設定されるようになりました。#87778
  • kube-apiserver: 退避中のgracePeriodSeconds=0を持つPodに対してprecondition.ResourceVersionを設定しようとすると競合する問題が修正されました。#85516
  • NewDiscoveryClientForConfigNewDiscoveryClientForConfigOrDieを利用しているkubectl get allとclient-go discovery clientの性能劣化問題が修正されました。#86168
  • ネットワーク切断のShared informersの信頼性が向上しました。#86015
  • k8s.io/client-go/tools/eventsのEventRecorderがkube-systemではなく、default名前空間にeventを作成するようになりました。#88815

  1. Special Interest Groups(SIG)は、特定の分野(ex. API/Storage/Network)の特化した開発を進めるためのグループです。SIGの中でさらに複数のサブプロジェクトに分かれていることもあります。 

  2. API serverやAdmission Control、CRDなどなどKubernetesのAPIに関わる機能をまるっと担当しているSIG。 

Ladicle
Software Engineer I'm developing Kubernetes as a Service :)
https://ladicle.com
zlab
技術で新しい世界へシフトする。
https://zlab.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした