概要
KubernetesのIngressでは、ルールに一致しないリクエストを処理するためにspec.defaultBackendを指定できます。RelaxedServiceNameValidationに関連する実装不備により、spec.rules配下のService名は「緩い名前検証(DNS1123としては有効だがDNS1035としては無効な名前)」を考慮できる一方、spec.defaultBackend.service.nameだけは同じ扱いにならず、更新時に不整合が起きていました。これを修正したのがPR #135426 です。
変更内容(何が変わったか)
allowRelaxedServiceNameValidation(oldIngress)の判定対象に、oldIngress.Spec.DefaultBackend.Service.Nameを追加- 具体的には、サービス名が
NameIsDNSLabel(DNS1123 label)ではエラーなし、かつNameIsDNS1035Label(DNS1035 label)ではエラーになる場合に「緩い検証を許可する」と判定する処理を、defaultBackendにも適用
- 具体的には、サービス名が
- テスト追加
RelaxedServiceNameValidation有効/無効それぞれで、spec.defaultBackend.service.nameの更新が期待通りになることをカバー
- 併せて、
RelaxedServiceNameValidationのバージョン付きFeature Gate定義から「1.35でDefault=true(Beta)」の記述を削除(ロールバック安全性の議論を踏まえた調整)
背景(なぜこの変更が必要か)
- 問題:
RelaxedServiceNameValidationの実装がspec.rulesのService参照は見ているのに、spec.defaultBackend.service.nameを見ておらず、同じIngressでも置き場所によって更新可否が変わってしまう(不整合)- 例として、DNS1123としては妥当だがDNS1035では不許可(例: 先頭が数字)の名前が
defaultBackendにあるIngressが、Feature Gateを無効化した後に更新できない、などが報告されています。
- 例として、DNS1123としては妥当だがDNS1035では不許可(例: 先頭が数字)の名前が
- またレビューでは、アップグレード後に緩い名前を使い、その後ダウングレードすると「保存済みオブジェクトが検証で無効になる」リスク(ロールバック安全性)が議論され、Feature Gateのデフォルト昇格(1.35でのDefault=true)を避ける方向の調整も同PRに含まれました。
影響(運用者/利用者/開発者への影響、注意点、移行)
- 運用者:
RelaxedServiceNameValidationを使ったIngress(特にspec.defaultBackend.service.name側)を、後からFeature Gate無効化した状態で更新しようとすると失敗する、という不整合が解消されます(更新互換性の改善)。- 一方で、緩和された名前を「どのバージョン境界まで許容するか」はロールバック可否に関わるため、バージョン運用(アップグレード/ダウングレード)前提でFeature Gateの扱いに注意が必要です(このPRでもその議論が行われています)。
- 利用者/開発者:
- IngressのService参照名の検証ルールが、
rulesとdefaultBackendで一貫します。 - エラーメッセージ例として、DNS1035では「小文字英数字か
-、先頭は英字、末尾は英数字」といった制約が明示されています(テストに現れる期待エラー)。
- IngressのService参照名の検証ルールが、
用語メモ(用語の軽い説明)
defaultBackend: どのルールにも一致しないリクエストを処理するバックエンド(Ingressコントローラの挙動に委ねる場合もある)- Feature Gate(
RelaxedServiceNameValidation): Kubernetesの機能を有効/無効化するスイッチ(段階的導入のために使われる) - DNS1123 label(
NameIsDNSLabel): DNS 1123に基づくラベル形式の名前制約 - DNS1035 label(
NameIsDNS1035Label): DNS 1035に基づく、より厳しいラベル形式の名前制約
参考リンク
- https://github.com/kubernetes/kubernetes/pull/135426
- https://github.com/kubernetes/kubernetes/issues/135425
- https://github.com/kubernetes/kubernetes/blob/bf0e7b694f3a7355c200241825b6688ad391fae8/staging/src/k8s.io/apimachinery/pkg/api/validation/generic.go
- https://github.com/kubernetes/website/blob/a01d6f3f0487860b12c47fe9953606db9508e3f9/content/en/docs/reference/kubernetes-api/service-resources/ingress-v1.md