概要

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を無効化した後に更新できない、などが報告されています。
  • またレビューでは、アップグレード後に緩い名前を使い、その後ダウングレードすると「保存済みオブジェクトが検証で無効になる」リスク(ロールバック安全性)が議論され、Feature Gateのデフォルト昇格(1.35でのDefault=true)を避ける方向の調整も同PRに含まれました。

影響(運用者/利用者/開発者への影響、注意点、移行)

  • 運用者:
    • RelaxedServiceNameValidationを使ったIngress(特にspec.defaultBackend.service.name側)を、後からFeature Gate無効化した状態で更新しようとすると失敗する、という不整合が解消されます(更新互換性の改善)。
    • 一方で、緩和された名前を「どのバージョン境界まで許容するか」はロールバック可否に関わるため、バージョン運用(アップグレード/ダウングレード)前提でFeature Gateの扱いに注意が必要です(このPRでもその議論が行われています)。
  • 利用者/開発者:
    • IngressのService参照名の検証ルールが、rulesdefaultBackendで一貫します。
    • エラーメッセージ例として、DNS1035では「小文字英数字か-、先頭は英字、末尾は英数字」といった制約が明示されています(テストに現れる期待エラー)。

用語メモ(用語の軽い説明)

  • defaultBackend: どのルールにも一致しないリクエストを処理するバックエンド(Ingressコントローラの挙動に委ねる場合もある)
  • Feature Gate(RelaxedServiceNameValidation): Kubernetesの機能を有効/無効化するスイッチ(段階的導入のために使われる)
  • DNS1123 label(NameIsDNSLabel): DNS 1123に基づくラベル形式の名前制約
  • DNS1035 label(NameIsDNS1035Label): DNS 1035に基づく、より厳しいラベル形式の名前制約

参考リンク