1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

K8s v1.31 SIG-Authの変更内容

Last updated at Posted at 2024-08-29

はじめに

このページではKubernetes v1.31におけるSIG-Authに関連する取り組みについて、ChangelogのChanges By Kindの項目から紹介しています。ここに記載されていないものは別のまとめで記載されていると思いますので、  Kubernetes 1.31: 変更点まとめも確認してみてください。

:pencil2: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

Changes by Kind

Deprecation

  • N/A

API Change

  • ACTION REQUIRED: Dynamic Resource Allocation (DRA) ドライバーのDaemonSetはResourceSliceの書き込みとResourceClaimの読みこみが有効なサービスアカウントでデプロイしなければなりません。 (#125163)
  • AlphaとしてCoordinated Leader Electionを CoordinatedLeaderElection フィーチャーゲートに追加しました。この機能を有効にすると、コントロールプレーンは LeaseCandidate オブジェクト (coordination.k8s.io/v1alpha1 API group) を使用してリーダー選挙に参加し、kube-apiserverに何らかの戦略に従って最適なインスタンスを選択させることができます。(#124012)
  • CEL拡張ライブラリの厳格なコスト計算を強制するためのフィーチャーゲート StrictCostEnforcementForVAPStrictCostEnforcementForWebhooks を追加しました。このフィーチャーゲートはできるだけ早い段階でオンにすることを強く推奨します。(#124675)
  • Component-base/logs: Go >= 1.21でコンパイルすると、component-baseはklogの初期化とあわせて自動的にslogのデフォルトロガーを設定します。(#120696)
  • Dynamic Resource Allocation (DRA): ResourceQuotaメカニズムによってResourceClaimオブジェクトの数をネームスペースごとに制限、特定のクラスを通じて要求されるデバイスの数によって制限できる機能を追加しました。. (#120611)
  • Dynamic Resource Allocation (DRA): pod.spec.recourceClaims 配列の source indirectionが不要になりました。例えば、source: resourceClaimTemplateName: my-templateの代わりにresourceClaimTemplateName: my-templateと書くことができます。(#125116)
  • resource.k8s.io APIグループのバージョンを更新しDynamic Resource Allocation (DRA)を強化しました。 ユーザー向けの主要な型はResourceClaimのままですが、大幅な変更が加えられ、新しいバージョンv1alpha3となりました。v1alpha3は以前のバージョンと互換性はありません。(#125488)
  • kube-apiserver: APIサーバーが認可でリクエストのコンテキストをチェックできるAlpha機能を追加しました。
    •  AuthorizeWithSelectors フィーチャーゲートはWebhookの認可呼び出しにフィールドとラベルセレクタ情報を含めることができます。
    •  AuthorizeNodeWithSelectors フィーチャーゲートはノード API クライアントからのリクエストを制限するために、Node authorizerの振る舞いを変更します。これにより、各ノードは自身のノード API オブジェクトのみをget/list/watchでき、そのノードにバインドされた Pod API オブジェクトのみをget/list/watchすることもできます。kubelet クレデンシャルを使用して他のノードや無関係なポッドを読み取るクライアントは、認証情報を変更するか(推奨)、使用方法を調整するか、Node authorizerに依存しないより広範な読み取りアクセスを得る必要があります。. (#125571))
      • :pencil2:
      • KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/4601-authorize-with-selectors
      • フィールドとラベルのセレクタを認可属性として公開することでセキュリティの改善が期待できる
      • AuthorizeWithSelectors
        • SelfSubjectAccessReviewSubjectAccessReviewLocalSubjectAccessReview structに FieldSelectorLabelSelector が追加されました。
        • フィールド、ラベル情報を認可のWebhook先に渡すことができます。
      • AuthorizeNodeWithSelectors
        • 上記の機能を内部で使ったもの
        • kubeletは自身に紐付くNodeやPodに対するget, list, watchのみが許可されるようになります (v1.30以前は制限なく情報を取得できた)

e.g. SubjectAccessReview spec

{
  "apiVersion": "authorization.k8s.io/v1beta1",
  "kind": "SubjectAccessReview",
  "spec": {
    "resourceAttributes": {
      "verb": "list",
      "group": "",
      "resource": "pods",
      "fieldSelector": {
        "requirements": [
          {"key":"spec.nodeName", "operator":"In", "values":["mynode"]}
        ]
      },
      "labelSelector": {
        "requirements": [
          {"key":"example.com/mykey", "operator":"In", "values":["myvalue"]}
        ]
      }
    },
    "user": "jane",
    "group": [
      "group1",
      "group2"
    ]
  }
}	

e.g. CEL

authorizer.group('').resource('pods').fieldSelector('spec.nodeName=mynode').check('list').allowed()

authorizer.group('').resource('pods').labelSelector('example.com/mylabel=myvalue').check('list').allowed()

e.g. false

apiVersion: apiserver.config.k8s.io/v1alpha1
kind: AuthenticationConfiguration
anonymous:
  enabled: false

e.g. enable

apiVersion: apiserver.config.k8s.io/v1alpha1
kind: AuthenticationConfiguration
anonymous:
  enabled: true

e.g. enable(条件付き)

apiVersion: apiserver.config.k8s.io/v1alpha1
kind: AuthenticationConfiguration
anonymous:
  enabled: true
  conditions:
  - path: "/healthz"
  - path: "/readyz"
  - path: "/livez"

Feature

  • CustomResourceFieldSelectorsをベータに追加しデフォルトで有効になります。詳細は kubernetes/enhancements#4358 を確認してください。(#124681)
  • fake client-go型のクライアントにフィールドマネジメントのサポートを追加しました。フィールドマネジメントのサポート付きのclentsetを作成するにはfake.NewSimpleClientset()の代わりに fake.NewClientSet()を使ってください。(#125560)
  • kubeletサーバーは動的に証明書ファイルをロードできるようになりました。(#124574)
    • :pencil2: これまでクライアント証明書はclient-goによって動的にリロードされていましたが、サーバー証明書はそうなっていなかったようです
  • Nodeオブジェクトに紐付いたServiceAccountトークンを作成できるようになりました。ユーザは、Podに紐付いたトークンと同様にトークンの有効性を名前付きのNodeオブジェクトに紐付けることができます。kubectl create token <serviceaccount-name> --bound-object-kind=Node --bound-object-node=<node-name> で利用できます。 (#125238)
    • :pencil2: v1.30以前は--bound-object-kindの対象はPod,SecretのみでしたがNodeが追加されました
  • kubeletは、関連するNodeオブジェクトの.status.addressに少なくとも1つのIPアドレスがある場合にのみ証明書を要求するようになりました。これにより、外部で設定されたアドレスが配置される前に、DNSのみの証明書を要求することを回避できます。1.33 までは、kubelet で非推奨の AllowDNSOnlyNodeCSR 機能ゲートを true に設定することで以前の動作に戻すことができます。 (#125813)
  • client-goのListメソッドにAPIストリーミングを可能にする新しい機能を追加しました。この機能を有効にするには、client-go.WatchListClientフィーチャーゲートを設定します。この機能が正しく機能するためには、サーバーがストリーミングをサポートしていなければならないことに注意が必要です。サーバーがストリーミングをサポートしていない場合client-go はデータを取得するために通常の LIST メソッドを使用するように戻ります。 (#124509)
  • kube-apiserver: Alpha の UserNamespacesPodSecurityStandards フィーチャーゲートが有効になっている場合、ベースラインポリシーの Pod Security Admission の施行で procMount:hostUsers: false を設定したユーザー名前空間のPodに対して procMount: Unmasked を許可するようになりました。 (#126163)
  • 1.31から、container_engine_tがベースラインのPod Security Standardで許可されるSELinux型のリストに追加されました。 (#126165)
  • PodDisruptionBudget spec.unhealthyPodEvictionPolicy フィールドが GAになりました。このフィールドを AlwaysAllow に設定すると、PodDisruptionBudget でカバーされているアンヘルシーなpodを常に退去させることができます。 (#123428)
  • CEL(Common Expression Language)のオプション型の名前が optional から optional_type に変更されました。 (#124328)

Failing Test

  • N/A

Bug or Regression

  • storage-version-migrator-controller にて、マイグレーションが進行中にリソースが削除されるとマイグレーションが失敗するバグを修正しました。 (#126107)
  • kube-apiserver: --authorization-configファイルで認可webhookに設定されたタイムアウトが尊重されるようになり、webhookのタイムアウトがresult=timeoutのwebhookメトリクスに正確に反映されるようになりました。(#125552)
  • AdmissionプラグインのPersistentVolumeLabel が削除されました。同様の機能が必要な場合は代わりに  https://github.com/kubernetes-sigs/cloud-pv-admission-labeler を使ってください。 (#124505)
  • client-genで生成された"fake"クライアントは本物のクライアントと同じセマンティクスを持つようになりました。特に失敗したGet()やCreate()などはnilを返さなくなります(本物のクライアントと同じようにゼロ値のオブジェクトへのポインタを返します)。 これはresult != nil よりもresult == nil をテストしていたダウンストリームの単体テストや、場合によっては誤った単体テストによって隠されていた根本的なコードのバグが露呈することもあります。. (#122892)

Other (Cleanup or Flake)

  • Node Admissionプラグインは kubernetes.io/kubelet-serving or kubernetes.io/kube-apiserver-client-kubeletのsingerへの、CNがsystem:node:で始まるが system:node:${node-name} ではないCSRの要求を拒否します。フィーチャーゲートAllowInsecureKubeletCertificateSigningRequests のデフォルトは false であるが、有効にすると以前の動作に戻します。このフィーチャーゲートは Kubernetes v1.33 で削除される予定です。(#126441)
  • 最後に残っていたin-treeのgcp クラウドプロバイダーとクレデンシャルプロバイダーを削除しました。代わりにhttps://github.com/kubernetes/cloud-provider-gcpの外部クラウドプロバイダとクレデンシャルプロバイダを使用してください。 (#124519 )
1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?