はじめに
この記事は Kubernetes v1.36 のリリースノート (CHANGELOG-1.36) から、SIG-Auth に関連する変更内容をまとめたものです。
ここに記載されていないものは別のまとめで記載されていると思いますので、 Kubernetes v1.36: 変更点まとめリンク集 から他のSIG分も参照してみてください。
機能の更新・追加など
Alpha で追加されたもの
ManifestBasedAdmissionControlConfig
Beta に昇格・追加されたもの
DRAResourceClaimGranularStatusAuthorizationComponentFlagzComponentStatuszClientsAllowCARotationClientsAllowTLSCacheGCReloadKubeletClientCAFile
GA になったもの
CSIServiceAccountTokenSecretsExternalServiceAccountTokenSignerDRAAdminAccessProcMountType
削除されたもの
N/A
Changes by Kind
Dependency
- Pod のライフサイクルフック (lifecycle hooks) が Pod 終了時に最大時間まで実行され続けるバグを修正。(#136598)
- etcd クライアントライブラリを
v3.6.8に更新。([#137225])
Deprecation
- クレデンシャルプラグインの Allowlist で
AllowlistEntry.NameをAllowlistEntry.Commandにリネーム。(#137272)
API Change
-
[ACTION REQUIRED]
DRAResourceClaimGranularStatusAuthorizationfeature gate が v1.36 で Beta に昇格。有効時、DRA ドライバーとコントローラーは ResourceClaim のステータス更新に詳細な RBAC パーミッションが必要。スケジューラー・コントローラーはresourceclaims/bindingへのupdate/patchを、DRA ドライバーはresourceclaims/driverへのassociated-node:updateまたはarbitrary-node:updateを付与する必要がある(各ドライバーのresourceNamesで制限)。(#134947) -
TopologyAwareWorkloadSchedulingfeature gate 配下で、PodGroup スケジューリングのための SchedulingConstraints を追加。TAS (topology-aware scheduling) の制約を表現する。TopologyPlacement プラグインが PlacementGenerate extension point を実装し、制約を PodGroup スケジューリングに反映。(#137271) -
WorkloadAwarePreemptionfeature gate 有効時の workload-aware preemption をサポートするため、Workload と PodGroup API にDisruptionMode、PriorityClassName、Priorityフィールドを追加。(#136589) - Pod Certificates Beta API に
spec.stubPKCS10Requestフィールドを追加。PKCS#10 CSR を期待する既存の CA 実装との互換性向上のため。spec.pkixPublicKeyとspec.proofOfPossessionはこのフィールドを優先して非推奨化。(#136729
Alpha との違い: Alpha では公開鍵を独自フィールドで渡していた。
-
spec.pkixPublicKey: 公開鍵そのもの(PKIX 形式) -
spec.proofOfPossession: Pod UID を秘密鍵で署名したバイト列(秘密鍵保有証明)
Beta の spec.stubPKCS10Request はこの2つを PKCS#10 フォーマットに統合。"stub" とある通り Subject 等の中身はほぼ空で、公開鍵の搬送手段として標準フォーマットを使うことが目的。通常はSubject に入れるべき情報は PodCertificateRequest の別フィールドに既にある。
spec:
podName: my-pod
podUID: abc-123
serviceAccountName: my-sa
nodeName: node-1
stubPKCS10Request: <Subject が空の CSR>
発行する証明書の Subject(CN や SAN 等)は signer が独自に決める。
signer が Vault 等の既存 CA へリクエストをフォワードする際、独自フィールドでは変換処理が必要だったが、stubPKCS10Request であればそのまま転送できる。kube-apiserver が admission 時に CSR の署名を検証済みのため、signer 側での再検証も不要。
PKCS#10 とは: 証明書署名要求(CSR)のフォーマット標準(RFC 2986)。subject(誰の証明書か)+ 公開鍵 + 秘密鍵による自己署名 の構造を持ち、申請者が対応する秘密鍵を保有していることを証明できる。Vault をはじめ多くの既存 CA 実装が「リクエスト = PKCS#10 CSR」を前提として設計されている。
- PodGroup オブジェクトの削除保護機構を追加。(#137641)
-
PersistentVolumeClaimUnusedSinceTimefeature gate 配下で、PVC の未使用状態を追跡する Alpha サポートを追加。有効時、非終了状態の Pod から参照されていない PVC に PVC protection controller がPersistentVolumeClaimStatusの新しいUnused条件としてUnused=TrueとlastTransitionTimeを設定する。(#137862) - manifest ベースの Admission Control 設定 (KEP-5793) の Alpha サポートを追加。
ManifestBasedAdmissionControlConfigfeature gate 有効時、AdmissionConfigurationのstaticManifestsDirフィールドを通じてディスク上の静的 manifest から Admission Webhook と CEL ベースのポリシーをロード可能。API サーバー起動時から有効で etcd 障害時も動作し、API ベースの Admission リソースを改ざんから保護できる。(#137346) - PodGroup リソースが既存の Workload を参照しており宣言された PodGroupTemplate spec と一致することを検証する Admission Plugin を追加。(#137464)
- DRA リソースプールの空き状況を照会するための ResourcePoolStatusRequest API (
v1alpha1) を追加。外部スケジューラーがワークロード投入前にプール横断で利用可能なデバイスを把握できる。DRAResourcePoolStatusfeature gate (alpha) が必要。(#137028) - TLS 証明書検証に使用するサーバー名を上書きできるよう、
EgressSelectorConfigurationのTLSConfigにtlsServerNameフィールドを追加。(#136640) -
TopologyAwareWorkloadSchedulingfeature gate 配下で、PodGroup スケジューリングサイクルに TAS ロジックを追加。対応するトポロジードメインを持つノードへの PodGroup スケジューリングをサポート。(#137489) - apiserver の Admission サブシステムで非推奨の
sets.Stringをsets.Set[string]に置き換え。NewLifecycle関数の利用者には 破壊的変更。(#134044) - DRA: PodGroup リソースが ResourceClaims と ResourceClaimTemplates を参照する
spec.resourceClaimsフィールドを追加。PodGroup のクレームは個々の Pod ではなく PodGroup 全体のために予約される。256 個を超える Pod が単一 ResourceClaim を共有することが可能になる。PodGroup のクレームから参照された ResourceClaimTemplate は PodGroup 固有の ResourceClaim に複製され、グループ内の全 Pod で共有される。(#136989) - DRA: デバイスの Taint と Toleration (KEP #5055) を Beta に昇格。ResourceSlice における DeviceTaint サポートはデフォルト有効。
DeviceTaintRulesサポートはresource.k8s.io/v1beta2とDeviceTaintRulesfeature gate の有効化が必要。(#137170) - パラメータのフォーマットが正しく行われていなかった数件のログ呼び出しを修正。(#137108)
- Workload と PodGroup API を Job コントローラーと統合し、gang-scheduling をサポート。(#137032)
- ワークロードレベルのスケジューリング要件を表現し
kube-schedulerが対応できるようscheduling.k8s.io/v1alpha2Workload と PodGroup API を導入。scheduling.k8s.io/v1alpha1Workload API は削除。(#136976) - kube-apiserver:
--audit-policy-fileの resource rules でgroup: "*"を指定することで全 API グループにマッチするよう対応。(#135262) - 複数の component-base メトリクス (
kubernetes_build_info、rest_client_requests_total、rest_client_request_duration_seconds、running_managed_controllers) を Alpha から Beta Stability に昇格。コンシューマーに対してより強固な API・ラベル安定性保証を提供。(#136154) - DRA の extended resource 機能を v1.36 で Beta に昇格。(#135048)
-
DRAAdminAccessfeature gate を GA に昇格。(#137373) -
ProcMountTypefeature を GA に昇格。(#137454) - StorageVersionMigrator によるマイグレーション後に CustomResourceDefinition の stored versions を status から削除するよう変更。(#135297)
-
k8s.io/apiの Kubernetes REST API 型から、標準v1proto メッセージとして誤って識別していた一時的なビルドタグ付きProtoMessage()マーカーメソッド実装を削除。Kubernetes API 型の Protobuf シリアライゼーションには k8s.io/apimachinery/pkg/runtime/serializer/protobuf を使用すること。(#137084) -
ConstrainedImpersonationfeature 有効時、Impersonation を使用する遅いリクエストをapiserver.latency.k8s.io/impersonationaudit event annotation でトラッキング可能に。(#137523) - API サーバー内部 API グループを更新し、フィールドが optional か required かについての OpenAPI スキーマ正確性を改善。(#134675)
Feature
- 制約付き Impersonation のメトリクスを追加:
apiserver_impersonation_attempts_total、apiserver_impersonation_attempts_duration_seconds、apiserver_impersonation_authorization_attempts_total、apiserver_impersonation_authorization_attempts_duration_seconds(ラベル: mode, decision)。(#137374) -
adminClusterRole に Workload の読み書き権限、editClusterRole に書き込み権限、viewClusterRole に読み取り権限を追加。(#135418) - CRD バリデーションにおいて、スキーマで指定された数値フォーマット (
int32、int64、float、double) の範囲を厳密に適用するよう変更。範囲外の値を持つ既存オブジェクトは validation ratcheting により保持される。(#136582) -
ComponentFlagzを Beta に昇格。(#137386) -
ComponentStatuszを Beta に昇格。(#137384) - Kubernetes streaming transport と CRI streaming server のコードを新しい staging モジュール
k8s.io/streamingとk8s.io/cri-streamingとして分離。k8s.io/apimachinery/pkg/util/httpstream(spdy・wsstreamを含む) はk8s.io/streamingをバックとする非推奨互換ラッパーとして引き続き利用可能。抽出した SPDY roundtripper はNO_PROXY/no_proxyの CIDR マッチングを保持。(#137298) - kube-apiserver:
ExternalServiceAccountTokenSignerfeature gate を GA に昇格。(#136118) - Kubelet:
--client-ca-fileが kubelet 稼働中に更新された場合、更新されたルート証明書が kubelet エンドポイントに接続する TLS クライアントへのアドバタイズに正しく使用されるよう修正。ReloadKubeletClientCAFilefeature gate で制御、デフォルト有効。(#136762) -
CSIServiceAccountTokenSecretsfeature gate を GA に昇格。(#136596)
Bug or Regression
-
PodCertificateRequestの OwnerReference で誤った apiVersion"core/v1"を使用していた問題を修正。これにより所有 Pod 削除時にPodCertificateRequestのガベージコレクションが行われなかった。(#137008) -
kubelet の設定で
preloadedImagesVerificationAllowlistに対するイメージ名の比較方法を修正。従来は"alpine"等の familiar なイメージ名を Pod が使用していてもpreloadedImagesVerificationAllowlist内の同名エントリと正しくマッチしなかった。(#137629) -
server side apply と client-go の
Extract{TypeName}()/Extract{TypeName}From()関数において、空の配列・マップが誤って absent として扱われ、associative list の atomic 要素が誤って重複する問題を修正。(#135391) -
大規模クラスターで ResourceSlice エントリを shared と onNode カテゴリに分割することで DRA スケジューリングのパフォーマンスを改善。Filter ステージのレイテンシを最大 ~50% 削減。(#136588)
-
Kubelet: kubelet が DNS/ホスト名ではなく IP アドレスでダイヤルされている場合に、ディスク上のサーバー証明書ファイルの再ロードが正しく行われない問題を修正。(#133654)
-
k8s.io/client-go/transportパッケージが、ファイルパスで指定された CA ルートをディスクから自動的にリロードするように変更。デフォルト有効でClientsAllowCARotationfeature gate により無効化可能。(#132922)背景: issue #119483 として 2023年7月に報告。InClusterConfig を使う client-go は
/var/run/secrets/kubernetes.io/serviceaccount/ca.crt等の CA ファイルを起動時に一度しか読み込まず、クラスターの CA ローテーション時に kube-apiserver への接続が永続的に切断され、Pod を再起動するまで回復しなかった。CA ローテーションというセキュリティ運用が逆にサービス断を引き起こすという問題。実装: リクエストのたびに前回チェックから 5分 経過していれば CA ファイルを読み直す(ファイル監視ではなくポーリング)。内容が変わっていれば
transport.Clone()で新しい transport を生成しRootCAsを差し替え、古い transport のCloseIdleConnections()を呼ぶ。5分のポーリング間隔があるため、CA ローテーション後最大 5 分は古い CA が使われ続ける点に注意。有効条件:
ClientsAllowCARotationfeature gate が ON、かつTLS.ReloadCAFiles=true、かつCAFileが指定されている場合のみ機能する。メトリクス:
rest_client_transport_ca_reloads_total{status, reason}で成功・失敗・スキップを追跡。 -
k8s.io/client-go/transportパッケージが、使用されなくなった transport の TLS キャッシュエントリと証明書ローテーション goroutine をガベージコレクションするように変更。デフォルト有効でClientsAllowTLSCacheGCfeature gate により制御可能。feature gate 非有効時は TLS キャッシュが無制限に増加し goroutine がリークする。デバッグ用に新しいカウンターメトリクスrest_client_transport_cert_rotation_gc_calls_total{}、rest_client_transport_cache_gc_calls_total{result: deleted/skipped}を追加。これらは既存のrest_client_transport_*メトリクスと組み合わせてデバッグに活用できる。k8s.io/client-goを組み込むが feature gate を配線していないバイナリはKUBE_FEATURE_ClientsAllowTLSCacheGC=false環境変数で無効化可能。(#136355)背景: issue #109289 として 2022年4月に報告、約3年放置されていた。グローバルな
tlsCacheが eviction 機構を持たず、多数のクラスターに接続する長期稼働プロセス(マルチクラスター管理ツール等)でメモリが際限なく増加し続けた。また証明書ローテーション用の goroutine も transport が破棄されても生き続けリークしていた。回避策としてconfig.Proxyをセットしてキャッシュを迂回する方法はあったが非直感的で実用的ではなかった。ClientsAllowTLSCacheGCが無効の場合は従来の挙動にフォールバック。KUBE_FEATURE_ClientsAllowTLSCacheGC=false環境変数でも無効化できる。