diff --git a/.github/workflows/test-gateway-api-conformance.yaml b/.github/workflows/test-gateway-api-conformance.yaml
index 0fc4b09d2..724a45776 100644
--- a/.github/workflows/test-gateway-api-conformance.yaml
+++ b/.github/workflows/test-gateway-api-conformance.yaml
@@ -7,8 +7,8 @@ on:
paths:
- '.github/workflows/test-gateway-api-conformance.yaml'
- 'pkg/provider/kubernetes/gateway/**'
- - 'integration/fixtures/k8s-conformance/**'
- - 'integration/k8s_conformance_test.go'
+ - 'integration/fixtures/gateway-api-conformance/**'
+ - 'integration/gateway_api_conformance_test.go'
env:
GO_VERSION: '1.24'
@@ -34,7 +34,7 @@ jobs:
run: |
touch webui/static/index.html
- - name: K8s Gateway API conformance test and report
+ - name: Gateway API conformance test and report
run: |
make test-gateway-api-conformance
git diff --exit-code
diff --git a/.gitignore b/.gitignore
index 1754b1c70..741873dc9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,4 +19,4 @@ plugins-storage/
plugins-local/
traefik_changelog.md
integration/tailscale.secret
-integration/conformance-reports/**/experimental-dev-default-report.yaml
+integration/gateway-api-conformance-reports/**/experimental-dev-default-report.yaml
diff --git a/.golangci.yml b/.golangci.yml
index 25de20ba1..62e29ed6d 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -318,6 +318,8 @@ linters:
- recvcheck
- path: pkg/proxy/httputil/bufferpool.go
text: 'SA6002: argument should be pointer-like to avoid allocations'
+ - path: integration/integration_test.go
+ text: 'var (gatewayAPIConformanceRunTest|traefikVersion) is unused'
paths:
- pkg/provider/kubernetes/crd/generated/
diff --git a/Makefile b/Makefile
index b33b23361..7f361cfb2 100644
--- a/Makefile
+++ b/Makefile
@@ -102,8 +102,8 @@ test-integration:
.PHONY: test-gateway-api-conformance
#? test-gateway-api-conformance: Run the Gateway API conformance tests
test-gateway-api-conformance: build-image-dirty
- # In case of a new Minor/Major version, the k8sConformanceTraefikVersion needs to be updated.
- GOOS=$(GOOS) GOARCH=$(GOARCH) go test ./integration -v -test.run K8sConformanceSuite -k8sConformance -k8sConformanceTraefikVersion="v3.5" $(TESTFLAGS)
+ # In case of a new Minor/Major version, the traefikVersion needs to be updated.
+ GOOS=$(GOOS) GOARCH=$(GOARCH) go test ./integration -v -tags gatewayAPIConformance -test.run GatewayAPIConformanceSuite -traefikVersion="v3.6" $(TESTFLAGS)
.PHONY: test-knative-conformance
#? test-knative-conformance: Run the Knative conformance tests
diff --git a/docs/content/migrate/v3.md b/docs/content/migrate/v3.md
index 8f8194fef..f046b2e69 100644
--- a/docs/content/migrate/v3.md
+++ b/docs/content/migrate/v3.md
@@ -489,3 +489,22 @@ To use the new `proxyprotocol` option in the Kubernetes CRD provider, you need t
```shell
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v3.5/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
```
+
+## v3.6.0
+
+### Kubernetes Gateway API Provider
+
+Starting with `v3.6.0`, the Kubernetes Gateway API provider only supports version [v1.4.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.4.0) of the specification,
+which requires the Gateway API CRDs to be updated.
+
+**Apply Updated CRDs:**
+
+```shell
+kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.0/standard-install.yaml
+```
+
+For the experimental channel:
+
+```shell
+kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.0/experimental-install.yaml
+```
diff --git a/docs/content/providers/kubernetes-gateway.md b/docs/content/providers/kubernetes-gateway.md
index 22158dfb0..bf2dff9cb 100644
--- a/docs/content/providers/kubernetes-gateway.md
+++ b/docs/content/providers/kubernetes-gateway.md
@@ -8,11 +8,11 @@ description: "Learn how to use the Kubernetes Gateway API as a provider for conf
The Kubernetes Gateway provider is a Traefik implementation of the [Gateway API](https://gateway-api.sigs.k8s.io/)
specification from the Kubernetes Special Interest Groups (SIGs).
-This provider supports Standard version [v1.3.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.3.0) of the Gateway API specification.
+This provider supports Standard version [v1.4.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.4.0) of the Gateway API specification.
It fully supports all HTTP core and some extended features, as well as the `TCPRoute` and `TLSRoute` resources from the [Experimental channel](https://gateway-api.sigs.k8s.io/concepts/versioning/?h=#release-channels).
-For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.3.0/traefik-traefik).
+For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.4.0/traefik-traefik).
## Requirements
@@ -27,7 +27,7 @@ For more details, check out the conformance [report](https://github.com/kubernet
```bash
# Install Gateway API CRDs from the Standard channel.
- kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.3.0/standard-install.yaml
+ kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.0/standard-install.yaml
```
2. Install the additional Traefik RBAC required for Gateway API.
@@ -275,7 +275,7 @@ providers:
```bash
# Install Gateway API CRDs from the Experimental channel.
- kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.3.0/experimental-install.yaml
+ kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.0/experimental-install.yaml
```
### `labelselector`
diff --git a/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-gateway.md b/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-gateway.md
index 9d73ba18e..1a864c058 100644
--- a/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-gateway.md
+++ b/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-gateway.md
@@ -8,11 +8,11 @@ description: "Learn how to use the Kubernetes Gateway API as a provider for conf
The Kubernetes Gateway provider is a Traefik implementation of the [Gateway API](https://gateway-api.sigs.k8s.io/)
specification from the Kubernetes Special Interest Groups (SIGs).
-This provider supports Standard version [v1.3.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.3.0) of the Gateway API specification.
+This provider supports Standard version [v1.4.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.4.0) of the Gateway API specification.
It fully supports all HTTP core and some extended features, as well as the `TCPRoute` and `TLSRoute` resources from the [Experimental channel](https://gateway-api.sigs.k8s.io/concepts/versioning/?h=#release-channels).
-For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.3.0/traefik-traefik).
+For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.4.0/traefik-traefik).
!!! info "Using The Helm Chart"
@@ -27,7 +27,7 @@ For more details, check out the conformance [report](https://github.com/kubernet
```bash
# Install Gateway API CRDs from the Standard channel.
- kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.3.0/standard-install.yaml
+ kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.0/standard-install.yaml
```
2. Install/update the Traefik [RBAC](../../../dynamic-configuration/kubernetes-gateway-rbac.yml).
diff --git a/docs/content/routing/providers/kubernetes-gateway.md b/docs/content/routing/providers/kubernetes-gateway.md
index f658ca4ba..512f64784 100644
--- a/docs/content/routing/providers/kubernetes-gateway.md
+++ b/docs/content/routing/providers/kubernetes-gateway.md
@@ -8,11 +8,11 @@ description: "The Kubernetes Gateway API can be used as a provider for routing a
When using the Kubernetes Gateway API provider, Traefik leverages the Gateway API Custom Resource Definitions (CRDs) to obtain its routing configuration.
For detailed information on the Gateway API concepts and resources, refer to the official [documentation](https://gateway-api.sigs.k8s.io/).
-The Kubernetes Gateway API provider supports version [v1.3.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.3.0) of the specification.
+The Kubernetes Gateway API provider supports version [v1.4.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.4.0) of the specification.
It fully supports all `HTTPRoute` core and some extended features, like `GRPCRoute`, as well as the `TCPRoute` and `TLSRoute` resources from the [Experimental channel](https://gateway-api.sigs.k8s.io/concepts/versioning/?h=#release-channels).
-For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.3.0/traefik-traefik).
+For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.4.0/traefik-traefik).
## Deploying a Gateway
diff --git a/go.mod b/go.mod
index e11ce8eda..1753588e8 100644
--- a/go.mod
+++ b/go.mod
@@ -29,7 +29,7 @@ require (
github.com/golang/protobuf v1.5.4
github.com/google/go-github/v28 v28.1.1
github.com/gorilla/mux v1.8.1
- github.com/gorilla/websocket v1.5.3
+ github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674
github.com/hashicorp/consul/api v1.26.1
github.com/hashicorp/go-hclog v1.6.3
github.com/hashicorp/go-multierror v1.1.1
@@ -53,8 +53,8 @@ require (
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/pires/go-proxyproto v0.8.1
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // No tag on the repo.
- github.com/prometheus/client_golang v1.22.0
- github.com/prometheus/client_model v0.6.1
+ github.com/prometheus/client_golang v1.23.0
+ github.com/prometheus/client_model v0.6.2
github.com/quic-go/quic-go v0.54.0
github.com/redis/go-redis/v9 v9.8.0
github.com/rs/zerolog v1.33.0
@@ -103,20 +103,20 @@ require (
golang.org/x/text v0.29.0
golang.org/x/time v0.13.0
golang.org/x/tools v0.36.0
- google.golang.org/grpc v1.75.0
+ google.golang.org/grpc v1.75.1
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v3 v3.0.1
- k8s.io/api v0.32.3
- k8s.io/apiextensions-apiserver v0.32.3
- k8s.io/apimachinery v0.32.3
- k8s.io/client-go v0.32.3
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // No tag on the repo.
+ k8s.io/api v0.34.1
+ k8s.io/apiextensions-apiserver v0.34.1
+ k8s.io/apimachinery v0.34.1
+ k8s.io/client-go v0.34.1
+ k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d // No tag on the repo.
knative.dev/networking v0.0.0-20241022012959-60e29ff520dc
knative.dev/pkg v0.0.0-20241021183759-9b9d535af5ad
mvdan.cc/xurls/v2 v2.5.0
- sigs.k8s.io/controller-runtime v0.20.4
- sigs.k8s.io/gateway-api v1.3.0
- sigs.k8s.io/yaml v1.4.0
+ sigs.k8s.io/controller-runtime v0.22.1
+ sigs.k8s.io/gateway-api v1.4.0
+ sigs.k8s.io/yaml v1.6.0
)
require (
@@ -194,12 +194,12 @@ require (
github.com/distribution/reference v0.6.0 // indirect
github.com/dnsimple/dnsimple-go/v4 v4.0.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
- github.com/emicklei/go-restful/v3 v3.12.1 // indirect
+ github.com/emicklei/go-restful/v3 v3.13.0 // indirect
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
github.com/exoscale/egoscale/v3 v3.1.26 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
- github.com/fxamacker/cbor/v2 v2.7.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/gin-gonic/gin v1.9.1 // indirect
@@ -213,9 +213,9 @@ require (
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-logr/zapr v1.3.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
- github.com/go-openapi/jsonpointer v0.21.0 // indirect
+ github.com/go-openapi/jsonpointer v0.21.2 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
- github.com/go-openapi/swag v0.23.0 // indirect
+ github.com/go-openapi/swag v0.23.1 // indirect
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
@@ -223,16 +223,15 @@ require (
github.com/go-resty/resty/v2 v2.16.5 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/go-zookeeper/zk v1.0.3 // indirect
- github.com/goccy/go-yaml v1.11.3 // indirect
+ github.com/goccy/go-yaml v1.18.0 // indirect
github.com/gofrs/flock v0.12.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
- github.com/google/gnostic-models v0.6.8 // indirect
+ github.com/google/gnostic-models v0.7.0 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
- github.com/google/gofuzz v1.2.0 // indirect
github.com/google/s2a-go v0.1.9 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
@@ -256,7 +255,7 @@ require (
github.com/imdario/mergo v0.3.16 // indirect
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect
github.com/infobloxopen/infoblox-go-client/v2 v2.10.0 // indirect
- github.com/jonboulle/clockwork v0.4.0 // indirect
+ github.com/jonboulle/clockwork v0.5.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect
@@ -274,7 +273,7 @@ require (
github.com/mailgun/minheap v0.0.0-20170619185613-3dbe6c6bf55f // indirect
github.com/mailgun/multibuf v0.1.2 // indirect
github.com/mailgun/timetools v0.0.0-20141028012446-7e6055773c51 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mimuret/golang-iij-dpf v0.9.1 // indirect
@@ -321,8 +320,8 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect
github.com/pquerna/otp v1.5.0 // indirect
- github.com/prometheus/common v0.62.0 // indirect
- github.com/prometheus/procfs v0.15.1 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
+ github.com/prometheus/procfs v0.17.0 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/regfish/regfish-dnsapi-go v0.1.1 // indirect
github.com/rs/cors v1.7.0 // indirect
@@ -369,9 +368,9 @@ require (
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
github.com/zeebo/errs v1.4.0 // indirect
- go.etcd.io/etcd/api/v3 v3.5.16 // indirect
- go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect
- go.etcd.io/etcd/client/v3 v3.5.16 // indirect
+ go.etcd.io/etcd/api/v3 v3.6.4 // indirect
+ go.etcd.io/etcd/client/pkg/v3 v3.6.4 // indirect
+ go.etcd.io/etcd/client/v3 v3.6.4 // indirect
go.mongodb.org/mongo-driver v1.13.1 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
@@ -387,26 +386,28 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/ratelimit v0.3.1 // indirect
go.uber.org/zap v1.27.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
+ go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/arch v0.4.0 // indirect
golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect
golang.org/x/oauth2 v0.31.0 // indirect
golang.org/x/term v0.35.0 // indirect
- golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
google.golang.org/api v0.249.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 // indirect
google.golang.org/protobuf v1.36.8 // indirect
- gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
+ gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/ns1/ns1-go.v2 v2.15.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
- k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
+ k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3 // indirect
nhooyr.io/websocket v1.8.7 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
- sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect
+ sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
+ sigs.k8s.io/randfill v1.0.0 // indirect
+ sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
)
// Containous forks
diff --git a/go.sum b/go.sum
index 4fd32533a..4c44ae06c 100644
--- a/go.sum
+++ b/go.sum
@@ -371,8 +371,8 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o=
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM=
-github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
-github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=
+github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -409,8 +409,8 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
-github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
-github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
+github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
+github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
@@ -464,13 +464,13 @@ github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
-github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonpointer v0.21.2 h1:AqQaNADVwq/VnkCmQg6ogE+M3FOsKTytwges0JdwVuA=
+github.com/go-openapi/jsonpointer v0.21.2/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
-github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU=
+github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es=
github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
@@ -513,8 +513,8 @@ github.com/goccy/go-json v0.7.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGF
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE=
-github.com/goccy/go-yaml v1.11.3 h1:B3W9IdWbvrUu2OYQGwvU1nZtvMQJPBKgBUuweJjLj6I=
-github.com/goccy/go-yaml v1.11.3/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU=
+github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
+github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
@@ -572,8 +572,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
-github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
-github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
+github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
+github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -598,8 +598,6 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
@@ -638,8 +636,8 @@ github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
-github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
+github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
github.com/gravitational/trace v1.1.16-0.20220114165159-14a9a7dd6aaf h1:C1GPyPJrOlJlIrcaBBiBpDsqZena2Ks8spa5xZqr1XQ=
github.com/gravitational/trace v1.1.16-0.20220114165159-14a9a7dd6aaf/go.mod h1:zXqxTI6jXDdKnlf8s+nT+3c8LrwUEy3yNpO4XJL90lA=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
@@ -759,8 +757,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
-github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
-github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
+github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I=
+github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
@@ -863,8 +861,8 @@ github.com/mailgun/ttlmap v0.0.0-20170619185759-c1c17f74874f h1:ZZYhg16XocqSKPGN
github.com/mailgun/ttlmap v0.0.0-20170619185759-c1c17f74874f/go.mod h1:8heskWJ5c0v5J9WH89ADhyal1DOZcayll8fSbhB+/9A=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -1082,14 +1080,14 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
-github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
+github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc=
+github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
+github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
@@ -1098,8 +1096,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
-github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
-github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -1108,8 +1106,8 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
-github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=
+github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=
github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0=
github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
@@ -1357,15 +1355,15 @@ github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=
github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0=
-go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28=
+go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo=
+go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk=
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
-go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q=
-go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E=
+go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0=
+go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI=
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
-go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE=
-go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50=
+go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A=
+go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo=
go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk=
go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -1461,6 +1459,10 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
+go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc=
golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
@@ -1854,8 +1856,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
-golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
@@ -1924,8 +1924,8 @@ google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuO
google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 h1:pmJpJEvT846VzausCQ5d7KreSROcDqmO388w5YbnltA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -1943,8 +1943,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
-google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
+google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI=
+google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -1969,8 +1969,8 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
-gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
+gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo=
+gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
@@ -2012,20 +2012,20 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls=
-k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k=
-k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY=
-k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss=
-k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U=
-k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU=
-k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY=
+k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM=
+k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk=
+k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI=
+k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc=
+k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4=
+k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
+k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY=
+k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
-k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3 h1:liMHz39T5dJO1aOKHLvwaCjDbf07wVh6yaUlTpunnkE=
+k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
+k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d h1:wAhiDyZ4Tdtt7e46e9M5ZSAJ/MnPGPs+Ki1gHw4w1R0=
+k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
knative.dev/networking v0.0.0-20241022012959-60e29ff520dc h1:0d9XXRLlyuHfINZLlYqo/BYe/+chqqNBMLKJldjTbtw=
knative.dev/networking v0.0.0-20241022012959-60e29ff520dc/go.mod h1:G56j6VCLzfaN9yZ4IqfNyN4c3U1czvhUmKeZX4UjQ8Q=
knative.dev/pkg v0.0.0-20241021183759-9b9d535af5ad h1:Nrjtr2H168rJeamH4QdyLMV1lEKHejNhaj1ymgQMfLk=
@@ -2039,16 +2039,16 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU=
-sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY=
-sigs.k8s.io/gateway-api v1.3.0 h1:q6okN+/UKDATola4JY7zXzx40WO4VISk7i9DIfOvr9M=
-sigs.k8s.io/gateway-api v1.3.0/go.mod h1:d8NV8nJbaRbEKem+5IuxkL8gJGOZ+FJ+NvOIltV8gDk=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
-sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016 h1:kXv6kKdoEtedwuqMmkqhbkgvYKeycVbC8+iPCP9j5kQ=
-sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
-sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI=
-sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
+sigs.k8s.io/controller-runtime v0.22.1 h1:Ah1T7I+0A7ize291nJZdS1CabF/lB4E++WizgV24Eqg=
+sigs.k8s.io/controller-runtime v0.22.1/go.mod h1:FwiwRjkRPbiN+zp2QRp7wlTCzbUXxZ/D4OzuQUDwBHY=
+sigs.k8s.io/gateway-api v1.4.0 h1:ZwlNM6zOHq0h3WUX2gfByPs2yAEsy/EenYJB78jpQfQ=
+sigs.k8s.io/gateway-api v1.4.0/go.mod h1:AR5RSqciWP98OPckEjOjh2XJhAe2Na4LHyXD2FUY7Qk=
+sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
+sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
+sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
+sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
+sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco=
+sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
-sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
+sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
diff --git a/integration/fixtures/k8s-conformance/00-experimental-v1.3.0.yml b/integration/fixtures/gateway-api-conformance/00-experimental-v1.4.0.yml
similarity index 81%
rename from integration/fixtures/k8s-conformance/00-experimental-v1.3.0.yml
rename to integration/fixtures/gateway-api-conformance/00-experimental-v1.4.0.yml
index 75725cc0f..b1e7bd2f2 100644
--- a/integration/fixtures/k8s-conformance/00-experimental-v1.3.0.yml
+++ b/integration/fixtures/gateway-api-conformance/00-experimental-v1.4.0.yml
@@ -24,9 +24,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
labels:
gateway.networking.k8s.io/policy: Direct
name: backendtlspolicies.gateway.networking.k8s.io
@@ -47,7 +46,7 @@ spec:
- jsonPath: .metadata.creationTimestamp
name: Age
type: date
- name: v1alpha3
+ name: v1
schema:
openAPIV3Schema:
description: |-
@@ -114,6 +113,22 @@ spec:
be unique across all targetRef entries in the BackendTLSPolicy.
* They select different sectionNames in the same target.
+ When more than one BackendTLSPolicy selects the same target and
+ sectionName, implementations MUST determine precedence using the
+ following criteria, continuing on ties:
+
+ * The older policy by creation timestamp takes precedence. For
+ example, a policy with a creation timestamp of "2021-07-15
+ 01:02:03" MUST be given precedence over a policy with a
+ creation timestamp of "2021-07-15 01:02:04".
+ * The policy appearing first in alphabetical order by {name}.
+ For example, a policy named `bar` is given precedence over a
+ policy named `baz`.
+
+ For any BackendTLSPolicy that does not take precedence, the
+ implementation MUST ensure the `Accepted` Condition is set to
+ `status: False`, with Reason `Conflicted`.
+
Support: Extended for Kubernetes Service
Support: Implementation-specific for any other resource
@@ -170,6 +185,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName must be specified when targetRefs includes
2 or more references to the same target
@@ -198,8 +214,31 @@ spec:
not both. If CACertificateRefs is empty or unspecified, the configuration for
WellKnownCACertificates MUST be honored instead if supported by the implementation.
- References to a resource in a different namespace are invalid for the
- moment, although we will revisit this in the future.
+ A CACertificateRef is invalid if:
+
+ * It refers to a resource that cannot be resolved (e.g., the referenced resource
+ does not exist) or is misconfigured (e.g., a ConfigMap does not contain a key
+ named `ca.crt`). In this case, the Reason must be set to `InvalidCACertificateRef`
+ and the Message of the Condition must indicate which reference is invalid and why.
+
+ * It refers to an unknown or unsupported kind of resource. In this case, the Reason
+ must be set to `InvalidKind` and the Message of the Condition must explain which
+ kind of resource is unknown or unsupported.
+
+ * It refers to a resource in another namespace. This may change in future
+ spec updates.
+
+ Implementations MAY choose to perform further validation of the certificate
+ content (e.g., checking expiry or enforcing specific formats). In such cases,
+ an implementation-specific Reason and Message must be set for the invalid reference.
+
+ In all cases, the implementation MUST ensure the `ResolvedRefs` Condition on
+ the BackendTLSPolicy is set to `status: False`, with a Reason and Message
+ that indicate the cause of the error. Connections using an invalid
+ CACertificateRef MUST fail, and the client MUST receive an HTTP 5xx error
+ response. If ALL CACertificateRefs are invalid, the implementation MUST also
+ ensure the `Accepted` Condition on the BackendTLSPolicy is set to
+ `status: False`, with a Reason `NoValidCACertificate`.
A single CACertificateRef to a Kubernetes ConfigMap kind has "Core" support.
Implementations MAY choose to support attaching multiple certificates to
@@ -208,8 +247,8 @@ spec:
Support: Core - An optional single reference to a Kubernetes ConfigMap,
with the CA certificate in a key named `ca.crt`.
- Support: Implementation-specific (More than one reference, or other kinds
- of resources).
+ Support: Implementation-specific - More than one reference, other kinds
+ of resources, or a single reference that includes multiple certificates.
items:
description: |-
LocalObjectReference identifies an API object within the namespace of the
@@ -247,15 +286,18 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
hostname:
description: |-
Hostname is used for two purposes in the connection between Gateways and
backends:
1. Hostname MUST be used as the SNI to connect to the backend (RFC 6066).
- 2. Hostname MUST be used for authentication and MUST match the certificate served by the matching backend, unless SubjectAltNames is specified.
- authentication and MUST match the certificate served by the matching
- backend.
+ 2. Hostname MUST be used for authentication and MUST match the certificate
+ served by the matching backend, unless SubjectAltNames is specified.
+ 3. If SubjectAltNames are specified, Hostname can be used for certificate selection
+ but MUST NOT be used for authentication. If you want to use the value
+ of the Hostname field for authentication, you MUST add it to the SubjectAltNames list.
Support: Core
maxLength: 253
@@ -325,6 +367,7 @@ spec:
"")'
maxItems: 5
type: array
+ x-kubernetes-list-type: atomic
wellKnownCACertificates:
description: |-
WellKnownCACertificates specifies whether system CA certificates may be used in
@@ -332,10 +375,11 @@ spec:
If WellKnownCACertificates is unspecified or empty (""), then CACertificateRefs
must be specified with at least one entry for a valid configuration. Only one of
- CACertificateRefs or WellKnownCACertificates may be specified, not both. If an
- implementation does not support the WellKnownCACertificates field or the value
- supplied is not supported, the Status Conditions on the Policy MUST be
- updated to include an Accepted: False Condition with Reason: Invalid.
+ CACertificateRefs or WellKnownCACertificates may be specified, not both.
+ If an implementation does not support the WellKnownCACertificates field, or
+ the supplied value is not recognized, the implementation MUST ensure the
+ `Accepted` Condition on the BackendTLSPolicy is set to `status: False`, with
+ a Reason `Invalid`.
Support: Implementation-specific
enum:
@@ -646,10 +690,12 @@ spec:
type: string
required:
- ancestorRef
+ - conditions
- controllerName
type: object
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
required:
- ancestors
type: object
@@ -660,6 +706,667 @@ spec:
storage: true
subresources:
status: {}
+ - deprecated: true
+ deprecationWarning: The v1alpha3 version of BackendTLSPolicy has been deprecated
+ and will be removed in a future release of the API. Please upgrade to v1.
+ name: v1alpha3
+ schema:
+ openAPIV3Schema:
+ description: |-
+ BackendTLSPolicy provides a way to configure how a Gateway
+ connects to a Backend via TLS.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: Spec defines the desired state of BackendTLSPolicy.
+ properties:
+ options:
+ additionalProperties:
+ description: |-
+ AnnotationValue is the value of an annotation in Gateway API. This is used
+ for validation of maps such as TLS options. This roughly matches Kubernetes
+ annotation validation, although the length validation in that case is based
+ on the entire size of the annotations struct.
+ maxLength: 4096
+ minLength: 0
+ type: string
+ description: |-
+ Options are a list of key/value pairs to enable extended TLS
+ configuration for each implementation. For example, configuring the
+ minimum TLS version or supported cipher suites.
+
+ A set of common keys MAY be defined by the API in the future. To avoid
+ any ambiguity, implementation-specific definitions MUST use
+ domain-prefixed names, such as `example.com/my-custom-option`.
+ Un-prefixed names are reserved for key names defined by Gateway API.
+
+ Support: Implementation-specific
+ maxProperties: 16
+ type: object
+ targetRefs:
+ description: |-
+ TargetRefs identifies an API object to apply the policy to.
+ Only Services have Extended support. Implementations MAY support
+ additional objects, with Implementation Specific support.
+ Note that this config applies to the entire referenced resource
+ by default, but this default may change in the future to provide
+ a more granular application of the policy.
+
+ TargetRefs must be _distinct_. This means either that:
+
+ * They select different targets. If this is the case, then targetRef
+ entries are distinct. In terms of fields, this means that the
+ multi-part key defined by `group`, `kind`, and `name` must
+ be unique across all targetRef entries in the BackendTLSPolicy.
+ * They select different sectionNames in the same target.
+
+ When more than one BackendTLSPolicy selects the same target and
+ sectionName, implementations MUST determine precedence using the
+ following criteria, continuing on ties:
+
+ * The older policy by creation timestamp takes precedence. For
+ example, a policy with a creation timestamp of "2021-07-15
+ 01:02:03" MUST be given precedence over a policy with a
+ creation timestamp of "2021-07-15 01:02:04".
+ * The policy appearing first in alphabetical order by {name}.
+ For example, a policy named `bar` is given precedence over a
+ policy named `baz`.
+
+ For any BackendTLSPolicy that does not take precedence, the
+ implementation MUST ensure the `Accepted` Condition is set to
+ `status: False`, with Reason `Conflicted`.
+
+ Support: Extended for Kubernetes Service
+
+ Support: Implementation-specific for any other resource
+ items:
+ description: |-
+ LocalPolicyTargetReferenceWithSectionName identifies an API object to apply a
+ direct policy to. This should be used as part of Policy resources that can
+ target single resources. For more information on how this policy attachment
+ mode works, and a sample Policy resource, refer to the policy attachment
+ documentation for Gateway API.
+
+ Note: This should only be used for direct policy attachment when references
+ to SectionName are actually needed. In all other cases,
+ LocalPolicyTargetReference should be used.
+ properties:
+ group:
+ description: Group is the group of the target resource.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the target resource.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the target resource.
+ maxLength: 253
+ minLength: 1
+ type: string
+ sectionName:
+ description: |-
+ SectionName is the name of a section within the target resource. When
+ unspecified, this targetRef targets the entire resource. In the following
+ resources, SectionName is interpreted as the following:
+
+ * Gateway: Listener name
+ * HTTPRoute: HTTPRouteRule name
+ * Service: Port name
+
+ If a SectionName is specified, but does not exist on the targeted object,
+ the Policy must fail to attach, and the policy implementation should record
+ a `ResolvedRefs` or similar Condition in the Policy's status.
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 16
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ x-kubernetes-validations:
+ - message: sectionName must be specified when targetRefs includes
+ 2 or more references to the same target
+ rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name ? ((!has(p1.sectionName) || p1.sectionName
+ == '''') == (!has(p2.sectionName) || p2.sectionName == ''''))
+ : true))'
+ - message: sectionName must be unique when targetRefs includes 2 or
+ more references to the same target
+ rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name && (((!has(p1.sectionName) ||
+ p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName
+ == '')) || (has(p1.sectionName) && has(p2.sectionName) && p1.sectionName
+ == p2.sectionName))))
+ validation:
+ description: Validation contains backend TLS validation configuration.
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to Kubernetes objects that
+ contain a PEM-encoded TLS CA certificate bundle, which is used to
+ validate a TLS handshake between the Gateway and backend Pod.
+
+ If CACertificateRefs is empty or unspecified, then WellKnownCACertificates must be
+ specified. Only one of CACertificateRefs or WellKnownCACertificates may be specified,
+ not both. If CACertificateRefs is empty or unspecified, the configuration for
+ WellKnownCACertificates MUST be honored instead if supported by the implementation.
+
+ A CACertificateRef is invalid if:
+
+ * It refers to a resource that cannot be resolved (e.g., the referenced resource
+ does not exist) or is misconfigured (e.g., a ConfigMap does not contain a key
+ named `ca.crt`). In this case, the Reason must be set to `InvalidCACertificateRef`
+ and the Message of the Condition must indicate which reference is invalid and why.
+
+ * It refers to an unknown or unsupported kind of resource. In this case, the Reason
+ must be set to `InvalidKind` and the Message of the Condition must explain which
+ kind of resource is unknown or unsupported.
+
+ * It refers to a resource in another namespace. This may change in future
+ spec updates.
+
+ Implementations MAY choose to perform further validation of the certificate
+ content (e.g., checking expiry or enforcing specific formats). In such cases,
+ an implementation-specific Reason and Message must be set for the invalid reference.
+
+ In all cases, the implementation MUST ensure the `ResolvedRefs` Condition on
+ the BackendTLSPolicy is set to `status: False`, with a Reason and Message
+ that indicate the cause of the error. Connections using an invalid
+ CACertificateRef MUST fail, and the client MUST receive an HTTP 5xx error
+ response. If ALL CACertificateRefs are invalid, the implementation MUST also
+ ensure the `Accepted` Condition on the BackendTLSPolicy is set to
+ `status: False`, with a Reason `NoValidCACertificate`.
+
+ A single CACertificateRef to a Kubernetes ConfigMap kind has "Core" support.
+ Implementations MAY choose to support attaching multiple certificates to
+ a backend, but this behavior is implementation-specific.
+
+ Support: Core - An optional single reference to a Kubernetes ConfigMap,
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific - More than one reference, other kinds
+ of resources, or a single reference that includes multiple certificates.
+ items:
+ description: |-
+ LocalObjectReference identifies an API object within the namespace of the
+ referrer.
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent. For example "HTTPRoute"
+ or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ type: array
+ x-kubernetes-list-type: atomic
+ hostname:
+ description: |-
+ Hostname is used for two purposes in the connection between Gateways and
+ backends:
+
+ 1. Hostname MUST be used as the SNI to connect to the backend (RFC 6066).
+ 2. Hostname MUST be used for authentication and MUST match the certificate
+ served by the matching backend, unless SubjectAltNames is specified.
+ 3. If SubjectAltNames are specified, Hostname can be used for certificate selection
+ but MUST NOT be used for authentication. If you want to use the value
+ of the Hostname field for authentication, you MUST add it to the SubjectAltNames list.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ subjectAltNames:
+ description: |-
+ SubjectAltNames contains one or more Subject Alternative Names.
+ When specified the certificate served from the backend MUST
+ have at least one Subject Alternate Name matching one of the specified SubjectAltNames.
+
+ Support: Extended
+ items:
+ description: SubjectAltName represents Subject Alternative Name.
+ properties:
+ hostname:
+ description: |-
+ Hostname contains Subject Alternative Name specified in DNS name format.
+ Required when Type is set to Hostname, ignored otherwise.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ type:
+ description: |-
+ Type determines the format of the Subject Alternative Name. Always required.
+
+ Support: Core
+ enum:
+ - Hostname
+ - URI
+ type: string
+ uri:
+ description: |-
+ URI contains Subject Alternative Name specified in a full URI format.
+ It MUST include both a scheme (e.g., "http" or "ftp") and a scheme-specific-part.
+ Common values include SPIFFE IDs like "spiffe://mycluster.example.com/ns/myns/sa/svc1sa".
+ Required when Type is set to URI, ignored otherwise.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?
+ type: string
+ required:
+ - type
+ type: object
+ x-kubernetes-validations:
+ - message: SubjectAltName element must contain Hostname, if
+ Type is set to Hostname
+ rule: '!(self.type == "Hostname" && (!has(self.hostname) ||
+ self.hostname == ""))'
+ - message: SubjectAltName element must not contain Hostname,
+ if Type is not set to Hostname
+ rule: '!(self.type != "Hostname" && has(self.hostname) &&
+ self.hostname != "")'
+ - message: SubjectAltName element must contain URI, if Type
+ is set to URI
+ rule: '!(self.type == "URI" && (!has(self.uri) || self.uri
+ == ""))'
+ - message: SubjectAltName element must not contain URI, if Type
+ is not set to URI
+ rule: '!(self.type != "URI" && has(self.uri) && self.uri !=
+ "")'
+ maxItems: 5
+ type: array
+ x-kubernetes-list-type: atomic
+ wellKnownCACertificates:
+ description: |-
+ WellKnownCACertificates specifies whether system CA certificates may be used in
+ the TLS handshake between the gateway and backend pod.
+
+ If WellKnownCACertificates is unspecified or empty (""), then CACertificateRefs
+ must be specified with at least one entry for a valid configuration. Only one of
+ CACertificateRefs or WellKnownCACertificates may be specified, not both.
+ If an implementation does not support the WellKnownCACertificates field, or
+ the supplied value is not recognized, the implementation MUST ensure the
+ `Accepted` Condition on the BackendTLSPolicy is set to `status: False`, with
+ a Reason `Invalid`.
+
+ Support: Implementation-specific
+ enum:
+ - System
+ type: string
+ required:
+ - hostname
+ type: object
+ x-kubernetes-validations:
+ - message: must not contain both CACertificateRefs and WellKnownCACertificates
+ rule: '!(has(self.caCertificateRefs) && size(self.caCertificateRefs)
+ > 0 && has(self.wellKnownCACertificates) && self.wellKnownCACertificates
+ != "")'
+ - message: must specify either CACertificateRefs or WellKnownCACertificates
+ rule: (has(self.caCertificateRefs) && size(self.caCertificateRefs)
+ > 0 || has(self.wellKnownCACertificates) && self.wellKnownCACertificates
+ != "")
+ required:
+ - targetRefs
+ - validation
+ type: object
+ status:
+ description: Status defines the current state of BackendTLSPolicy.
+ properties:
+ ancestors:
+ description: |-
+ Ancestors is a list of ancestor resources (usually Gateways) that are
+ associated with the policy, and the status of the policy with respect to
+ each ancestor. When this policy attaches to a parent, the controller that
+ manages the parent and the ancestors MUST add an entry to this list when
+ the controller first sees the policy and SHOULD update the entry as
+ appropriate when the relevant ancestor is modified.
+
+ Note that choosing the relevant ancestor is left to the Policy designers;
+ an important part of Policy design is designing the right object level at
+ which to namespace this status.
+
+ Note also that implementations MUST ONLY populate ancestor status for
+ the Ancestor resources they are responsible for. Implementations MUST
+ use the ControllerName field to uniquely identify the entries in this list
+ that they are responsible for.
+
+ Note that to achieve this, the list of PolicyAncestorStatus structs
+ MUST be treated as a map with a composite key, made up of the AncestorRef
+ and ControllerName fields combined.
+
+ A maximum of 16 ancestors will be represented in this list. An empty list
+ means the Policy is not relevant for any ancestors.
+
+ If this slice is full, implementations MUST NOT add further entries.
+ Instead they MUST consider the policy unimplementable and signal that
+ on any related resources such as the ancestor that would be referenced
+ here. For example, if this list was full on BackendTLSPolicy, no
+ additional Gateways would be able to reference the Service targeted by
+ the BackendTLSPolicy.
+ items:
+ description: |-
+ PolicyAncestorStatus describes the status of a route with respect to an
+ associated Ancestor.
+
+ Ancestors refer to objects that are either the Target of a policy or above it
+ in terms of object hierarchy. For example, if a policy targets a Service, the
+ Policy's Ancestors are, in order, the Service, the HTTPRoute, the Gateway, and
+ the GatewayClass. Almost always, in this hierarchy, the Gateway will be the most
+ useful object to place Policy status on, so we recommend that implementations
+ SHOULD use Gateway as the PolicyAncestorStatus object unless the designers
+ have a _very_ good reason otherwise.
+
+ In the context of policy attachment, the Ancestor is used to distinguish which
+ resource results in a distinct application of this policy. For example, if a policy
+ targets a Service, it may have a distinct result per attached Gateway.
+
+ Policies targeting the same resource may have different effects depending on the
+ ancestors of those resources. For example, different Gateways targeting the same
+ Service may have different capabilities, especially if they have different underlying
+ implementations.
+
+ For example, in BackendTLSPolicy, the Policy attaches to a Service that is
+ used as a backend in a HTTPRoute that is itself attached to a Gateway.
+ In this case, the relevant object for status is the Gateway, and that is the
+ ancestor object referred to in this status.
+
+ Note that a parent is also an ancestor, so for objects where the parent is the
+ relevant object for status, this struct SHOULD still be used.
+
+ This struct is intended to be used in a slice that's effectively a map,
+ with a composite key made up of the AncestorRef and the ControllerName.
+ properties:
+ ancestorRef:
+ description: |-
+ AncestorRef corresponds with a ParentRef in the spec that this
+ PolicyAncestorStatus struct describes the status of.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: |-
+ Group is the group of the referent.
+ When unspecified, "gateway.networking.k8s.io" is inferred.
+ To set the core API group (such as for a "Service" kind referent),
+ Group must be explicitly set to "" (empty string).
+
+ Support: Core
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Gateway
+ description: |-
+ Kind is kind of the referent.
+
+ There are two kinds of parent resources with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ Support for other resources is Implementation-Specific.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: |-
+ Name is the name of the referent.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent. When unspecified, this refers
+ to the local namespace of the Route.
+
+ Note that there are specific rules for ParentRefs which cross namespace
+ boundaries. Cross-namespace references are only valid if they are explicitly
+ allowed by something in the namespace they are referring to. For example:
+ Gateway has the AllowedRoutes field, and ReferenceGrant provides a
+ generic way to enable any other kind of cross-namespace reference.
+
+
+ ParentRefs from a Route to a Service in the same namespace are "producer"
+ routes, which apply default routing rules to inbound connections from
+ any namespace to the Service.
+
+ ParentRefs from a Route to a Service in a different namespace are
+ "consumer" routes, and these routing rules are only applied to outbound
+ connections originating from the same namespace as the Route, for which
+ the intended destination of the connections are a Service targeted as a
+ ParentRef of the Route.
+
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port is the network port this Route targets. It can be interpreted
+ differently based on the type of parent resource.
+
+ When the parent resource is a Gateway, this targets all listeners
+ listening on the specified port that also support this kind of Route(and
+ select this Route). It's not recommended to set `Port` unless the
+ networking behaviors specified in a Route must apply to a specific port
+ as opposed to a listener(s) whose port(s) may be changed. When both Port
+ and SectionName are specified, the name and port of the selected listener
+ must match both specified values.
+
+
+ When the parent resource is a Service, this targets a specific port in the
+ Service spec. When both Port (experimental) and SectionName are specified,
+ the name and port of the selected port must match both specified values.
+
+
+ Implementations MAY choose to support other parent resources.
+ Implementations supporting other types of parent resources MUST clearly
+ document how/if Port is interpreted.
+
+ For the purpose of status, an attachment is considered successful as
+ long as the parent resource accepts it partially. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
+ from the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route,
+ the Route MUST be considered detached from the Gateway.
+
+ Support: Extended
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ sectionName:
+ description: |-
+ SectionName is the name of a section within the target resource. In the
+ following resources, SectionName is interpreted as the following:
+
+ * Gateway: Listener name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+ * Service: Port name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+
+ Implementations MAY choose to support attaching Routes to other resources.
+ If that is the case, they MUST clearly document how SectionName is
+ interpreted.
+
+ When unspecified (empty string), this will reference the entire resource.
+ For the purpose of status, an attachment is considered successful if at
+ least one section in the parent resource accepts it. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
+ the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route, the
+ Route MUST be considered detached from the Gateway.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - name
+ type: object
+ conditions:
+ description: Conditions describes the status of the Policy with
+ respect to the given Ancestor.
+ items:
+ description: Condition contains details for one aspect of
+ the current state of this API Resource.
+ properties:
+ lastTransitionTime:
+ description: |-
+ lastTransitionTime is the last time the condition transitioned from one status to another.
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
+ format: date-time
+ type: string
+ message:
+ description: |-
+ message is a human readable message indicating details about the transition.
+ This may be an empty string.
+ maxLength: 32768
+ type: string
+ observedGeneration:
+ description: |-
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+ with respect to the current state of the instance.
+ format: int64
+ minimum: 0
+ type: integer
+ reason:
+ description: |-
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
+ Producers of specific condition types may define expected values and meanings for this field,
+ and whether the values are considered a guaranteed API.
+ The value should be a CamelCase string.
+ This field may not be empty.
+ maxLength: 1024
+ minLength: 1
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+ type: string
+ status:
+ description: status of the condition, one of True, False,
+ Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
+ type: string
+ type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ maxLength: 316
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+ type: string
+ required:
+ - lastTransitionTime
+ - message
+ - reason
+ - status
+ - type
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-map-keys:
+ - type
+ x-kubernetes-list-type: map
+ controllerName:
+ description: |-
+ ControllerName is a domain/path string that indicates the name of the
+ controller that wrote this status. This corresponds with the
+ controllerName field on GatewayClass.
+
+ Example: "example.net/gateway-controller".
+
+ The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are
+ valid Kubernetes names
+ (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).
+
+ Controllers MUST populate this field when writing status. Controllers should ensure that
+ entries to status populated with their ControllerName are cleaned up when they are no
+ longer necessary.
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$
+ type: string
+ required:
+ - ancestorRef
+ - conditions
+ - controllerName
+ type: object
+ maxItems: 16
+ type: array
+ x-kubernetes-list-type: atomic
+ required:
+ - ancestors
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: false
status:
acceptedNames:
kind: ""
@@ -675,9 +1382,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: gatewayclasses.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -1195,9 +1901,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: gateways.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -1257,7 +1962,7 @@ spec:
Addresses requested for this Gateway. This is optional and behavior can
depend on the implementation. If a value is set in the spec and the
requested address is invalid or unavailable, the implementation MUST
- indicate this in the associated entry in GatewayStatus.Addresses.
+ indicate this in an associated entry in GatewayStatus.Conditions.
The Addresses field represents a request for the address(es) on the
"outside of the Gateway", that traffic bound for this Gateway will use.
@@ -1312,19 +2017,22 @@ spec:
type: string
type: object
x-kubernetes-validations:
- - message: Hostname value must only contain valid characters (matching
- ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)
- rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):
+ - message: Hostname value must be empty or contain only valid characters
+ (matching ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)
+ rule: 'self.type == ''Hostname'' ? (!has(self.value) || self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$""")):
true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: IPAddress values must be unique
- rule: 'self.all(a1, a1.type == ''IPAddress'' ? self.exists_one(a2,
- a2.type == a1.type && a2.value == a1.value) : true )'
+ rule: 'self.all(a1, a1.type == ''IPAddress'' && has(a1.value) ?
+ self.exists_one(a2, a2.type == a1.type && has(a2.value) && a2.value
+ == a1.value) : true )'
- message: Hostname values must be unique
- rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2,
- a2.type == a1.type && a2.value == a1.value) : true )'
+ rule: 'self.all(a1, a1.type == ''Hostname'' && has(a1.value) ?
+ self.exists_one(a2, a2.type == a1.type && has(a2.value) && a2.value
+ == a1.value) : true )'
allowedListeners:
description: |-
AllowedListeners defines which ListenerSets can be attached to this Gateway.
@@ -1406,70 +2114,29 @@ spec:
x-kubernetes-map-type: atomic
type: object
type: object
- backendTLS:
+ defaultScope:
description: |-
- BackendTLS configures TLS settings for when this Gateway is connecting to
- backends with TLS.
+ DefaultScope, when set, configures the Gateway as a default Gateway,
+ meaning it will dynamically and implicitly have Routes (e.g. HTTPRoute)
+ attached to it, according to the scope configured here.
- Support: Core
- properties:
- clientCertificateRef:
- description: |-
- ClientCertificateRef is a reference to an object that contains a Client
- Certificate and the associated private key.
-
- References to a resource in different namespace are invalid UNLESS there
- is a ReferenceGrant in the target namespace that allows the certificate
- to be attached. If a ReferenceGrant does not allow this reference, the
- "ResolvedRefs" condition MUST be set to False for this listener with the
- "RefNotPermitted" reason.
-
- ClientCertificateRef can reference to standard Kubernetes resources, i.e.
- Secret, or implementation-specific custom resources.
-
- This setting can be overridden on the service level by use of BackendTLSPolicy.
-
- Support: Core
- properties:
- group:
- default: ""
- description: |-
- Group is the group of the referent. For example, "gateway.networking.k8s.io".
- When unspecified or empty string, core API group is inferred.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- kind:
- default: Secret
- description: Kind is kind of the referent. For example "Secret".
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the referent.
- maxLength: 253
- minLength: 1
- type: string
- namespace:
- description: |-
- Namespace is the namespace of the referenced object. When unspecified, the local
- namespace is inferred.
-
- Note that when a namespace different than the local namespace is specified,
- a ReferenceGrant object is required in the referent namespace to allow that
- namespace's owner to accept the reference. See the ReferenceGrant
- documentation for details.
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- required:
- - name
- type: object
- type: object
+ If unset (the default) or set to None, the Gateway will not act as a
+ default Gateway; if set, the Gateway will claim any Route with a
+ matching scope set in its UseDefaultGateway field, subject to the usual
+ rules about which routes the Gateway can attach to.
+
+ Think carefully before using this functionality! While the normal rules
+ about which Route can apply are still enforced, it is simply easier for
+ the wrong Route to be accidentally attached to this Gateway in this
+ configuration. If the Gateway operator is not also the operator in
+ control of the scope (e.g. namespace) with tight controls and checks on
+ what kind of workloads and Routes get added in that scope, we strongly
+ recommend not using this just because it seems convenient, and instead
+ stick to direct Route attachment.
+ enum:
+ - All
+ - None
+ type: string
gatewayClassName:
description: |-
GatewayClassName used for this Gateway. This is the name of a
@@ -1825,6 +2492,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
namespaces:
default:
from: Same
@@ -1992,7 +2660,7 @@ spec:
the Protocol field is "HTTPS" or "TLS". It is invalid to set this field
if the Protocol field is "HTTP", "TCP", or "UDP".
- The association of SNIs to Certificate defined in GatewayTLSConfig is
+ The association of SNIs to Certificate defined in ListenerTLSConfig is
defined based on the Hostname field for this listener.
The GatewayClass MUST use the longest matching SNI out of all
@@ -2079,93 +2747,7 @@ spec:
type: object
maxItems: 64
type: array
- frontendValidation:
- description: |-
- FrontendValidation holds configuration information for validating the frontend (client).
- Setting this field will require clients to send a client certificate
- required for validation during the TLS handshake. In browsers this may result in a dialog appearing
- that requests a user to specify the client certificate.
- The maximum depth of a certificate chain accepted in verification is Implementation specific.
-
- Support: Extended
- properties:
- caCertificateRefs:
- description: |-
- CACertificateRefs contains one or more references to
- Kubernetes objects that contain TLS certificates of
- the Certificate Authorities that can be used
- as a trust anchor to validate the certificates presented by the client.
-
- A single CA certificate reference to a Kubernetes ConfigMap
- has "Core" support.
- Implementations MAY choose to support attaching multiple CA certificates to
- a Listener, but this behavior is implementation-specific.
-
- Support: Core - A single reference to a Kubernetes ConfigMap
- with the CA certificate in a key named `ca.crt`.
-
- Support: Implementation-specific (More than one reference, or other kinds
- of resources).
-
- References to a resource in a different namespace are invalid UNLESS there
- is a ReferenceGrant in the target namespace that allows the certificate
- to be attached. If a ReferenceGrant does not allow this reference, the
- "ResolvedRefs" condition MUST be set to False for this listener with the
- "RefNotPermitted" reason.
- items:
- description: |-
- ObjectReference identifies an API object including its namespace.
-
- The API object must be valid in the cluster; the Group and Kind must
- be registered in the cluster for this reference to be valid.
-
- References to objects with invalid Group and Kind are not valid, and must
- be rejected by the implementation, with appropriate Conditions set
- on the containing object.
- properties:
- group:
- description: |-
- Group is the group of the referent. For example, "gateway.networking.k8s.io".
- When set to the empty string, core API group is inferred.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- kind:
- description: Kind is kind of the referent. For
- example "ConfigMap" or "Service".
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the referent.
- maxLength: 253
- minLength: 1
- type: string
- namespace:
- description: |-
- Namespace is the namespace of the referenced object. When unspecified, the local
- namespace is inferred.
-
- Note that when a namespace different than the local namespace is specified,
- a ReferenceGrant object is required in the referent namespace to allow that
- namespace's owner to accept the reference. See the ReferenceGrant
- documentation for details.
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- required:
- - group
- - kind
- - name
- type: object
- maxItems: 8
- minItems: 1
- type: array
- type: object
+ x-kubernetes-list-type: atomic
mode:
default: Terminate
description: |-
@@ -2244,6 +2826,366 @@ spec:
rule: 'self.all(l1, self.exists_one(l2, l1.port == l2.port && l1.protocol
== l2.protocol && (has(l1.hostname) && has(l2.hostname) ? l1.hostname
== l2.hostname : !has(l1.hostname) && !has(l2.hostname))))'
+ tls:
+ description: |-
+ TLS specifies frontend and backend tls configuration for entire gateway.
+
+ Support: Extended
+ properties:
+ backend:
+ description: |-
+ Backend describes TLS configuration for gateway when connecting
+ to backends.
+
+ Note that this contains only details for the Gateway as a TLS client,
+ and does _not_ imply behavior about how to choose which backend should
+ get a TLS connection. That is determined by the presence of a BackendTLSPolicy.
+
+ Support: Core
+ properties:
+ clientCertificateRef:
+ description: |-
+ ClientCertificateRef is a reference to an object that contains a Client
+ Certificate and the associated private key.
+
+ References to a resource in different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+
+ ClientCertificateRef can reference to standard Kubernetes resources, i.e.
+ Secret, or implementation-specific custom resources.
+
+ Support: Core
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Secret
+ description: Kind is kind of the referent. For example
+ "Secret".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - name
+ type: object
+ type: object
+ frontend:
+ description: |-
+ Frontend describes TLS config when client connects to Gateway.
+ Support: Core
+ properties:
+ default:
+ description: |-
+ Default specifies the default client certificate validation configuration
+ for all Listeners handling HTTPS traffic, unless a per-port configuration
+ is defined.
+
+ support: Core
+ properties:
+ validation:
+ description: |-
+ Validation holds configuration information for validating the frontend (client).
+ Setting this field will result in mutual authentication when connecting to the gateway.
+ In browsers this may result in a dialog appearing
+ that requests a user to specify the client certificate.
+ The maximum depth of a certificate chain accepted in verification is Implementation specific.
+
+ Support: Core
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to
+ Kubernetes objects that contain TLS certificates of
+ the Certificate Authorities that can be used
+ as a trust anchor to validate the certificates presented by the client.
+
+ A single CA certificate reference to a Kubernetes ConfigMap
+ has "Core" support.
+ Implementations MAY choose to support attaching multiple CA certificates to
+ a Listener, but this behavior is implementation-specific.
+
+ Support: Core - A single reference to a Kubernetes ConfigMap
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific (More than one certificate in a ConfigMap
+ with different keys or more than one reference, or other kinds of resources).
+
+ References to a resource in a different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+ items:
+ description: |-
+ ObjectReference identifies an API object including its namespace.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When set to the empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent. For
+ example "ConfigMap" or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ mode:
+ default: AllowValidOnly
+ description: |-
+ FrontendValidationMode defines the mode for validating the client certificate.
+ There are two possible modes:
+
+ - AllowValidOnly: In this mode, the gateway will accept connections only if
+ the client presents a valid certificate. This certificate must successfully
+ pass validation against the CA certificates specified in `CACertificateRefs`.
+ - AllowInsecureFallback: In this mode, the gateway will accept connections
+ even if the client certificate is not presented or fails verification.
+
+ This approach delegates client authorization to the backend and introduce
+ a significant security risk. It should be used in testing environments or
+ on a temporary basis in non-testing environments.
+
+ Defaults to AllowValidOnly.
+
+ Support: Core
+ enum:
+ - AllowValidOnly
+ - AllowInsecureFallback
+ type: string
+ required:
+ - caCertificateRefs
+ type: object
+ type: object
+ perPort:
+ description: |-
+ PerPort specifies tls configuration assigned per port.
+ Per port configuration is optional. Once set this configuration overrides
+ the default configuration for all Listeners handling HTTPS traffic
+ that match this port.
+ Each override port requires a unique TLS configuration.
+
+ support: Core
+ items:
+ properties:
+ port:
+ description: |-
+ The Port indicates the Port Number to which the TLS configuration will be
+ applied. This configuration will be applied to all Listeners handling HTTPS
+ traffic that match this port.
+
+ Support: Core
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ tls:
+ description: |-
+ TLS store the configuration that will be applied to all Listeners handling
+ HTTPS traffic and matching given port.
+
+ Support: Core
+ properties:
+ validation:
+ description: |-
+ Validation holds configuration information for validating the frontend (client).
+ Setting this field will result in mutual authentication when connecting to the gateway.
+ In browsers this may result in a dialog appearing
+ that requests a user to specify the client certificate.
+ The maximum depth of a certificate chain accepted in verification is Implementation specific.
+
+ Support: Core
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to
+ Kubernetes objects that contain TLS certificates of
+ the Certificate Authorities that can be used
+ as a trust anchor to validate the certificates presented by the client.
+
+ A single CA certificate reference to a Kubernetes ConfigMap
+ has "Core" support.
+ Implementations MAY choose to support attaching multiple CA certificates to
+ a Listener, but this behavior is implementation-specific.
+
+ Support: Core - A single reference to a Kubernetes ConfigMap
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific (More than one certificate in a ConfigMap
+ with different keys or more than one reference, or other kinds of resources).
+
+ References to a resource in a different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+ items:
+ description: |-
+ ObjectReference identifies an API object including its namespace.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When set to the empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent.
+ For example "ConfigMap" or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ mode:
+ default: AllowValidOnly
+ description: |-
+ FrontendValidationMode defines the mode for validating the client certificate.
+ There are two possible modes:
+
+ - AllowValidOnly: In this mode, the gateway will accept connections only if
+ the client presents a valid certificate. This certificate must successfully
+ pass validation against the CA certificates specified in `CACertificateRefs`.
+ - AllowInsecureFallback: In this mode, the gateway will accept connections
+ even if the client certificate is not presented or fails verification.
+
+ This approach delegates client authorization to the backend and introduce
+ a significant security risk. It should be used in testing environments or
+ on a temporary basis in non-testing environments.
+
+ Defaults to AllowValidOnly.
+
+ Support: Core
+ enum:
+ - AllowValidOnly
+ - AllowInsecureFallback
+ type: string
+ required:
+ - caCertificateRefs
+ type: object
+ type: object
+ required:
+ - port
+ - tls
+ type: object
+ maxItems: 64
+ type: array
+ x-kubernetes-list-map-keys:
+ - port
+ x-kubernetes-list-type: map
+ x-kubernetes-validations:
+ - message: Port for TLS configuration must be unique within
+ the Gateway
+ rule: self.all(t1, self.exists_one(t2, t1.port == t2.port))
+ required:
+ - default
+ type: object
+ type: object
required:
- gatewayClassName
- listeners
@@ -2318,6 +3260,7 @@ spec:
true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
conditions:
default:
- lastTransitionTime: "1970-01-01T00:00:00Z"
@@ -2531,6 +3474,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
required:
- attachedRoutes
- conditions
@@ -2595,7 +3539,7 @@ spec:
Addresses requested for this Gateway. This is optional and behavior can
depend on the implementation. If a value is set in the spec and the
requested address is invalid or unavailable, the implementation MUST
- indicate this in the associated entry in GatewayStatus.Addresses.
+ indicate this in an associated entry in GatewayStatus.Conditions.
The Addresses field represents a request for the address(es) on the
"outside of the Gateway", that traffic bound for this Gateway will use.
@@ -2650,19 +3594,22 @@ spec:
type: string
type: object
x-kubernetes-validations:
- - message: Hostname value must only contain valid characters (matching
- ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)
- rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):
+ - message: Hostname value must be empty or contain only valid characters
+ (matching ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)
+ rule: 'self.type == ''Hostname'' ? (!has(self.value) || self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$""")):
true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: IPAddress values must be unique
- rule: 'self.all(a1, a1.type == ''IPAddress'' ? self.exists_one(a2,
- a2.type == a1.type && a2.value == a1.value) : true )'
+ rule: 'self.all(a1, a1.type == ''IPAddress'' && has(a1.value) ?
+ self.exists_one(a2, a2.type == a1.type && has(a2.value) && a2.value
+ == a1.value) : true )'
- message: Hostname values must be unique
- rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2,
- a2.type == a1.type && a2.value == a1.value) : true )'
+ rule: 'self.all(a1, a1.type == ''Hostname'' && has(a1.value) ?
+ self.exists_one(a2, a2.type == a1.type && has(a2.value) && a2.value
+ == a1.value) : true )'
allowedListeners:
description: |-
AllowedListeners defines which ListenerSets can be attached to this Gateway.
@@ -2744,70 +3691,29 @@ spec:
x-kubernetes-map-type: atomic
type: object
type: object
- backendTLS:
+ defaultScope:
description: |-
- BackendTLS configures TLS settings for when this Gateway is connecting to
- backends with TLS.
+ DefaultScope, when set, configures the Gateway as a default Gateway,
+ meaning it will dynamically and implicitly have Routes (e.g. HTTPRoute)
+ attached to it, according to the scope configured here.
- Support: Core
- properties:
- clientCertificateRef:
- description: |-
- ClientCertificateRef is a reference to an object that contains a Client
- Certificate and the associated private key.
-
- References to a resource in different namespace are invalid UNLESS there
- is a ReferenceGrant in the target namespace that allows the certificate
- to be attached. If a ReferenceGrant does not allow this reference, the
- "ResolvedRefs" condition MUST be set to False for this listener with the
- "RefNotPermitted" reason.
-
- ClientCertificateRef can reference to standard Kubernetes resources, i.e.
- Secret, or implementation-specific custom resources.
-
- This setting can be overridden on the service level by use of BackendTLSPolicy.
-
- Support: Core
- properties:
- group:
- default: ""
- description: |-
- Group is the group of the referent. For example, "gateway.networking.k8s.io".
- When unspecified or empty string, core API group is inferred.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- kind:
- default: Secret
- description: Kind is kind of the referent. For example "Secret".
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the referent.
- maxLength: 253
- minLength: 1
- type: string
- namespace:
- description: |-
- Namespace is the namespace of the referenced object. When unspecified, the local
- namespace is inferred.
-
- Note that when a namespace different than the local namespace is specified,
- a ReferenceGrant object is required in the referent namespace to allow that
- namespace's owner to accept the reference. See the ReferenceGrant
- documentation for details.
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- required:
- - name
- type: object
- type: object
+ If unset (the default) or set to None, the Gateway will not act as a
+ default Gateway; if set, the Gateway will claim any Route with a
+ matching scope set in its UseDefaultGateway field, subject to the usual
+ rules about which routes the Gateway can attach to.
+
+ Think carefully before using this functionality! While the normal rules
+ about which Route can apply are still enforced, it is simply easier for
+ the wrong Route to be accidentally attached to this Gateway in this
+ configuration. If the Gateway operator is not also the operator in
+ control of the scope (e.g. namespace) with tight controls and checks on
+ what kind of workloads and Routes get added in that scope, we strongly
+ recommend not using this just because it seems convenient, and instead
+ stick to direct Route attachment.
+ enum:
+ - All
+ - None
+ type: string
gatewayClassName:
description: |-
GatewayClassName used for this Gateway. This is the name of a
@@ -3163,6 +4069,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
namespaces:
default:
from: Same
@@ -3330,7 +4237,7 @@ spec:
the Protocol field is "HTTPS" or "TLS". It is invalid to set this field
if the Protocol field is "HTTP", "TCP", or "UDP".
- The association of SNIs to Certificate defined in GatewayTLSConfig is
+ The association of SNIs to Certificate defined in ListenerTLSConfig is
defined based on the Hostname field for this listener.
The GatewayClass MUST use the longest matching SNI out of all
@@ -3417,93 +4324,7 @@ spec:
type: object
maxItems: 64
type: array
- frontendValidation:
- description: |-
- FrontendValidation holds configuration information for validating the frontend (client).
- Setting this field will require clients to send a client certificate
- required for validation during the TLS handshake. In browsers this may result in a dialog appearing
- that requests a user to specify the client certificate.
- The maximum depth of a certificate chain accepted in verification is Implementation specific.
-
- Support: Extended
- properties:
- caCertificateRefs:
- description: |-
- CACertificateRefs contains one or more references to
- Kubernetes objects that contain TLS certificates of
- the Certificate Authorities that can be used
- as a trust anchor to validate the certificates presented by the client.
-
- A single CA certificate reference to a Kubernetes ConfigMap
- has "Core" support.
- Implementations MAY choose to support attaching multiple CA certificates to
- a Listener, but this behavior is implementation-specific.
-
- Support: Core - A single reference to a Kubernetes ConfigMap
- with the CA certificate in a key named `ca.crt`.
-
- Support: Implementation-specific (More than one reference, or other kinds
- of resources).
-
- References to a resource in a different namespace are invalid UNLESS there
- is a ReferenceGrant in the target namespace that allows the certificate
- to be attached. If a ReferenceGrant does not allow this reference, the
- "ResolvedRefs" condition MUST be set to False for this listener with the
- "RefNotPermitted" reason.
- items:
- description: |-
- ObjectReference identifies an API object including its namespace.
-
- The API object must be valid in the cluster; the Group and Kind must
- be registered in the cluster for this reference to be valid.
-
- References to objects with invalid Group and Kind are not valid, and must
- be rejected by the implementation, with appropriate Conditions set
- on the containing object.
- properties:
- group:
- description: |-
- Group is the group of the referent. For example, "gateway.networking.k8s.io".
- When set to the empty string, core API group is inferred.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- kind:
- description: Kind is kind of the referent. For
- example "ConfigMap" or "Service".
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the referent.
- maxLength: 253
- minLength: 1
- type: string
- namespace:
- description: |-
- Namespace is the namespace of the referenced object. When unspecified, the local
- namespace is inferred.
-
- Note that when a namespace different than the local namespace is specified,
- a ReferenceGrant object is required in the referent namespace to allow that
- namespace's owner to accept the reference. See the ReferenceGrant
- documentation for details.
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- required:
- - group
- - kind
- - name
- type: object
- maxItems: 8
- minItems: 1
- type: array
- type: object
+ x-kubernetes-list-type: atomic
mode:
default: Terminate
description: |-
@@ -3582,6 +4403,366 @@ spec:
rule: 'self.all(l1, self.exists_one(l2, l1.port == l2.port && l1.protocol
== l2.protocol && (has(l1.hostname) && has(l2.hostname) ? l1.hostname
== l2.hostname : !has(l1.hostname) && !has(l2.hostname))))'
+ tls:
+ description: |-
+ TLS specifies frontend and backend tls configuration for entire gateway.
+
+ Support: Extended
+ properties:
+ backend:
+ description: |-
+ Backend describes TLS configuration for gateway when connecting
+ to backends.
+
+ Note that this contains only details for the Gateway as a TLS client,
+ and does _not_ imply behavior about how to choose which backend should
+ get a TLS connection. That is determined by the presence of a BackendTLSPolicy.
+
+ Support: Core
+ properties:
+ clientCertificateRef:
+ description: |-
+ ClientCertificateRef is a reference to an object that contains a Client
+ Certificate and the associated private key.
+
+ References to a resource in different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+
+ ClientCertificateRef can reference to standard Kubernetes resources, i.e.
+ Secret, or implementation-specific custom resources.
+
+ Support: Core
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Secret
+ description: Kind is kind of the referent. For example
+ "Secret".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - name
+ type: object
+ type: object
+ frontend:
+ description: |-
+ Frontend describes TLS config when client connects to Gateway.
+ Support: Core
+ properties:
+ default:
+ description: |-
+ Default specifies the default client certificate validation configuration
+ for all Listeners handling HTTPS traffic, unless a per-port configuration
+ is defined.
+
+ support: Core
+ properties:
+ validation:
+ description: |-
+ Validation holds configuration information for validating the frontend (client).
+ Setting this field will result in mutual authentication when connecting to the gateway.
+ In browsers this may result in a dialog appearing
+ that requests a user to specify the client certificate.
+ The maximum depth of a certificate chain accepted in verification is Implementation specific.
+
+ Support: Core
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to
+ Kubernetes objects that contain TLS certificates of
+ the Certificate Authorities that can be used
+ as a trust anchor to validate the certificates presented by the client.
+
+ A single CA certificate reference to a Kubernetes ConfigMap
+ has "Core" support.
+ Implementations MAY choose to support attaching multiple CA certificates to
+ a Listener, but this behavior is implementation-specific.
+
+ Support: Core - A single reference to a Kubernetes ConfigMap
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific (More than one certificate in a ConfigMap
+ with different keys or more than one reference, or other kinds of resources).
+
+ References to a resource in a different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+ items:
+ description: |-
+ ObjectReference identifies an API object including its namespace.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When set to the empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent. For
+ example "ConfigMap" or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ mode:
+ default: AllowValidOnly
+ description: |-
+ FrontendValidationMode defines the mode for validating the client certificate.
+ There are two possible modes:
+
+ - AllowValidOnly: In this mode, the gateway will accept connections only if
+ the client presents a valid certificate. This certificate must successfully
+ pass validation against the CA certificates specified in `CACertificateRefs`.
+ - AllowInsecureFallback: In this mode, the gateway will accept connections
+ even if the client certificate is not presented or fails verification.
+
+ This approach delegates client authorization to the backend and introduce
+ a significant security risk. It should be used in testing environments or
+ on a temporary basis in non-testing environments.
+
+ Defaults to AllowValidOnly.
+
+ Support: Core
+ enum:
+ - AllowValidOnly
+ - AllowInsecureFallback
+ type: string
+ required:
+ - caCertificateRefs
+ type: object
+ type: object
+ perPort:
+ description: |-
+ PerPort specifies tls configuration assigned per port.
+ Per port configuration is optional. Once set this configuration overrides
+ the default configuration for all Listeners handling HTTPS traffic
+ that match this port.
+ Each override port requires a unique TLS configuration.
+
+ support: Core
+ items:
+ properties:
+ port:
+ description: |-
+ The Port indicates the Port Number to which the TLS configuration will be
+ applied. This configuration will be applied to all Listeners handling HTTPS
+ traffic that match this port.
+
+ Support: Core
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ tls:
+ description: |-
+ TLS store the configuration that will be applied to all Listeners handling
+ HTTPS traffic and matching given port.
+
+ Support: Core
+ properties:
+ validation:
+ description: |-
+ Validation holds configuration information for validating the frontend (client).
+ Setting this field will result in mutual authentication when connecting to the gateway.
+ In browsers this may result in a dialog appearing
+ that requests a user to specify the client certificate.
+ The maximum depth of a certificate chain accepted in verification is Implementation specific.
+
+ Support: Core
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to
+ Kubernetes objects that contain TLS certificates of
+ the Certificate Authorities that can be used
+ as a trust anchor to validate the certificates presented by the client.
+
+ A single CA certificate reference to a Kubernetes ConfigMap
+ has "Core" support.
+ Implementations MAY choose to support attaching multiple CA certificates to
+ a Listener, but this behavior is implementation-specific.
+
+ Support: Core - A single reference to a Kubernetes ConfigMap
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific (More than one certificate in a ConfigMap
+ with different keys or more than one reference, or other kinds of resources).
+
+ References to a resource in a different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+ items:
+ description: |-
+ ObjectReference identifies an API object including its namespace.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When set to the empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent.
+ For example "ConfigMap" or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ mode:
+ default: AllowValidOnly
+ description: |-
+ FrontendValidationMode defines the mode for validating the client certificate.
+ There are two possible modes:
+
+ - AllowValidOnly: In this mode, the gateway will accept connections only if
+ the client presents a valid certificate. This certificate must successfully
+ pass validation against the CA certificates specified in `CACertificateRefs`.
+ - AllowInsecureFallback: In this mode, the gateway will accept connections
+ even if the client certificate is not presented or fails verification.
+
+ This approach delegates client authorization to the backend and introduce
+ a significant security risk. It should be used in testing environments or
+ on a temporary basis in non-testing environments.
+
+ Defaults to AllowValidOnly.
+
+ Support: Core
+ enum:
+ - AllowValidOnly
+ - AllowInsecureFallback
+ type: string
+ required:
+ - caCertificateRefs
+ type: object
+ type: object
+ required:
+ - port
+ - tls
+ type: object
+ maxItems: 64
+ type: array
+ x-kubernetes-list-map-keys:
+ - port
+ x-kubernetes-list-type: map
+ x-kubernetes-validations:
+ - message: Port for TLS configuration must be unique within
+ the Gateway
+ rule: self.all(t1, self.exists_one(t2, t1.port == t2.port))
+ required:
+ - default
+ type: object
+ type: object
required:
- gatewayClassName
- listeners
@@ -3656,6 +4837,7 @@ spec:
true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
conditions:
default:
- lastTransitionTime: "1970-01-01T00:00:00Z"
@@ -3869,6 +5051,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
required:
- attachedRoutes
- conditions
@@ -3903,9 +5086,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: grpcroutes.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -4051,6 +5233,7 @@ spec:
type: string
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
parentRefs:
description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
@@ -4263,6 +5446,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -4884,6 +6068,7 @@ spec:
rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: RequestHeaderModifier filter cannot be repeated
rule: self.filter(f, f.type == 'RequestHeaderModifier').size()
@@ -4980,6 +6165,7 @@ spec:
? has(self.port) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
filters:
description: |-
Filters define the filters that are applied to requests that match
@@ -5530,6 +6716,7 @@ spec:
rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: RequestHeaderModifier filter cannot be repeated
rule: self.filter(f, f.type == 'RequestHeaderModifier').size()
@@ -5707,6 +6894,7 @@ spec:
type: object
maxItems: 64
type: array
+ x-kubernetes-list-type: atomic
name:
description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
@@ -5808,6 +6996,7 @@ spec:
type: object
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: While 16 rules and 64 matches per rule are allowed, the
total number of matches across all rules in a route must be less
@@ -5832,6 +7021,24 @@ spec:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
type: object
status:
description: Status defines the current state of GRPCRoute.
@@ -6096,14 +7303,18 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
+ required:
+ - spec
type: object
served: true
storage: true
@@ -6124,9 +7335,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: httproutes.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -6252,6 +7462,7 @@ spec:
type: string
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
parentRefs:
description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
@@ -6464,6 +7675,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -6589,16 +7801,14 @@ spec:
AllowCredentials indicates whether the actual cross-origin request allows
to include credentials.
- The only valid value for the `Access-Control-Allow-Credentials` response
- header is true (case-sensitive).
+ When set to true, the gateway will include the `Access-Control-Allow-Credentials`
+ response header with value true (case-sensitive).
- If the credentials are not allowed in cross-origin requests, the gateway
- will omit the header `Access-Control-Allow-Credentials` entirely rather
- than setting its value to false.
+ When set to false or omitted the gateway will omit the header
+ `Access-Control-Allow-Credentials` entirely (this is the standard CORS
+ behavior).
Support: Extended
- enum:
- - true
type: boolean
allowHeaders:
description: |-
@@ -6625,9 +7835,9 @@ spec:
A wildcard indicates that the requests with all HTTP headers are allowed.
The `Access-Control-Allow-Headers` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowHeaders` field
+ When the `AllowCredentials` field is true and `AllowHeaders` field
specified with the `*` wildcard, the gateway must specify one or more
HTTP headers in the value of the `Access-Control-Allow-Headers` response
header. The value of the header `Access-Control-Allow-Headers` is same as
@@ -6688,9 +7898,9 @@ spec:
side.
The `Access-Control-Allow-Methods` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowMethods` field
+ When the `AllowCredentials` field is true and `AllowMethods` field
specified with the `*` wildcard, the gateway must specify one HTTP method
in the value of the Access-Control-Allow-Methods response header. The
value of the header `Access-Control-Allow-Methods` is same as the
@@ -6766,9 +7976,9 @@ spec:
Therefore, the client doesn't attempt the actual cross-origin request.
The `Access-Control-Allow-Origin` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowOrigins` field
+ When the `AllowCredentials` field is true and `AllowOrigins` field
specified with the `*` wildcard, the gateway must return a single origin
in the value of the `Access-Control-Allow-Origin` response header,
instead of specifying the `*` wildcard. The value of the header
@@ -6778,18 +7988,22 @@ spec:
Support: Extended
items:
description: |-
- The AbsoluteURI MUST NOT be a relative URI, and it MUST follow the URI syntax and
- encoding rules specified in RFC3986. The AbsoluteURI MUST include both a
- scheme (e.g., "http" or "spiffe") and a scheme-specific-part. URIs that
- include an authority MUST include a fully qualified domain name or
+ The CORSOrigin MUST NOT be a relative URI, and it MUST follow the URI syntax and
+ encoding rules specified in RFC3986. The CORSOrigin MUST include both a
+ scheme (e.g., "http" or "spiffe") and a scheme-specific-part, or it should be a single '*' character.
+ URIs that include an authority MUST include a fully qualified domain name or
IP address as the host.
maxLength: 253
minLength: 1
- pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?
+ pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$)
type: string
maxItems: 64
type: array
x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowOrigins cannot contain '*' alongside
+ other origins
+ rule: '!(''*'' in self && self.size() > 1)'
exposeHeaders:
description: |-
ExposeHeaders indicates which HTTP response headers can be exposed
@@ -6819,8 +8033,7 @@ spec:
A wildcard indicates that the responses with all HTTP headers are exposed
to clients. The `Access-Control-Expose-Headers` response header can only
- use `*` wildcard as value when the `AllowCredentials` field is
- unspecified.
+ use `*` wildcard as value when the `AllowCredentials` field is false or omitted.
Support: Extended
items:
@@ -6895,6 +8108,253 @@ spec:
- kind
- name
type: object
+ externalAuth:
+ description: |-
+ ExternalAuth configures settings related to sending request details
+ to an external auth service. The external service MUST authenticate
+ the request, and MAY authorize the request as well.
+
+ If there is any problem communicating with the external service,
+ this filter MUST fail closed.
+
+ Support: Extended
+ properties:
+ backendRef:
+ description: |-
+ BackendRef is a reference to a backend to send authorization
+ requests to.
+
+ The backend must speak the selected protocol (GRPC or HTTP) on the
+ referenced port.
+
+ If the backend service requires TLS, use BackendTLSPolicy to tell the
+ implementation to supply the TLS details to be used to connect to that
+ backend.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind
+ == ''Service'') ? has(self.port) : true'
+ forwardBody:
+ description: |-
+ ForwardBody controls if requests to the authorization server should include
+ the body of the client request; and if so, how big that body is allowed
+ to be.
+
+ It is expected that implementations will buffer the request body up to
+ `forwardBody.maxSize` bytes. Bodies over that size must be rejected with a
+ 4xx series error (413 or 403 are common examples), and fail processing
+ of the filter.
+
+ If unset, or `forwardBody.maxSize` is set to `0`, then the body will not
+ be forwarded.
+
+ Feature Name: HTTPRouteExternalAuthForwardBody
+ properties:
+ maxSize:
+ description: |-
+ MaxSize specifies how large in bytes the largest body that will be buffered
+ and sent to the authorization server. If the body size is larger than
+ `maxSize`, then the body sent to the authorization server must be
+ truncated to `maxSize` bytes.
+
+ Experimental note: This behavior needs to be checked against
+ various dataplanes; it may need to be changed.
+ See https://github.com/kubernetes-sigs/gateway-api/pull/4001#discussion_r2291405746
+ for more.
+
+ If 0, the body will not be sent to the authorization server.
+ type: integer
+ type: object
+ grpc:
+ description: |-
+ GRPCAuthConfig contains configuration for communication with ext_authz
+ protocol-speaking backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what headers from the client request
+ will be sent to the authorization server.
+
+ If this list is empty, then all headers must be sent.
+
+ If the list has entries, only those entries must be sent.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ type: object
+ http:
+ description: |-
+ HTTPAuthConfig contains configuration for communication with HTTP-speaking
+ backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what additional headers from the client request
+ will be sent to the authorization server.
+
+ The following headers must always be sent to the authorization server,
+ regardless of this setting:
+
+ * `Host`
+ * `Method`
+ * `Path`
+ * `Content-Length`
+ * `Authorization`
+
+ If this list is empty, then only those headers must be sent.
+
+ Note that `Content-Length` has a special behavior, in that the length
+ sent must be correct for the actual request to the external authorization
+ server - that is, it must reflect the actual number of bytes sent in the
+ body of the request to the authorization server.
+
+ So if the `forwardBody` stanza is unset, or `forwardBody.maxSize` is set
+ to `0`, then `Content-Length` must be `0`. If `forwardBody.maxSize` is set
+ to anything other than `0`, then the `Content-Length` of the authorization
+ request must be set to the actual number of bytes forwarded.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ allowedResponseHeaders:
+ description: |-
+ AllowedResponseHeaders specifies what headers from the authorization response
+ will be copied into the request to the backend.
+
+ If this list is empty, then all headers from the authorization server
+ except Authority or Host must be copied.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ path:
+ description: |-
+ Path sets the prefix that paths from the client request will have added
+ when forwarded to the authorization server.
+
+ When empty or unspecified, no prefix is added.
+
+ Valid values are the same as the "value" regex for path values in the `match`
+ stanza, and the validation regex will screen out invalid paths in the same way.
+ Even with the validation, implementations MUST sanitize this input before using it
+ directly.
+ maxLength: 1024
+ pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$
+ type: string
+ type: object
+ protocol:
+ description: |-
+ ExternalAuthProtocol describes which protocol to use when communicating with an
+ ext_authz authorization server.
+
+ When this is set to GRPC, each backend must use the Envoy ext_authz protocol
+ on the port specified in `backendRefs`. Requests and responses are defined
+ in the protobufs explained at:
+ https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto
+
+ When this is set to HTTP, each backend must respond with a `200` status
+ code in on a successful authorization. Any other code is considered
+ an authorization failure.
+
+ Feature Names:
+ GRPC Support - HTTPRouteExternalAuthGRPC
+ HTTP Support - HTTPRouteExternalAuthHTTP
+ enum:
+ - HTTP
+ - GRPC
+ type: string
+ required:
+ - backendRef
+ - protocol
+ type: object
+ x-kubernetes-validations:
+ - message: grpc must be specified when protocol
+ is set to 'GRPC'
+ rule: 'self.protocol == ''GRPC'' ? has(self.grpc)
+ : true'
+ - message: protocol must be 'GRPC' when grpc is
+ set
+ rule: 'has(self.grpc) ? self.protocol == ''GRPC''
+ : true'
+ - message: http must be specified when protocol
+ is set to 'HTTP'
+ rule: 'self.protocol == ''HTTP'' ? has(self.http)
+ : true'
+ - message: protocol must be 'HTTP' when http is
+ set
+ rule: 'has(self.http) ? self.protocol == ''HTTP''
+ : true'
requestHeaderModifier:
description: |-
RequestHeaderModifier defines a schema for a filter that modifies request
@@ -7508,6 +8968,7 @@ spec:
- URLRewrite
- ExtensionRef
- CORS
+ - ExternalAuth
type: string
urlRewrite:
description: |-
@@ -7645,13 +9106,16 @@ spec:
rule: '!(has(self.cors) && self.type != ''CORS'')'
- message: filter.cors must be specified for CORS filter.type
rule: '!(!has(self.cors) && self.type == ''CORS'')'
+ - message: filter.externalAuth must be nil if the filter.type
+ is not ExternalAuth
+ rule: '!(has(self.externalAuth) && self.type != ''ExternalAuth'')'
+ - message: filter.externalAuth must be specified for
+ ExternalAuth filter.type
+ rule: '!(!has(self.externalAuth) && self.type == ''ExternalAuth'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- - message: May specify either httpRouteFilterRequestRedirect
- or httpRouteFilterRequestRewrite, but not both
- rule: '!(self.exists(f, f.type == ''RequestRedirect'')
- && self.exists(f, f.type == ''URLRewrite''))'
- message: May specify either httpRouteFilterRequestRedirect
or httpRouteFilterRequestRewrite, but not both
rule: '!(self.exists(f, f.type == ''RequestRedirect'')
@@ -7757,6 +9221,7 @@ spec:
? has(self.port) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
filters:
description: |-
Filters define the filters that are applied to requests that match
@@ -7816,16 +9281,14 @@ spec:
AllowCredentials indicates whether the actual cross-origin request allows
to include credentials.
- The only valid value for the `Access-Control-Allow-Credentials` response
- header is true (case-sensitive).
+ When set to true, the gateway will include the `Access-Control-Allow-Credentials`
+ response header with value true (case-sensitive).
- If the credentials are not allowed in cross-origin requests, the gateway
- will omit the header `Access-Control-Allow-Credentials` entirely rather
- than setting its value to false.
+ When set to false or omitted the gateway will omit the header
+ `Access-Control-Allow-Credentials` entirely (this is the standard CORS
+ behavior).
Support: Extended
- enum:
- - true
type: boolean
allowHeaders:
description: |-
@@ -7852,9 +9315,9 @@ spec:
A wildcard indicates that the requests with all HTTP headers are allowed.
The `Access-Control-Allow-Headers` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowHeaders` field
+ When the `AllowCredentials` field is true and `AllowHeaders` field
specified with the `*` wildcard, the gateway must specify one or more
HTTP headers in the value of the `Access-Control-Allow-Headers` response
header. The value of the header `Access-Control-Allow-Headers` is same as
@@ -7915,9 +9378,9 @@ spec:
side.
The `Access-Control-Allow-Methods` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowMethods` field
+ When the `AllowCredentials` field is true and `AllowMethods` field
specified with the `*` wildcard, the gateway must specify one HTTP method
in the value of the Access-Control-Allow-Methods response header. The
value of the header `Access-Control-Allow-Methods` is same as the
@@ -7993,9 +9456,9 @@ spec:
Therefore, the client doesn't attempt the actual cross-origin request.
The `Access-Control-Allow-Origin` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowOrigins` field
+ When the `AllowCredentials` field is true and `AllowOrigins` field
specified with the `*` wildcard, the gateway must return a single origin
in the value of the `Access-Control-Allow-Origin` response header,
instead of specifying the `*` wildcard. The value of the header
@@ -8005,18 +9468,22 @@ spec:
Support: Extended
items:
description: |-
- The AbsoluteURI MUST NOT be a relative URI, and it MUST follow the URI syntax and
- encoding rules specified in RFC3986. The AbsoluteURI MUST include both a
- scheme (e.g., "http" or "spiffe") and a scheme-specific-part. URIs that
- include an authority MUST include a fully qualified domain name or
+ The CORSOrigin MUST NOT be a relative URI, and it MUST follow the URI syntax and
+ encoding rules specified in RFC3986. The CORSOrigin MUST include both a
+ scheme (e.g., "http" or "spiffe") and a scheme-specific-part, or it should be a single '*' character.
+ URIs that include an authority MUST include a fully qualified domain name or
IP address as the host.
maxLength: 253
minLength: 1
- pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?
+ pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$)
type: string
maxItems: 64
type: array
x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowOrigins cannot contain '*' alongside
+ other origins
+ rule: '!(''*'' in self && self.size() > 1)'
exposeHeaders:
description: |-
ExposeHeaders indicates which HTTP response headers can be exposed
@@ -8046,8 +9513,7 @@ spec:
A wildcard indicates that the responses with all HTTP headers are exposed
to clients. The `Access-Control-Expose-Headers` response header can only
- use `*` wildcard as value when the `AllowCredentials` field is
- unspecified.
+ use `*` wildcard as value when the `AllowCredentials` field is false or omitted.
Support: Extended
items:
@@ -8122,6 +9588,251 @@ spec:
- kind
- name
type: object
+ externalAuth:
+ description: |-
+ ExternalAuth configures settings related to sending request details
+ to an external auth service. The external service MUST authenticate
+ the request, and MAY authorize the request as well.
+
+ If there is any problem communicating with the external service,
+ this filter MUST fail closed.
+
+ Support: Extended
+ properties:
+ backendRef:
+ description: |-
+ BackendRef is a reference to a backend to send authorization
+ requests to.
+
+ The backend must speak the selected protocol (GRPC or HTTP) on the
+ referenced port.
+
+ If the backend service requires TLS, use BackendTLSPolicy to tell the
+ implementation to supply the TLS details to be used to connect to that
+ backend.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind == ''Service'')
+ ? has(self.port) : true'
+ forwardBody:
+ description: |-
+ ForwardBody controls if requests to the authorization server should include
+ the body of the client request; and if so, how big that body is allowed
+ to be.
+
+ It is expected that implementations will buffer the request body up to
+ `forwardBody.maxSize` bytes. Bodies over that size must be rejected with a
+ 4xx series error (413 or 403 are common examples), and fail processing
+ of the filter.
+
+ If unset, or `forwardBody.maxSize` is set to `0`, then the body will not
+ be forwarded.
+
+ Feature Name: HTTPRouteExternalAuthForwardBody
+ properties:
+ maxSize:
+ description: |-
+ MaxSize specifies how large in bytes the largest body that will be buffered
+ and sent to the authorization server. If the body size is larger than
+ `maxSize`, then the body sent to the authorization server must be
+ truncated to `maxSize` bytes.
+
+ Experimental note: This behavior needs to be checked against
+ various dataplanes; it may need to be changed.
+ See https://github.com/kubernetes-sigs/gateway-api/pull/4001#discussion_r2291405746
+ for more.
+
+ If 0, the body will not be sent to the authorization server.
+ type: integer
+ type: object
+ grpc:
+ description: |-
+ GRPCAuthConfig contains configuration for communication with ext_authz
+ protocol-speaking backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what headers from the client request
+ will be sent to the authorization server.
+
+ If this list is empty, then all headers must be sent.
+
+ If the list has entries, only those entries must be sent.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ type: object
+ http:
+ description: |-
+ HTTPAuthConfig contains configuration for communication with HTTP-speaking
+ backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what additional headers from the client request
+ will be sent to the authorization server.
+
+ The following headers must always be sent to the authorization server,
+ regardless of this setting:
+
+ * `Host`
+ * `Method`
+ * `Path`
+ * `Content-Length`
+ * `Authorization`
+
+ If this list is empty, then only those headers must be sent.
+
+ Note that `Content-Length` has a special behavior, in that the length
+ sent must be correct for the actual request to the external authorization
+ server - that is, it must reflect the actual number of bytes sent in the
+ body of the request to the authorization server.
+
+ So if the `forwardBody` stanza is unset, or `forwardBody.maxSize` is set
+ to `0`, then `Content-Length` must be `0`. If `forwardBody.maxSize` is set
+ to anything other than `0`, then the `Content-Length` of the authorization
+ request must be set to the actual number of bytes forwarded.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ allowedResponseHeaders:
+ description: |-
+ AllowedResponseHeaders specifies what headers from the authorization response
+ will be copied into the request to the backend.
+
+ If this list is empty, then all headers from the authorization server
+ except Authority or Host must be copied.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ path:
+ description: |-
+ Path sets the prefix that paths from the client request will have added
+ when forwarded to the authorization server.
+
+ When empty or unspecified, no prefix is added.
+
+ Valid values are the same as the "value" regex for path values in the `match`
+ stanza, and the validation regex will screen out invalid paths in the same way.
+ Even with the validation, implementations MUST sanitize this input before using it
+ directly.
+ maxLength: 1024
+ pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$
+ type: string
+ type: object
+ protocol:
+ description: |-
+ ExternalAuthProtocol describes which protocol to use when communicating with an
+ ext_authz authorization server.
+
+ When this is set to GRPC, each backend must use the Envoy ext_authz protocol
+ on the port specified in `backendRefs`. Requests and responses are defined
+ in the protobufs explained at:
+ https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto
+
+ When this is set to HTTP, each backend must respond with a `200` status
+ code in on a successful authorization. Any other code is considered
+ an authorization failure.
+
+ Feature Names:
+ GRPC Support - HTTPRouteExternalAuthGRPC
+ HTTP Support - HTTPRouteExternalAuthHTTP
+ enum:
+ - HTTP
+ - GRPC
+ type: string
+ required:
+ - backendRef
+ - protocol
+ type: object
+ x-kubernetes-validations:
+ - message: grpc must be specified when protocol is set
+ to 'GRPC'
+ rule: 'self.protocol == ''GRPC'' ? has(self.grpc) :
+ true'
+ - message: protocol must be 'GRPC' when grpc is set
+ rule: 'has(self.grpc) ? self.protocol == ''GRPC'' :
+ true'
+ - message: http must be specified when protocol is set
+ to 'HTTP'
+ rule: 'self.protocol == ''HTTP'' ? has(self.http) :
+ true'
+ - message: protocol must be 'HTTP' when http is set
+ rule: 'has(self.http) ? self.protocol == ''HTTP'' :
+ true'
requestHeaderModifier:
description: |-
RequestHeaderModifier defines a schema for a filter that modifies request
@@ -8731,6 +10442,7 @@ spec:
- URLRewrite
- ExtensionRef
- CORS
+ - ExternalAuth
type: string
urlRewrite:
description: |-
@@ -8865,8 +10577,15 @@ spec:
rule: '!(has(self.cors) && self.type != ''CORS'')'
- message: filter.cors must be specified for CORS filter.type
rule: '!(!has(self.cors) && self.type == ''CORS'')'
+ - message: filter.externalAuth must be nil if the filter.type
+ is not ExternalAuth
+ rule: '!(has(self.externalAuth) && self.type != ''ExternalAuth'')'
+ - message: filter.externalAuth must be specified for ExternalAuth
+ filter.type
+ rule: '!(!has(self.externalAuth) && self.type == ''ExternalAuth'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: May specify either httpRouteFilterRequestRedirect
or httpRouteFilterRequestRewrite, but not both
@@ -9178,6 +10897,7 @@ spec:
type: object
maxItems: 64
type: array
+ x-kubernetes-list-type: atomic
name:
description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
@@ -9273,6 +10993,7 @@ spec:
minimum: 400
type: integer
type: array
+ x-kubernetes-list-type: atomic
type: object
sessionPersistence:
description: |-
@@ -9468,6 +11189,7 @@ spec:
!= ''PathPrefix'') ? false : true) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: While 16 rules and 64 matches per rule are allowed, the
total number of matches across all rules in a route must be less
@@ -9486,6 +11208,24 @@ spec:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
type: object
status:
description: Status defines the current state of HTTPRoute.
@@ -9750,11 +11490,13 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -9878,6 +11620,7 @@ spec:
type: string
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
parentRefs:
description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
@@ -10090,6 +11833,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -10215,16 +11959,14 @@ spec:
AllowCredentials indicates whether the actual cross-origin request allows
to include credentials.
- The only valid value for the `Access-Control-Allow-Credentials` response
- header is true (case-sensitive).
+ When set to true, the gateway will include the `Access-Control-Allow-Credentials`
+ response header with value true (case-sensitive).
- If the credentials are not allowed in cross-origin requests, the gateway
- will omit the header `Access-Control-Allow-Credentials` entirely rather
- than setting its value to false.
+ When set to false or omitted the gateway will omit the header
+ `Access-Control-Allow-Credentials` entirely (this is the standard CORS
+ behavior).
Support: Extended
- enum:
- - true
type: boolean
allowHeaders:
description: |-
@@ -10251,9 +11993,9 @@ spec:
A wildcard indicates that the requests with all HTTP headers are allowed.
The `Access-Control-Allow-Headers` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowHeaders` field
+ When the `AllowCredentials` field is true and `AllowHeaders` field
specified with the `*` wildcard, the gateway must specify one or more
HTTP headers in the value of the `Access-Control-Allow-Headers` response
header. The value of the header `Access-Control-Allow-Headers` is same as
@@ -10314,9 +12056,9 @@ spec:
side.
The `Access-Control-Allow-Methods` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowMethods` field
+ When the `AllowCredentials` field is true and `AllowMethods` field
specified with the `*` wildcard, the gateway must specify one HTTP method
in the value of the Access-Control-Allow-Methods response header. The
value of the header `Access-Control-Allow-Methods` is same as the
@@ -10392,9 +12134,9 @@ spec:
Therefore, the client doesn't attempt the actual cross-origin request.
The `Access-Control-Allow-Origin` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowOrigins` field
+ When the `AllowCredentials` field is true and `AllowOrigins` field
specified with the `*` wildcard, the gateway must return a single origin
in the value of the `Access-Control-Allow-Origin` response header,
instead of specifying the `*` wildcard. The value of the header
@@ -10404,18 +12146,22 @@ spec:
Support: Extended
items:
description: |-
- The AbsoluteURI MUST NOT be a relative URI, and it MUST follow the URI syntax and
- encoding rules specified in RFC3986. The AbsoluteURI MUST include both a
- scheme (e.g., "http" or "spiffe") and a scheme-specific-part. URIs that
- include an authority MUST include a fully qualified domain name or
+ The CORSOrigin MUST NOT be a relative URI, and it MUST follow the URI syntax and
+ encoding rules specified in RFC3986. The CORSOrigin MUST include both a
+ scheme (e.g., "http" or "spiffe") and a scheme-specific-part, or it should be a single '*' character.
+ URIs that include an authority MUST include a fully qualified domain name or
IP address as the host.
maxLength: 253
minLength: 1
- pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?
+ pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$)
type: string
maxItems: 64
type: array
x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowOrigins cannot contain '*' alongside
+ other origins
+ rule: '!(''*'' in self && self.size() > 1)'
exposeHeaders:
description: |-
ExposeHeaders indicates which HTTP response headers can be exposed
@@ -10445,8 +12191,7 @@ spec:
A wildcard indicates that the responses with all HTTP headers are exposed
to clients. The `Access-Control-Expose-Headers` response header can only
- use `*` wildcard as value when the `AllowCredentials` field is
- unspecified.
+ use `*` wildcard as value when the `AllowCredentials` field is false or omitted.
Support: Extended
items:
@@ -10521,6 +12266,253 @@ spec:
- kind
- name
type: object
+ externalAuth:
+ description: |-
+ ExternalAuth configures settings related to sending request details
+ to an external auth service. The external service MUST authenticate
+ the request, and MAY authorize the request as well.
+
+ If there is any problem communicating with the external service,
+ this filter MUST fail closed.
+
+ Support: Extended
+ properties:
+ backendRef:
+ description: |-
+ BackendRef is a reference to a backend to send authorization
+ requests to.
+
+ The backend must speak the selected protocol (GRPC or HTTP) on the
+ referenced port.
+
+ If the backend service requires TLS, use BackendTLSPolicy to tell the
+ implementation to supply the TLS details to be used to connect to that
+ backend.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind
+ == ''Service'') ? has(self.port) : true'
+ forwardBody:
+ description: |-
+ ForwardBody controls if requests to the authorization server should include
+ the body of the client request; and if so, how big that body is allowed
+ to be.
+
+ It is expected that implementations will buffer the request body up to
+ `forwardBody.maxSize` bytes. Bodies over that size must be rejected with a
+ 4xx series error (413 or 403 are common examples), and fail processing
+ of the filter.
+
+ If unset, or `forwardBody.maxSize` is set to `0`, then the body will not
+ be forwarded.
+
+ Feature Name: HTTPRouteExternalAuthForwardBody
+ properties:
+ maxSize:
+ description: |-
+ MaxSize specifies how large in bytes the largest body that will be buffered
+ and sent to the authorization server. If the body size is larger than
+ `maxSize`, then the body sent to the authorization server must be
+ truncated to `maxSize` bytes.
+
+ Experimental note: This behavior needs to be checked against
+ various dataplanes; it may need to be changed.
+ See https://github.com/kubernetes-sigs/gateway-api/pull/4001#discussion_r2291405746
+ for more.
+
+ If 0, the body will not be sent to the authorization server.
+ type: integer
+ type: object
+ grpc:
+ description: |-
+ GRPCAuthConfig contains configuration for communication with ext_authz
+ protocol-speaking backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what headers from the client request
+ will be sent to the authorization server.
+
+ If this list is empty, then all headers must be sent.
+
+ If the list has entries, only those entries must be sent.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ type: object
+ http:
+ description: |-
+ HTTPAuthConfig contains configuration for communication with HTTP-speaking
+ backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what additional headers from the client request
+ will be sent to the authorization server.
+
+ The following headers must always be sent to the authorization server,
+ regardless of this setting:
+
+ * `Host`
+ * `Method`
+ * `Path`
+ * `Content-Length`
+ * `Authorization`
+
+ If this list is empty, then only those headers must be sent.
+
+ Note that `Content-Length` has a special behavior, in that the length
+ sent must be correct for the actual request to the external authorization
+ server - that is, it must reflect the actual number of bytes sent in the
+ body of the request to the authorization server.
+
+ So if the `forwardBody` stanza is unset, or `forwardBody.maxSize` is set
+ to `0`, then `Content-Length` must be `0`. If `forwardBody.maxSize` is set
+ to anything other than `0`, then the `Content-Length` of the authorization
+ request must be set to the actual number of bytes forwarded.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ allowedResponseHeaders:
+ description: |-
+ AllowedResponseHeaders specifies what headers from the authorization response
+ will be copied into the request to the backend.
+
+ If this list is empty, then all headers from the authorization server
+ except Authority or Host must be copied.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ path:
+ description: |-
+ Path sets the prefix that paths from the client request will have added
+ when forwarded to the authorization server.
+
+ When empty or unspecified, no prefix is added.
+
+ Valid values are the same as the "value" regex for path values in the `match`
+ stanza, and the validation regex will screen out invalid paths in the same way.
+ Even with the validation, implementations MUST sanitize this input before using it
+ directly.
+ maxLength: 1024
+ pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$
+ type: string
+ type: object
+ protocol:
+ description: |-
+ ExternalAuthProtocol describes which protocol to use when communicating with an
+ ext_authz authorization server.
+
+ When this is set to GRPC, each backend must use the Envoy ext_authz protocol
+ on the port specified in `backendRefs`. Requests and responses are defined
+ in the protobufs explained at:
+ https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto
+
+ When this is set to HTTP, each backend must respond with a `200` status
+ code in on a successful authorization. Any other code is considered
+ an authorization failure.
+
+ Feature Names:
+ GRPC Support - HTTPRouteExternalAuthGRPC
+ HTTP Support - HTTPRouteExternalAuthHTTP
+ enum:
+ - HTTP
+ - GRPC
+ type: string
+ required:
+ - backendRef
+ - protocol
+ type: object
+ x-kubernetes-validations:
+ - message: grpc must be specified when protocol
+ is set to 'GRPC'
+ rule: 'self.protocol == ''GRPC'' ? has(self.grpc)
+ : true'
+ - message: protocol must be 'GRPC' when grpc is
+ set
+ rule: 'has(self.grpc) ? self.protocol == ''GRPC''
+ : true'
+ - message: http must be specified when protocol
+ is set to 'HTTP'
+ rule: 'self.protocol == ''HTTP'' ? has(self.http)
+ : true'
+ - message: protocol must be 'HTTP' when http is
+ set
+ rule: 'has(self.http) ? self.protocol == ''HTTP''
+ : true'
requestHeaderModifier:
description: |-
RequestHeaderModifier defines a schema for a filter that modifies request
@@ -11134,6 +13126,7 @@ spec:
- URLRewrite
- ExtensionRef
- CORS
+ - ExternalAuth
type: string
urlRewrite:
description: |-
@@ -11271,13 +13264,16 @@ spec:
rule: '!(has(self.cors) && self.type != ''CORS'')'
- message: filter.cors must be specified for CORS filter.type
rule: '!(!has(self.cors) && self.type == ''CORS'')'
+ - message: filter.externalAuth must be nil if the filter.type
+ is not ExternalAuth
+ rule: '!(has(self.externalAuth) && self.type != ''ExternalAuth'')'
+ - message: filter.externalAuth must be specified for
+ ExternalAuth filter.type
+ rule: '!(!has(self.externalAuth) && self.type == ''ExternalAuth'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- - message: May specify either httpRouteFilterRequestRedirect
- or httpRouteFilterRequestRewrite, but not both
- rule: '!(self.exists(f, f.type == ''RequestRedirect'')
- && self.exists(f, f.type == ''URLRewrite''))'
- message: May specify either httpRouteFilterRequestRedirect
or httpRouteFilterRequestRewrite, but not both
rule: '!(self.exists(f, f.type == ''RequestRedirect'')
@@ -11383,6 +13379,7 @@ spec:
? has(self.port) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
filters:
description: |-
Filters define the filters that are applied to requests that match
@@ -11442,16 +13439,14 @@ spec:
AllowCredentials indicates whether the actual cross-origin request allows
to include credentials.
- The only valid value for the `Access-Control-Allow-Credentials` response
- header is true (case-sensitive).
+ When set to true, the gateway will include the `Access-Control-Allow-Credentials`
+ response header with value true (case-sensitive).
- If the credentials are not allowed in cross-origin requests, the gateway
- will omit the header `Access-Control-Allow-Credentials` entirely rather
- than setting its value to false.
+ When set to false or omitted the gateway will omit the header
+ `Access-Control-Allow-Credentials` entirely (this is the standard CORS
+ behavior).
Support: Extended
- enum:
- - true
type: boolean
allowHeaders:
description: |-
@@ -11478,9 +13473,9 @@ spec:
A wildcard indicates that the requests with all HTTP headers are allowed.
The `Access-Control-Allow-Headers` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowHeaders` field
+ When the `AllowCredentials` field is true and `AllowHeaders` field
specified with the `*` wildcard, the gateway must specify one or more
HTTP headers in the value of the `Access-Control-Allow-Headers` response
header. The value of the header `Access-Control-Allow-Headers` is same as
@@ -11541,9 +13536,9 @@ spec:
side.
The `Access-Control-Allow-Methods` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowMethods` field
+ When the `AllowCredentials` field is true and `AllowMethods` field
specified with the `*` wildcard, the gateway must specify one HTTP method
in the value of the Access-Control-Allow-Methods response header. The
value of the header `Access-Control-Allow-Methods` is same as the
@@ -11619,9 +13614,9 @@ spec:
Therefore, the client doesn't attempt the actual cross-origin request.
The `Access-Control-Allow-Origin` response header can only use `*`
- wildcard as value when the `AllowCredentials` field is unspecified.
+ wildcard as value when the `AllowCredentials` field is false or omitted.
- When the `AllowCredentials` field is specified and `AllowOrigins` field
+ When the `AllowCredentials` field is true and `AllowOrigins` field
specified with the `*` wildcard, the gateway must return a single origin
in the value of the `Access-Control-Allow-Origin` response header,
instead of specifying the `*` wildcard. The value of the header
@@ -11631,18 +13626,22 @@ spec:
Support: Extended
items:
description: |-
- The AbsoluteURI MUST NOT be a relative URI, and it MUST follow the URI syntax and
- encoding rules specified in RFC3986. The AbsoluteURI MUST include both a
- scheme (e.g., "http" or "spiffe") and a scheme-specific-part. URIs that
- include an authority MUST include a fully qualified domain name or
+ The CORSOrigin MUST NOT be a relative URI, and it MUST follow the URI syntax and
+ encoding rules specified in RFC3986. The CORSOrigin MUST include both a
+ scheme (e.g., "http" or "spiffe") and a scheme-specific-part, or it should be a single '*' character.
+ URIs that include an authority MUST include a fully qualified domain name or
IP address as the host.
maxLength: 253
minLength: 1
- pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?
+ pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$)
type: string
maxItems: 64
type: array
x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowOrigins cannot contain '*' alongside
+ other origins
+ rule: '!(''*'' in self && self.size() > 1)'
exposeHeaders:
description: |-
ExposeHeaders indicates which HTTP response headers can be exposed
@@ -11672,8 +13671,7 @@ spec:
A wildcard indicates that the responses with all HTTP headers are exposed
to clients. The `Access-Control-Expose-Headers` response header can only
- use `*` wildcard as value when the `AllowCredentials` field is
- unspecified.
+ use `*` wildcard as value when the `AllowCredentials` field is false or omitted.
Support: Extended
items:
@@ -11748,6 +13746,251 @@ spec:
- kind
- name
type: object
+ externalAuth:
+ description: |-
+ ExternalAuth configures settings related to sending request details
+ to an external auth service. The external service MUST authenticate
+ the request, and MAY authorize the request as well.
+
+ If there is any problem communicating with the external service,
+ this filter MUST fail closed.
+
+ Support: Extended
+ properties:
+ backendRef:
+ description: |-
+ BackendRef is a reference to a backend to send authorization
+ requests to.
+
+ The backend must speak the selected protocol (GRPC or HTTP) on the
+ referenced port.
+
+ If the backend service requires TLS, use BackendTLSPolicy to tell the
+ implementation to supply the TLS details to be used to connect to that
+ backend.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind == ''Service'')
+ ? has(self.port) : true'
+ forwardBody:
+ description: |-
+ ForwardBody controls if requests to the authorization server should include
+ the body of the client request; and if so, how big that body is allowed
+ to be.
+
+ It is expected that implementations will buffer the request body up to
+ `forwardBody.maxSize` bytes. Bodies over that size must be rejected with a
+ 4xx series error (413 or 403 are common examples), and fail processing
+ of the filter.
+
+ If unset, or `forwardBody.maxSize` is set to `0`, then the body will not
+ be forwarded.
+
+ Feature Name: HTTPRouteExternalAuthForwardBody
+ properties:
+ maxSize:
+ description: |-
+ MaxSize specifies how large in bytes the largest body that will be buffered
+ and sent to the authorization server. If the body size is larger than
+ `maxSize`, then the body sent to the authorization server must be
+ truncated to `maxSize` bytes.
+
+ Experimental note: This behavior needs to be checked against
+ various dataplanes; it may need to be changed.
+ See https://github.com/kubernetes-sigs/gateway-api/pull/4001#discussion_r2291405746
+ for more.
+
+ If 0, the body will not be sent to the authorization server.
+ type: integer
+ type: object
+ grpc:
+ description: |-
+ GRPCAuthConfig contains configuration for communication with ext_authz
+ protocol-speaking backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what headers from the client request
+ will be sent to the authorization server.
+
+ If this list is empty, then all headers must be sent.
+
+ If the list has entries, only those entries must be sent.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ type: object
+ http:
+ description: |-
+ HTTPAuthConfig contains configuration for communication with HTTP-speaking
+ backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what additional headers from the client request
+ will be sent to the authorization server.
+
+ The following headers must always be sent to the authorization server,
+ regardless of this setting:
+
+ * `Host`
+ * `Method`
+ * `Path`
+ * `Content-Length`
+ * `Authorization`
+
+ If this list is empty, then only those headers must be sent.
+
+ Note that `Content-Length` has a special behavior, in that the length
+ sent must be correct for the actual request to the external authorization
+ server - that is, it must reflect the actual number of bytes sent in the
+ body of the request to the authorization server.
+
+ So if the `forwardBody` stanza is unset, or `forwardBody.maxSize` is set
+ to `0`, then `Content-Length` must be `0`. If `forwardBody.maxSize` is set
+ to anything other than `0`, then the `Content-Length` of the authorization
+ request must be set to the actual number of bytes forwarded.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ allowedResponseHeaders:
+ description: |-
+ AllowedResponseHeaders specifies what headers from the authorization response
+ will be copied into the request to the backend.
+
+ If this list is empty, then all headers from the authorization server
+ except Authority or Host must be copied.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ path:
+ description: |-
+ Path sets the prefix that paths from the client request will have added
+ when forwarded to the authorization server.
+
+ When empty or unspecified, no prefix is added.
+
+ Valid values are the same as the "value" regex for path values in the `match`
+ stanza, and the validation regex will screen out invalid paths in the same way.
+ Even with the validation, implementations MUST sanitize this input before using it
+ directly.
+ maxLength: 1024
+ pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$
+ type: string
+ type: object
+ protocol:
+ description: |-
+ ExternalAuthProtocol describes which protocol to use when communicating with an
+ ext_authz authorization server.
+
+ When this is set to GRPC, each backend must use the Envoy ext_authz protocol
+ on the port specified in `backendRefs`. Requests and responses are defined
+ in the protobufs explained at:
+ https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto
+
+ When this is set to HTTP, each backend must respond with a `200` status
+ code in on a successful authorization. Any other code is considered
+ an authorization failure.
+
+ Feature Names:
+ GRPC Support - HTTPRouteExternalAuthGRPC
+ HTTP Support - HTTPRouteExternalAuthHTTP
+ enum:
+ - HTTP
+ - GRPC
+ type: string
+ required:
+ - backendRef
+ - protocol
+ type: object
+ x-kubernetes-validations:
+ - message: grpc must be specified when protocol is set
+ to 'GRPC'
+ rule: 'self.protocol == ''GRPC'' ? has(self.grpc) :
+ true'
+ - message: protocol must be 'GRPC' when grpc is set
+ rule: 'has(self.grpc) ? self.protocol == ''GRPC'' :
+ true'
+ - message: http must be specified when protocol is set
+ to 'HTTP'
+ rule: 'self.protocol == ''HTTP'' ? has(self.http) :
+ true'
+ - message: protocol must be 'HTTP' when http is set
+ rule: 'has(self.http) ? self.protocol == ''HTTP'' :
+ true'
requestHeaderModifier:
description: |-
RequestHeaderModifier defines a schema for a filter that modifies request
@@ -12357,6 +14600,7 @@ spec:
- URLRewrite
- ExtensionRef
- CORS
+ - ExternalAuth
type: string
urlRewrite:
description: |-
@@ -12491,8 +14735,15 @@ spec:
rule: '!(has(self.cors) && self.type != ''CORS'')'
- message: filter.cors must be specified for CORS filter.type
rule: '!(!has(self.cors) && self.type == ''CORS'')'
+ - message: filter.externalAuth must be nil if the filter.type
+ is not ExternalAuth
+ rule: '!(has(self.externalAuth) && self.type != ''ExternalAuth'')'
+ - message: filter.externalAuth must be specified for ExternalAuth
+ filter.type
+ rule: '!(!has(self.externalAuth) && self.type == ''ExternalAuth'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: May specify either httpRouteFilterRequestRedirect
or httpRouteFilterRequestRewrite, but not both
@@ -12804,6 +15055,7 @@ spec:
type: object
maxItems: 64
type: array
+ x-kubernetes-list-type: atomic
name:
description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
@@ -12899,6 +15151,7 @@ spec:
minimum: 400
type: integer
type: array
+ x-kubernetes-list-type: atomic
type: object
sessionPersistence:
description: |-
@@ -13094,6 +15347,7 @@ spec:
!= ''PathPrefix'') ? false : true) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: While 16 rules and 64 matches per rule are allowed, the
total number of matches across all rules in a route must be less
@@ -13112,6 +15366,24 @@ spec:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
type: object
status:
description: Status defines the current state of HTTPRoute.
@@ -13376,11 +15648,13 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -13406,9 +15680,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: referencegrants.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -13527,6 +15800,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
to:
description: |-
To describes the resources that may be referenced by the resources
@@ -13576,6 +15850,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
required:
- from
- to
@@ -13599,9 +15874,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: tcproutes.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -13858,6 +16132,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -14022,6 +16297,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
name:
description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
@@ -14031,14 +16307,35 @@ spec:
minLength: 1
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
+ required:
+ - backendRefs
type: object
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
required:
- rules
type: object
@@ -14305,11 +16602,13 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -14335,9 +16634,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: tlsroutes.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -14442,6 +16740,7 @@ spec:
type: string
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
parentRefs:
description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
@@ -14654,6 +16953,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -14821,6 +17121,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
name:
description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
@@ -14830,14 +17131,35 @@ spec:
minLength: 1
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
+ required:
+ - backendRefs
type: object
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
required:
- rules
type: object
@@ -15104,11 +17426,810 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
+ required:
+ - parents
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: false
+ subresources:
+ status: {}
+ - additionalPrinterColumns:
+ - jsonPath: .metadata.creationTimestamp
+ name: Age
+ type: date
+ name: v1alpha3
+ schema:
+ openAPIV3Schema:
+ description: |-
+ The TLSRoute resource is similar to TCPRoute, but can be configured
+ to match against TLS-specific metadata. This allows more flexibility
+ in matching streams for a given TLS listener.
+
+ If you need to forward traffic to a single target for a TLS listener, you
+ could choose to use a TCPRoute with a TLS listener.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: Spec defines the desired state of TLSRoute.
+ properties:
+ hostnames:
+ description: |-
+ Hostnames defines a set of SNI hostnames that should match against the
+ SNI attribute of TLS ClientHello message in TLS handshake. This matches
+ the RFC 1123 definition of a hostname with 2 notable exceptions:
+
+ 1. IPs are not allowed in SNI hostnames per RFC 6066.
+ 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard
+ label must appear by itself as the first label.
+
+ If a hostname is specified by both the Listener and TLSRoute, there
+ must be at least one intersecting hostname for the TLSRoute to be
+ attached to the Listener. For example:
+
+ * A Listener with `test.example.com` as the hostname matches TLSRoutes
+ that have specified at least one of `test.example.com` or
+ `*.example.com`.
+ * A Listener with `*.example.com` as the hostname matches TLSRoutes
+ that have specified at least one hostname that matches the Listener
+ hostname. For example, `test.example.com` and `*.example.com` would both
+ match. On the other hand, `example.com` and `test.example.net` would not
+ match.
+
+ If both the Listener and TLSRoute have specified hostnames, any
+ TLSRoute hostnames that do not match the Listener hostname MUST be
+ ignored. For example, if a Listener specified `*.example.com`, and the
+ TLSRoute specified `test.example.com` and `test.example.net`,
+ `test.example.net` must not be considered for a match.
+
+ If both the Listener and TLSRoute have specified hostnames, and none
+ match with the criteria above, then the TLSRoute is not accepted. The
+ implementation must raise an 'Accepted' Condition with a status of
+ `False` in the corresponding RouteParentStatus.
+
+ Support: Core
+ items:
+ description: |-
+ Hostname is the fully qualified domain name of a network host. This matches
+ the RFC 1123 definition of a hostname with 2 notable exceptions:
+
+ 1. IPs are not allowed.
+ 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard
+ label must appear by itself as the first label.
+
+ Hostname can be "precise" which is a domain name without the terminating
+ dot of a network host (e.g. "foo.example.com") or "wildcard", which is a
+ domain name prefixed with a single wildcard label (e.g. `*.example.com`).
+
+ Note that as per RFC1035 and RFC1123, a *label* must consist of lower case
+ alphanumeric characters or '-', and must start and end with an alphanumeric
+ character. No other punctuation is allowed.
+ maxLength: 253
+ minLength: 1
+ pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ maxItems: 16
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ parentRefs:
+ description: |-
+ ParentRefs references the resources (usually Gateways) that a Route wants
+ to be attached to. Note that the referenced parent resource needs to
+ allow this for the attachment to be complete. For Gateways, that means
+ the Gateway needs to allow attachment from Routes of this kind and
+ namespace. For Services, that means the Service must either be in the same
+ namespace for a "producer" route, or the mesh implementation must support
+ and allow "consumer" routes for the referenced Service. ReferenceGrant is
+ not applicable for governing ParentRefs to Services - it is not possible to
+ create a "producer" route for a Service in a different namespace from the
+ Route.
+
+ There are two kinds of parent resources with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ This API may be extended in the future to support additional kinds of parent
+ resources.
+
+ ParentRefs must be _distinct_. This means either that:
+
+ * They select different objects. If this is the case, then parentRef
+ entries are distinct. In terms of fields, this means that the
+ multi-part key defined by `group`, `kind`, `namespace`, and `name` must
+ be unique across all parentRef entries in the Route.
+ * They do not select different objects, but for each optional field used,
+ each ParentRef that selects the same object must set the same set of
+ optional fields to different values. If one ParentRef sets a
+ combination of optional fields, all must set the same combination.
+
+ Some examples:
+
+ * If one ParentRef sets `sectionName`, all ParentRefs referencing the
+ same object must also set `sectionName`.
+ * If one ParentRef sets `port`, all ParentRefs referencing the same
+ object must also set `port`.
+ * If one ParentRef sets `sectionName` and `port`, all ParentRefs
+ referencing the same object must also set `sectionName` and `port`.
+
+ It is possible to separately reference multiple distinct objects that may
+ be collapsed by an implementation. For example, some implementations may
+ choose to merge compatible Gateway Listeners together. If that is the
+ case, the list of routes attached to those resources should also be
+ merged.
+
+ Note that for ParentRefs that cross namespace boundaries, there are specific
+ rules. Cross-namespace references are only valid if they are explicitly
+ allowed by something in the namespace they are referring to. For example,
+ Gateway has the AllowedRoutes field, and ReferenceGrant provides a
+ generic way to enable other kinds of cross-namespace reference.
+
+
+ ParentRefs from a Route to a Service in the same namespace are "producer"
+ routes, which apply default routing rules to inbound connections from
+ any namespace to the Service.
+
+ ParentRefs from a Route to a Service in a different namespace are
+ "consumer" routes, and these routing rules are only applied to outbound
+ connections originating from the same namespace as the Route, for which
+ the intended destination of the connections are a Service targeted as a
+ ParentRef of the Route.
+ items:
+ description: |-
+ ParentReference identifies an API object (usually a Gateway) that can be considered
+ a parent of this resource (usually a route). There are two kinds of parent resources
+ with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ This API may be extended in the future to support additional kinds of parent
+ resources.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: |-
+ Group is the group of the referent.
+ When unspecified, "gateway.networking.k8s.io" is inferred.
+ To set the core API group (such as for a "Service" kind referent),
+ Group must be explicitly set to "" (empty string).
+
+ Support: Core
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Gateway
+ description: |-
+ Kind is kind of the referent.
+
+ There are two kinds of parent resources with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ Support for other resources is Implementation-Specific.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: |-
+ Name is the name of the referent.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent. When unspecified, this refers
+ to the local namespace of the Route.
+
+ Note that there are specific rules for ParentRefs which cross namespace
+ boundaries. Cross-namespace references are only valid if they are explicitly
+ allowed by something in the namespace they are referring to. For example:
+ Gateway has the AllowedRoutes field, and ReferenceGrant provides a
+ generic way to enable any other kind of cross-namespace reference.
+
+
+ ParentRefs from a Route to a Service in the same namespace are "producer"
+ routes, which apply default routing rules to inbound connections from
+ any namespace to the Service.
+
+ ParentRefs from a Route to a Service in a different namespace are
+ "consumer" routes, and these routing rules are only applied to outbound
+ connections originating from the same namespace as the Route, for which
+ the intended destination of the connections are a Service targeted as a
+ ParentRef of the Route.
+
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port is the network port this Route targets. It can be interpreted
+ differently based on the type of parent resource.
+
+ When the parent resource is a Gateway, this targets all listeners
+ listening on the specified port that also support this kind of Route(and
+ select this Route). It's not recommended to set `Port` unless the
+ networking behaviors specified in a Route must apply to a specific port
+ as opposed to a listener(s) whose port(s) may be changed. When both Port
+ and SectionName are specified, the name and port of the selected listener
+ must match both specified values.
+
+
+ When the parent resource is a Service, this targets a specific port in the
+ Service spec. When both Port (experimental) and SectionName are specified,
+ the name and port of the selected port must match both specified values.
+
+
+ Implementations MAY choose to support other parent resources.
+ Implementations supporting other types of parent resources MUST clearly
+ document how/if Port is interpreted.
+
+ For the purpose of status, an attachment is considered successful as
+ long as the parent resource accepts it partially. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
+ from the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route,
+ the Route MUST be considered detached from the Gateway.
+
+ Support: Extended
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ sectionName:
+ description: |-
+ SectionName is the name of a section within the target resource. In the
+ following resources, SectionName is interpreted as the following:
+
+ * Gateway: Listener name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+ * Service: Port name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+
+ Implementations MAY choose to support attaching Routes to other resources.
+ If that is the case, they MUST clearly document how SectionName is
+ interpreted.
+
+ When unspecified (empty string), this will reference the entire resource.
+ For the purpose of status, an attachment is considered successful if at
+ least one section in the parent resource accepts it. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
+ the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route, the
+ Route MUST be considered detached from the Gateway.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - name
+ type: object
+ maxItems: 32
+ type: array
+ x-kubernetes-list-type: atomic
+ x-kubernetes-validations:
+ - message: sectionName or port must be specified when parentRefs includes
+ 2 or more references to the same parent
+ rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)
+ || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__
+ == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&
+ p1.__namespace__ == p2.__namespace__)) ? ((!has(p1.sectionName)
+ || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName
+ == '''') && (!has(p1.port) || p1.port == 0) == (!has(p2.port)
+ || p2.port == 0)): true))'
+ - message: sectionName or port must be unique when parentRefs includes
+ 2 or more references to the same parent
+ rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)
+ || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__
+ == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&
+ p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)
+ || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName
+ == '')) || ( has(p1.sectionName) && has(p2.sectionName) && p1.sectionName
+ == p2.sectionName)) && (((!has(p1.port) || p1.port == 0) && (!has(p2.port)
+ || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port
+ == p2.port))))
+ rules:
+ description: Rules are a list of actions.
+ items:
+ description: TLSRouteRule is the configuration for a given rule.
+ properties:
+ backendRefs:
+ description: |-
+ BackendRefs defines the backend(s) where matching requests should be
+ sent. If unspecified or invalid (refers to a nonexistent resource or
+ a Service with no endpoints), the rule performs no forwarding; if no
+ filters are specified that would result in a response being sent, the
+ underlying implementation must actively reject request attempts to this
+ backend, by rejecting the connection or returning a 500 status code.
+ Request rejections must respect weight; if an invalid backend is
+ requested to have 80% of requests, then 80% of requests must be rejected
+ instead.
+
+ Support: Core for Kubernetes Service
+
+ Support: Extended for Kubernetes ServiceImport
+
+ Support: Implementation-specific for any other resource
+
+ Support for weight: Extended
+ items:
+ description: |-
+ BackendRef defines how a Route should forward a request to a Kubernetes
+ resource.
+
+ Note that when a namespace different than the local namespace is specified, a
+ ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+
+ When the BackendRef points to a Kubernetes Service, implementations SHOULD
+ honor the appProtocol field if it is set for the target Service Port.
+
+ Implementations supporting appProtocol SHOULD recognize the Kubernetes
+ Standard Application Protocols defined in KEP-3726.
+
+ If a Service appProtocol isn't specified, an implementation MAY infer the
+ backend protocol through its own means. Implementations MAY infer the
+ protocol from the Route type referring to the backend Service.
+
+ If a Route is not able to send traffic to the backend using the specified
+ protocol then the backend is considered invalid. Implementations MUST set the
+ "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.
+
+
+ Note that when the BackendTLSPolicy object is enabled by the implementation,
+ there are some extra rules about validity to consider here. See the fields
+ where this struct is used for more information about the exact behavior.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ weight:
+ default: 1
+ description: |-
+ Weight specifies the proportion of requests forwarded to the referenced
+ backend. This is computed as weight/(sum of all weights in this
+ BackendRefs list). For non-zero values, there may be some epsilon from
+ the exact proportion defined here depending on the precision an
+ implementation supports. Weight is not a percentage and the sum of
+ weights does not need to equal 100.
+
+ If only one backend is specified and it has a weight greater than 0, 100%
+ of the traffic is forwarded to that backend. If weight is set to 0, no
+ traffic should be forwarded for this entry. If unspecified, weight
+ defaults to 1.
+
+ Support for this field varies based on the context where used.
+ format: int32
+ maximum: 1000000
+ minimum: 0
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind == ''Service'')
+ ? has(self.port) : true'
+ maxItems: 16
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ name:
+ description: |-
+ Name is the name of the route rule. This name MUST be unique within a Route if it is set.
+
+ Support: Extended
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - backendRefs
+ type: object
+ maxItems: 1
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ x-kubernetes-validations:
+ - message: Rule name must be unique within the route
+ rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
+ && l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
+ required:
+ - hostnames
+ - rules
+ type: object
+ status:
+ description: Status defines the current state of TLSRoute.
+ properties:
+ parents:
+ description: |-
+ Parents is a list of parent resources (usually Gateways) that are
+ associated with the route, and the status of the route with respect to
+ each parent. When this route attaches to a parent, the controller that
+ manages the parent must add an entry to this list when the controller
+ first sees the route and should update the entry as appropriate when the
+ route or gateway is modified.
+
+ Note that parent references that cannot be resolved by an implementation
+ of this API will not be added to this list. Implementations of this API
+ can only populate Route status for the Gateways/parent resources they are
+ responsible for.
+
+ A maximum of 32 Gateways will be represented in this list. An empty list
+ means the route has not been attached to any Gateway.
+ items:
+ description: |-
+ RouteParentStatus describes the status of a route with respect to an
+ associated Parent.
+ properties:
+ conditions:
+ description: |-
+ Conditions describes the status of the route with respect to the Gateway.
+ Note that the route's availability is also subject to the Gateway's own
+ status conditions and listener status.
+
+ If the Route's ParentRef specifies an existing Gateway that supports
+ Routes of this kind AND that Gateway's controller has sufficient access,
+ then that Gateway's controller MUST set the "Accepted" condition on the
+ Route, to indicate whether the route has been accepted or rejected by the
+ Gateway, and why.
+
+ A Route MUST be considered "Accepted" if at least one of the Route's
+ rules is implemented by the Gateway.
+
+ There are a number of cases where the "Accepted" condition may not be set
+ due to lack of controller visibility, that includes when:
+
+ * The Route refers to a nonexistent parent.
+ * The Route is of a type that the controller does not support.
+ * The Route is in a namespace the controller does not have access to.
+ items:
+ description: Condition contains details for one aspect of
+ the current state of this API Resource.
+ properties:
+ lastTransitionTime:
+ description: |-
+ lastTransitionTime is the last time the condition transitioned from one status to another.
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
+ format: date-time
+ type: string
+ message:
+ description: |-
+ message is a human readable message indicating details about the transition.
+ This may be an empty string.
+ maxLength: 32768
+ type: string
+ observedGeneration:
+ description: |-
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+ with respect to the current state of the instance.
+ format: int64
+ minimum: 0
+ type: integer
+ reason:
+ description: |-
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
+ Producers of specific condition types may define expected values and meanings for this field,
+ and whether the values are considered a guaranteed API.
+ The value should be a CamelCase string.
+ This field may not be empty.
+ maxLength: 1024
+ minLength: 1
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+ type: string
+ status:
+ description: status of the condition, one of True, False,
+ Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
+ type: string
+ type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ maxLength: 316
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+ type: string
+ required:
+ - lastTransitionTime
+ - message
+ - reason
+ - status
+ - type
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-map-keys:
+ - type
+ x-kubernetes-list-type: map
+ controllerName:
+ description: |-
+ ControllerName is a domain/path string that indicates the name of the
+ controller that wrote this status. This corresponds with the
+ controllerName field on GatewayClass.
+
+ Example: "example.net/gateway-controller".
+
+ The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are
+ valid Kubernetes names
+ (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).
+
+ Controllers MUST populate this field when writing status. Controllers should ensure that
+ entries to status populated with their ControllerName are cleaned up when they are no
+ longer necessary.
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$
+ type: string
+ parentRef:
+ description: |-
+ ParentRef corresponds with a ParentRef in the spec that this
+ RouteParentStatus struct describes the status of.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: |-
+ Group is the group of the referent.
+ When unspecified, "gateway.networking.k8s.io" is inferred.
+ To set the core API group (such as for a "Service" kind referent),
+ Group must be explicitly set to "" (empty string).
+
+ Support: Core
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Gateway
+ description: |-
+ Kind is kind of the referent.
+
+ There are two kinds of parent resources with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ Support for other resources is Implementation-Specific.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: |-
+ Name is the name of the referent.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent. When unspecified, this refers
+ to the local namespace of the Route.
+
+ Note that there are specific rules for ParentRefs which cross namespace
+ boundaries. Cross-namespace references are only valid if they are explicitly
+ allowed by something in the namespace they are referring to. For example:
+ Gateway has the AllowedRoutes field, and ReferenceGrant provides a
+ generic way to enable any other kind of cross-namespace reference.
+
+
+ ParentRefs from a Route to a Service in the same namespace are "producer"
+ routes, which apply default routing rules to inbound connections from
+ any namespace to the Service.
+
+ ParentRefs from a Route to a Service in a different namespace are
+ "consumer" routes, and these routing rules are only applied to outbound
+ connections originating from the same namespace as the Route, for which
+ the intended destination of the connections are a Service targeted as a
+ ParentRef of the Route.
+
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port is the network port this Route targets. It can be interpreted
+ differently based on the type of parent resource.
+
+ When the parent resource is a Gateway, this targets all listeners
+ listening on the specified port that also support this kind of Route(and
+ select this Route). It's not recommended to set `Port` unless the
+ networking behaviors specified in a Route must apply to a specific port
+ as opposed to a listener(s) whose port(s) may be changed. When both Port
+ and SectionName are specified, the name and port of the selected listener
+ must match both specified values.
+
+
+ When the parent resource is a Service, this targets a specific port in the
+ Service spec. When both Port (experimental) and SectionName are specified,
+ the name and port of the selected port must match both specified values.
+
+
+ Implementations MAY choose to support other parent resources.
+ Implementations supporting other types of parent resources MUST clearly
+ document how/if Port is interpreted.
+
+ For the purpose of status, an attachment is considered successful as
+ long as the parent resource accepts it partially. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
+ from the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route,
+ the Route MUST be considered detached from the Gateway.
+
+ Support: Extended
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ sectionName:
+ description: |-
+ SectionName is the name of a section within the target resource. In the
+ following resources, SectionName is interpreted as the following:
+
+ * Gateway: Listener name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+ * Service: Port name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+
+ Implementations MAY choose to support attaching Routes to other resources.
+ If that is the case, they MUST clearly document how SectionName is
+ interpreted.
+
+ When unspecified (empty string), this will reference the entire resource.
+ For the purpose of status, an attachment is considered successful if at
+ least one section in the parent resource accepts it. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
+ the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route, the
+ Route MUST be considered detached from the Gateway.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - name
+ type: object
+ required:
+ - conditions
+ - controllerName
+ - parentRef
+ type: object
+ maxItems: 32
+ type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -15134,9 +18255,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: udproutes.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -15393,6 +18513,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -15557,6 +18678,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
name:
description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
@@ -15566,14 +18688,35 @@ spec:
minLength: 1
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
+ required:
+ - backendRefs
type: object
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
required:
- rules
type: object
@@ -15840,11 +18983,13 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -15870,9 +19015,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
labels:
gateway.networking.k8s.io/policy: Direct
name: xbackendtrafficpolicies.gateway.networking.x-k8s.io
@@ -16450,10 +19594,12 @@ spec:
type: string
required:
- ancestorRef
+ - conditions
- controllerName
type: object
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
required:
- ancestors
type: object
@@ -16479,9 +19625,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.3.0
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: xlistenersets.gateway.networking.x-k8s.io
spec:
group: gateway.networking.x-k8s.io
@@ -16510,8 +19655,33 @@ spec:
schema:
openAPIV3Schema:
description: |-
- XListenerSet defines a set of additional listeners
- to attach to an existing Gateway.
+ XListenerSet defines a set of additional listeners to attach to an existing Gateway.
+ This resource provides a mechanism to merge multiple listeners into a single Gateway.
+
+ The parent Gateway must explicitly allow ListenerSet attachment through its
+ AllowedListeners configuration. By default, Gateways do not allow ListenerSet
+ attachment.
+
+ Routes can attach to a ListenerSet by specifying it as a parentRef, and can
+ optionally target specific listeners using the sectionName field.
+
+ Policy Attachment:
+ - Policies that attach to a ListenerSet apply to all listeners defined in that resource
+ - Policies do not impact listeners in the parent Gateway
+ - Different ListenerSets attached to the same Gateway can have different policies
+ - If an implementation cannot apply a policy to specific listeners, it should reject the policy
+
+ ReferenceGrant Semantics:
+ - ReferenceGrants applied to a Gateway are not inherited by child ListenerSets
+ - ReferenceGrants applied to a ListenerSet do not grant permission to the parent Gateway's listeners
+ - A ListenerSet can reference secrets/backends in its own namespace without a ReferenceGrant
+
+ Gateway Integration:
+ - The parent Gateway's status will include an "AttachedListenerSets" condition
+ - This condition will be:
+ - True: when AllowedListeners is set and at least one child ListenerSet is attached
+ - False: when AllowedListeners is set but no valid listeners are attached, or when AllowedListeners is not set or false
+ - Unknown: when no AllowedListeners config is present
properties:
apiVersion:
description: |-
@@ -16549,10 +19719,10 @@ spec:
1. "parent" Gateway
2. ListenerSet ordered by creation time (oldest first)
- 3. ListenerSet ordered alphabetically by “{namespace}/{name}”.
+ 3. ListenerSet ordered alphabetically by "{namespace}/{name}".
An implementation MAY reject listeners by setting the ListenerEntryStatus
- `Accepted`` condition to False with the Reason `TooManyListeners`
+ `Accepted` condition to False with the Reason `TooManyListeners`
If a listener has a conflict, this will be reported in the
Status.ListenerEntryStatus setting the `Conflicted` condition to True.
@@ -16625,6 +19795,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
namespaces:
default:
from: Same
@@ -16747,12 +19918,18 @@ spec:
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
port:
+ default: 0
description: |-
Port is the network port. Multiple listeners may use the
same port, subject to the Listener compatibility rules.
+
+ If the port is not set or specified as zero, the implementation will assign
+ a unique port. If the implementation does not support dynamic port
+ assignment, it MUST set `Accepted` condition to `False` with the
+ `UnsupportedPort` reason.
format: int32
maximum: 65535
- minimum: 1
+ minimum: 0
type: integer
protocol:
description: Protocol specifies the network protocol this listener
@@ -16767,7 +19944,7 @@ spec:
the Protocol field is "HTTPS" or "TLS". It is invalid to set this field
if the Protocol field is "HTTP", "TCP", or "UDP".
- The association of SNIs to Certificate defined in GatewayTLSConfig is
+ The association of SNIs to Certificate defined in ListenerTLSConfig is
defined based on the Hostname field for this listener.
The GatewayClass MUST use the longest matching SNI out of all
@@ -16852,93 +20029,7 @@ spec:
type: object
maxItems: 64
type: array
- frontendValidation:
- description: |-
- FrontendValidation holds configuration information for validating the frontend (client).
- Setting this field will require clients to send a client certificate
- required for validation during the TLS handshake. In browsers this may result in a dialog appearing
- that requests a user to specify the client certificate.
- The maximum depth of a certificate chain accepted in verification is Implementation specific.
-
- Support: Extended
- properties:
- caCertificateRefs:
- description: |-
- CACertificateRefs contains one or more references to
- Kubernetes objects that contain TLS certificates of
- the Certificate Authorities that can be used
- as a trust anchor to validate the certificates presented by the client.
-
- A single CA certificate reference to a Kubernetes ConfigMap
- has "Core" support.
- Implementations MAY choose to support attaching multiple CA certificates to
- a Listener, but this behavior is implementation-specific.
-
- Support: Core - A single reference to a Kubernetes ConfigMap
- with the CA certificate in a key named `ca.crt`.
-
- Support: Implementation-specific (More than one reference, or other kinds
- of resources).
-
- References to a resource in a different namespace are invalid UNLESS there
- is a ReferenceGrant in the target namespace that allows the certificate
- to be attached. If a ReferenceGrant does not allow this reference, the
- "ResolvedRefs" condition MUST be set to False for this listener with the
- "RefNotPermitted" reason.
- items:
- description: |-
- ObjectReference identifies an API object including its namespace.
-
- The API object must be valid in the cluster; the Group and Kind must
- be registered in the cluster for this reference to be valid.
-
- References to objects with invalid Group and Kind are not valid, and must
- be rejected by the implementation, with appropriate Conditions set
- on the containing object.
- properties:
- group:
- description: |-
- Group is the group of the referent. For example, "gateway.networking.k8s.io".
- When set to the empty string, core API group is inferred.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- kind:
- description: Kind is kind of the referent. For
- example "ConfigMap" or "Service".
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the referent.
- maxLength: 253
- minLength: 1
- type: string
- namespace:
- description: |-
- Namespace is the namespace of the referenced object. When unspecified, the local
- namespace is inferred.
-
- Note that when a namespace different than the local namespace is specified,
- a ReferenceGrant object is required in the referent namespace to allow that
- namespace's owner to accept the reference. See the ReferenceGrant
- documentation for details.
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- required:
- - group
- - kind
- - name
- type: object
- maxItems: 8
- minItems: 1
- type: array
- type: object
+ x-kubernetes-list-type: atomic
mode:
default: Terminate
description: |-
@@ -16990,7 +20081,6 @@ spec:
> 0 || size(self.options) > 0 : true'
required:
- name
- - port
- protocol
type: object
maxItems: 64
@@ -17290,6 +20380,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
required:
- attachedRoutes
- conditions
@@ -17316,3 +20407,255 @@ status:
plural: ""
conditions: null
storedVersions: null
+---
+#
+# config/crd/experimental/gateway.networking.x-k8s.io_xmeshes.yaml
+#
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
+ gateway.networking.k8s.io/bundle-version: v1.4.0
+ gateway.networking.k8s.io/channel: experimental
+ name: xmeshes.gateway.networking.x-k8s.io
+spec:
+ group: gateway.networking.x-k8s.io
+ names:
+ categories:
+ - gateway-api
+ kind: XMesh
+ listKind: XMeshList
+ plural: xmeshes
+ shortNames:
+ - mesh
+ singular: xmesh
+ scope: Cluster
+ versions:
+ - additionalPrinterColumns:
+ - jsonPath: .status.conditions[?(@.type=="Accepted")].status
+ name: Accepted
+ type: string
+ - jsonPath: .metadata.creationTimestamp
+ name: Age
+ type: date
+ name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: XMesh defines mesh-wide characteristics of a GAMMA-compliant
+ service mesh.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: Spec defines the desired state of XMesh.
+ properties:
+ controllerName:
+ description: |-
+ ControllerName is the name of a controller that is managing Gateway API
+ resources for mesh traffic management. The value of this field MUST be a
+ domain prefixed path.
+
+ Example: "example.com/awesome-mesh".
+
+ This field is not mutable and cannot be empty.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$
+ type: string
+ x-kubernetes-validations:
+ - message: Value is immutable
+ rule: self == oldSelf
+ description:
+ description: Description optionally provides a human-readable description
+ of a Mesh.
+ maxLength: 64
+ type: string
+ parametersRef:
+ description: |-
+ ParametersRef is an optional reference to a resource that contains
+ implementation-specific configuration for this Mesh. If no
+ implementation-specific parameters are needed, this field MUST be
+ omitted.
+
+ ParametersRef can reference a standard Kubernetes resource, i.e.
+ ConfigMap, or an implementation-specific custom resource. The resource
+ can be cluster-scoped or namespace-scoped.
+
+ If the referent cannot be found, refers to an unsupported kind, or when
+ the data within that resource is malformed, the Mesh MUST be rejected
+ with the "Accepted" status condition set to "False" and an
+ "InvalidParameters" reason.
+
+ Support: Implementation-specific
+ properties:
+ group:
+ description: Group is the group of the referent.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent.
+ This field is required when referring to a Namespace-scoped resource and
+ MUST be unset when referring to a Cluster-scoped resource.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ required:
+ - controllerName
+ type: object
+ status:
+ default:
+ conditions:
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Accepted
+ description: Status defines the current state of XMesh.
+ properties:
+ conditions:
+ default:
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Accepted
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Programmed
+ description: |-
+ Conditions is the current status from the controller for
+ this Mesh.
+
+ Controllers should prefer to publish conditions using values
+ of MeshConditionType for the type of each Condition.
+ items:
+ description: Condition contains details for one aspect of the current
+ state of this API Resource.
+ properties:
+ lastTransitionTime:
+ description: |-
+ lastTransitionTime is the last time the condition transitioned from one status to another.
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
+ format: date-time
+ type: string
+ message:
+ description: |-
+ message is a human readable message indicating details about the transition.
+ This may be an empty string.
+ maxLength: 32768
+ type: string
+ observedGeneration:
+ description: |-
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+ with respect to the current state of the instance.
+ format: int64
+ minimum: 0
+ type: integer
+ reason:
+ description: |-
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
+ Producers of specific condition types may define expected values and meanings for this field,
+ and whether the values are considered a guaranteed API.
+ The value should be a CamelCase string.
+ This field may not be empty.
+ maxLength: 1024
+ minLength: 1
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+ type: string
+ status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
+ type: string
+ type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ maxLength: 316
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+ type: string
+ required:
+ - lastTransitionTime
+ - message
+ - reason
+ - status
+ - type
+ type: object
+ maxItems: 8
+ type: array
+ x-kubernetes-list-map-keys:
+ - type
+ x-kubernetes-list-type: map
+ supportedFeatures:
+ description: |-
+ SupportedFeatures is the set of features the Mesh support.
+ It MUST be sorted in ascending alphabetical order by the Name key.
+ items:
+ properties:
+ name:
+ description: |-
+ FeatureName is used to describe distinct features that are covered by
+ conformance tests.
+ type: string
+ required:
+ - name
+ type: object
+ maxItems: 64
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
+status:
+ acceptedNames:
+ kind: ""
+ plural: ""
+ conditions: null
+ storedVersions: null
diff --git a/integration/fixtures/k8s-conformance/01-rbac.yml b/integration/fixtures/gateway-api-conformance/01-rbac.yml
similarity index 100%
rename from integration/fixtures/k8s-conformance/01-rbac.yml
rename to integration/fixtures/gateway-api-conformance/01-rbac.yml
diff --git a/integration/fixtures/k8s-conformance/02-traefik.yml b/integration/fixtures/gateway-api-conformance/02-traefik.yml
similarity index 100%
rename from integration/fixtures/k8s-conformance/02-traefik.yml
rename to integration/fixtures/gateway-api-conformance/02-traefik.yml
diff --git a/integration/fixtures/k8s/00-experimental-v1.2.1.yml b/integration/fixtures/k8s/00-experimental-v1.4.0.yml
similarity index 68%
rename from integration/fixtures/k8s/00-experimental-v1.2.1.yml
rename to integration/fixtures/k8s/00-experimental-v1.4.0.yml
index 69b689846..b1e7bd2f2 100644
--- a/integration/fixtures/k8s/00-experimental-v1.2.1.yml
+++ b/integration/fixtures/k8s/00-experimental-v1.4.0.yml
@@ -1,4 +1,4 @@
-# Copyright 2024 The Kubernetes Authors.
+# Copyright 2025 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,507 +17,6 @@
#
---
#
-# config/crd/experimental/gateway.networking.k8s.io_backendlbpolicies.yaml
-#
-apiVersion: apiextensions.k8s.io/v1
-kind: CustomResourceDefinition
-metadata:
- annotations:
- api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
- gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
- labels:
- gateway.networking.k8s.io/policy: Direct
- name: backendlbpolicies.gateway.networking.k8s.io
-spec:
- group: gateway.networking.k8s.io
- names:
- categories:
- - gateway-api
- kind: BackendLBPolicy
- listKind: BackendLBPolicyList
- plural: backendlbpolicies
- shortNames:
- - blbpolicy
- singular: backendlbpolicy
- scope: Namespaced
- versions:
- - additionalPrinterColumns:
- - jsonPath: .metadata.creationTimestamp
- name: Age
- type: date
- name: v1alpha2
- schema:
- openAPIV3Schema:
- description: |-
- BackendLBPolicy provides a way to define load balancing rules
- for a backend.
- properties:
- apiVersion:
- description: |-
- APIVersion defines the versioned schema of this representation of an object.
- Servers should convert recognized schemas to the latest internal value, and
- may reject unrecognized values.
- More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
- type: string
- kind:
- description: |-
- Kind is a string value representing the REST resource this object represents.
- Servers may infer this from the endpoint the client submits requests to.
- Cannot be updated.
- In CamelCase.
- More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
- type: string
- metadata:
- type: object
- spec:
- description: Spec defines the desired state of BackendLBPolicy.
- properties:
- sessionPersistence:
- description: |-
- SessionPersistence defines and configures session persistence
- for the backend.
-
- Support: Extended
- properties:
- absoluteTimeout:
- description: |-
- AbsoluteTimeout defines the absolute timeout of the persistent
- session. Once the AbsoluteTimeout duration has elapsed, the
- session becomes invalid.
-
- Support: Extended
- pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
- type: string
- cookieConfig:
- description: |-
- CookieConfig provides configuration settings that are specific
- to cookie-based session persistence.
-
- Support: Core
- properties:
- lifetimeType:
- default: Session
- description: |-
- LifetimeType specifies whether the cookie has a permanent or
- session-based lifetime. A permanent cookie persists until its
- specified expiry time, defined by the Expires or Max-Age cookie
- attributes, while a session cookie is deleted when the current
- session ends.
-
- When set to "Permanent", AbsoluteTimeout indicates the
- cookie's lifetime via the Expires or Max-Age cookie attributes
- and is required.
-
- When set to "Session", AbsoluteTimeout indicates the
- absolute lifetime of the cookie tracked by the gateway and
- is optional.
-
- Support: Core for "Session" type
-
- Support: Extended for "Permanent" type
- enum:
- - Permanent
- - Session
- type: string
- type: object
- idleTimeout:
- description: |-
- IdleTimeout defines the idle timeout of the persistent session.
- Once the session has been idle for more than the specified
- IdleTimeout duration, the session becomes invalid.
-
- Support: Extended
- pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
- type: string
- sessionName:
- description: |-
- SessionName defines the name of the persistent session token
- which may be reflected in the cookie or the header. Users
- should avoid reusing session names to prevent unintended
- consequences, such as rejection or unpredictable behavior.
-
- Support: Implementation-specific
- maxLength: 128
- type: string
- type:
- default: Cookie
- description: |-
- Type defines the type of session persistence such as through
- the use a header or cookie. Defaults to cookie based session
- persistence.
-
- Support: Core for "Cookie" type
-
- Support: Extended for "Header" type
- enum:
- - Cookie
- - Header
- type: string
- type: object
- x-kubernetes-validations:
- - message: AbsoluteTimeout must be specified when cookie lifetimeType
- is Permanent
- rule: '!has(self.cookieConfig) || !has(self.cookieConfig.lifetimeType)
- || self.cookieConfig.lifetimeType != ''Permanent'' || has(self.absoluteTimeout)'
- targetRefs:
- description: |-
- TargetRef identifies an API object to apply policy to.
- Currently, Backends (i.e. Service, ServiceImport, or any
- implementation-specific backendRef) are the only valid API
- target references.
- items:
- description: |-
- LocalPolicyTargetReference identifies an API object to apply a direct or
- inherited policy to. This should be used as part of Policy resources
- that can target Gateway API resources. For more information on how this
- policy attachment model works, and a sample Policy resource, refer to
- the policy attachment documentation for Gateway API.
- properties:
- group:
- description: Group is the group of the target resource.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- kind:
- description: Kind is kind of the target resource.
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the target resource.
- maxLength: 253
- minLength: 1
- type: string
- required:
- - group
- - kind
- - name
- type: object
- maxItems: 16
- minItems: 1
- type: array
- x-kubernetes-list-map-keys:
- - group
- - kind
- - name
- x-kubernetes-list-type: map
- required:
- - targetRefs
- type: object
- status:
- description: Status defines the current state of BackendLBPolicy.
- properties:
- ancestors:
- description: |-
- Ancestors is a list of ancestor resources (usually Gateways) that are
- associated with the policy, and the status of the policy with respect to
- each ancestor. When this policy attaches to a parent, the controller that
- manages the parent and the ancestors MUST add an entry to this list when
- the controller first sees the policy and SHOULD update the entry as
- appropriate when the relevant ancestor is modified.
-
- Note that choosing the relevant ancestor is left to the Policy designers;
- an important part of Policy design is designing the right object level at
- which to namespace this status.
-
- Note also that implementations MUST ONLY populate ancestor status for
- the Ancestor resources they are responsible for. Implementations MUST
- use the ControllerName field to uniquely identify the entries in this list
- that they are responsible for.
-
- Note that to achieve this, the list of PolicyAncestorStatus structs
- MUST be treated as a map with a composite key, made up of the AncestorRef
- and ControllerName fields combined.
-
- A maximum of 16 ancestors will be represented in this list. An empty list
- means the Policy is not relevant for any ancestors.
-
- If this slice is full, implementations MUST NOT add further entries.
- Instead they MUST consider the policy unimplementable and signal that
- on any related resources such as the ancestor that would be referenced
- here. For example, if this list was full on BackendTLSPolicy, no
- additional Gateways would be able to reference the Service targeted by
- the BackendTLSPolicy.
- items:
- description: |-
- PolicyAncestorStatus describes the status of a route with respect to an
- associated Ancestor.
-
- Ancestors refer to objects that are either the Target of a policy or above it
- in terms of object hierarchy. For example, if a policy targets a Service, the
- Policy's Ancestors are, in order, the Service, the HTTPRoute, the Gateway, and
- the GatewayClass. Almost always, in this hierarchy, the Gateway will be the most
- useful object to place Policy status on, so we recommend that implementations
- SHOULD use Gateway as the PolicyAncestorStatus object unless the designers
- have a _very_ good reason otherwise.
-
- In the context of policy attachment, the Ancestor is used to distinguish which
- resource results in a distinct application of this policy. For example, if a policy
- targets a Service, it may have a distinct result per attached Gateway.
-
- Policies targeting the same resource may have different effects depending on the
- ancestors of those resources. For example, different Gateways targeting the same
- Service may have different capabilities, especially if they have different underlying
- implementations.
-
- For example, in BackendTLSPolicy, the Policy attaches to a Service that is
- used as a backend in a HTTPRoute that is itself attached to a Gateway.
- In this case, the relevant object for status is the Gateway, and that is the
- ancestor object referred to in this status.
-
- Note that a parent is also an ancestor, so for objects where the parent is the
- relevant object for status, this struct SHOULD still be used.
-
- This struct is intended to be used in a slice that's effectively a map,
- with a composite key made up of the AncestorRef and the ControllerName.
- properties:
- ancestorRef:
- description: |-
- AncestorRef corresponds with a ParentRef in the spec that this
- PolicyAncestorStatus struct describes the status of.
- properties:
- group:
- default: gateway.networking.k8s.io
- description: |-
- Group is the group of the referent.
- When unspecified, "gateway.networking.k8s.io" is inferred.
- To set the core API group (such as for a "Service" kind referent),
- Group must be explicitly set to "" (empty string).
-
- Support: Core
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- kind:
- default: Gateway
- description: |-
- Kind is kind of the referent.
-
- There are two kinds of parent resources with "Core" support:
-
- * Gateway (Gateway conformance profile)
- * Service (Mesh conformance profile, ClusterIP Services only)
-
- Support for other resources is Implementation-Specific.
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: |-
- Name is the name of the referent.
-
- Support: Core
- maxLength: 253
- minLength: 1
- type: string
- namespace:
- description: |-
- Namespace is the namespace of the referent. When unspecified, this refers
- to the local namespace of the Route.
-
- Note that there are specific rules for ParentRefs which cross namespace
- boundaries. Cross-namespace references are only valid if they are explicitly
- allowed by something in the namespace they are referring to. For example:
- Gateway has the AllowedRoutes field, and ReferenceGrant provides a
- generic way to enable any other kind of cross-namespace reference.
-
-
- ParentRefs from a Route to a Service in the same namespace are "producer"
- routes, which apply default routing rules to inbound connections from
- any namespace to the Service.
-
- ParentRefs from a Route to a Service in a different namespace are
- "consumer" routes, and these routing rules are only applied to outbound
- connections originating from the same namespace as the Route, for which
- the intended destination of the connections are a Service targeted as a
- ParentRef of the Route.
-
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- port:
- description: |-
- Port is the network port this Route targets. It can be interpreted
- differently based on the type of parent resource.
-
- When the parent resource is a Gateway, this targets all listeners
- listening on the specified port that also support this kind of Route(and
- select this Route). It's not recommended to set `Port` unless the
- networking behaviors specified in a Route must apply to a specific port
- as opposed to a listener(s) whose port(s) may be changed. When both Port
- and SectionName are specified, the name and port of the selected listener
- must match both specified values.
-
-
- When the parent resource is a Service, this targets a specific port in the
- Service spec. When both Port (experimental) and SectionName are specified,
- the name and port of the selected port must match both specified values.
-
-
- Implementations MAY choose to support other parent resources.
- Implementations supporting other types of parent resources MUST clearly
- document how/if Port is interpreted.
-
- For the purpose of status, an attachment is considered successful as
- long as the parent resource accepts it partially. For example, Gateway
- listeners can restrict which Routes can attach to them by Route kind,
- namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
- from the referencing Route, the Route MUST be considered successfully
- attached. If no Gateway listeners accept attachment from this Route,
- the Route MUST be considered detached from the Gateway.
-
- Support: Extended
- format: int32
- maximum: 65535
- minimum: 1
- type: integer
- sectionName:
- description: |-
- SectionName is the name of a section within the target resource. In the
- following resources, SectionName is interpreted as the following:
-
- * Gateway: Listener name. When both Port (experimental) and SectionName
- are specified, the name and port of the selected listener must match
- both specified values.
- * Service: Port name. When both Port (experimental) and SectionName
- are specified, the name and port of the selected listener must match
- both specified values.
-
- Implementations MAY choose to support attaching Routes to other resources.
- If that is the case, they MUST clearly document how SectionName is
- interpreted.
-
- When unspecified (empty string), this will reference the entire resource.
- For the purpose of status, an attachment is considered successful if at
- least one section in the parent resource accepts it. For example, Gateway
- listeners can restrict which Routes can attach to them by Route kind,
- namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
- the referencing Route, the Route MUST be considered successfully
- attached. If no Gateway listeners accept attachment from this Route, the
- Route MUST be considered detached from the Gateway.
-
- Support: Core
- maxLength: 253
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- required:
- - name
- type: object
- conditions:
- description: Conditions describes the status of the Policy with
- respect to the given Ancestor.
- items:
- description: Condition contains details for one aspect of
- the current state of this API Resource.
- properties:
- lastTransitionTime:
- description: |-
- lastTransitionTime is the last time the condition transitioned from one status to another.
- This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
- format: date-time
- type: string
- message:
- description: |-
- message is a human readable message indicating details about the transition.
- This may be an empty string.
- maxLength: 32768
- type: string
- observedGeneration:
- description: |-
- observedGeneration represents the .metadata.generation that the condition was set based upon.
- For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
- with respect to the current state of the instance.
- format: int64
- minimum: 0
- type: integer
- reason:
- description: |-
- reason contains a programmatic identifier indicating the reason for the condition's last transition.
- Producers of specific condition types may define expected values and meanings for this field,
- and whether the values are considered a guaranteed API.
- The value should be a CamelCase string.
- This field may not be empty.
- maxLength: 1024
- minLength: 1
- pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
- type: string
- status:
- description: status of the condition, one of True, False,
- Unknown.
- enum:
- - "True"
- - "False"
- - Unknown
- type: string
- type:
- description: type of condition in CamelCase or in foo.example.com/CamelCase.
- maxLength: 316
- pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
- type: string
- required:
- - lastTransitionTime
- - message
- - reason
- - status
- - type
- type: object
- maxItems: 8
- minItems: 1
- type: array
- x-kubernetes-list-map-keys:
- - type
- x-kubernetes-list-type: map
- controllerName:
- description: |-
- ControllerName is a domain/path string that indicates the name of the
- controller that wrote this status. This corresponds with the
- controllerName field on GatewayClass.
-
- Example: "example.net/gateway-controller".
-
- The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are
- valid Kubernetes names
- (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).
-
- Controllers MUST populate this field when writing status. Controllers should ensure that
- entries to status populated with their ControllerName are cleaned up when they are no
- longer necessary.
- maxLength: 253
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$
- type: string
- required:
- - ancestorRef
- - controllerName
- type: object
- maxItems: 16
- type: array
- required:
- - ancestors
- type: object
- required:
- - spec
- type: object
- served: true
- storage: true
- subresources:
- status: {}
-status:
- acceptedNames:
- kind: ""
- plural: ""
- conditions: null
- storedVersions: null
----
-#
# config/crd/experimental/gateway.networking.k8s.io_backendtlspolicies.yaml
#
apiVersion: apiextensions.k8s.io/v1
@@ -525,9 +24,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
labels:
gateway.networking.k8s.io/policy: Direct
name: backendtlspolicies.gateway.networking.k8s.io
@@ -548,7 +46,7 @@ spec:
- jsonPath: .metadata.creationTimestamp
name: Age
type: date
- name: v1alpha3
+ name: v1
schema:
openAPIV3Schema:
description: |-
@@ -607,6 +105,30 @@ spec:
by default, but this default may change in the future to provide
a more granular application of the policy.
+ TargetRefs must be _distinct_. This means either that:
+
+ * They select different targets. If this is the case, then targetRef
+ entries are distinct. In terms of fields, this means that the
+ multi-part key defined by `group`, `kind`, and `name` must
+ be unique across all targetRef entries in the BackendTLSPolicy.
+ * They select different sectionNames in the same target.
+
+ When more than one BackendTLSPolicy selects the same target and
+ sectionName, implementations MUST determine precedence using the
+ following criteria, continuing on ties:
+
+ * The older policy by creation timestamp takes precedence. For
+ example, a policy with a creation timestamp of "2021-07-15
+ 01:02:03" MUST be given precedence over a policy with a
+ creation timestamp of "2021-07-15 01:02:04".
+ * The policy appearing first in alphabetical order by {name}.
+ For example, a policy named `bar` is given precedence over a
+ policy named `baz`.
+
+ For any BackendTLSPolicy that does not take precedence, the
+ implementation MUST ensure the `Accepted` Condition is set to
+ `status: False`, with Reason `Conflicted`.
+
Support: Extended for Kubernetes Service
Support: Implementation-specific for any other resource
@@ -663,6 +185,21 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
+ x-kubernetes-validations:
+ - message: sectionName must be specified when targetRefs includes
+ 2 or more references to the same target
+ rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name ? ((!has(p1.sectionName) || p1.sectionName
+ == '''') == (!has(p2.sectionName) || p2.sectionName == ''''))
+ : true))'
+ - message: sectionName must be unique when targetRefs includes 2 or
+ more references to the same target
+ rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name && (((!has(p1.sectionName) ||
+ p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName
+ == '')) || (has(p1.sectionName) && has(p2.sectionName) && p1.sectionName
+ == p2.sectionName))))
validation:
description: Validation contains backend TLS validation configuration.
properties:
@@ -674,11 +211,34 @@ spec:
If CACertificateRefs is empty or unspecified, then WellKnownCACertificates must be
specified. Only one of CACertificateRefs or WellKnownCACertificates may be specified,
- not both. If CACertifcateRefs is empty or unspecified, the configuration for
+ not both. If CACertificateRefs is empty or unspecified, the configuration for
WellKnownCACertificates MUST be honored instead if supported by the implementation.
- References to a resource in a different namespace are invalid for the
- moment, although we will revisit this in the future.
+ A CACertificateRef is invalid if:
+
+ * It refers to a resource that cannot be resolved (e.g., the referenced resource
+ does not exist) or is misconfigured (e.g., a ConfigMap does not contain a key
+ named `ca.crt`). In this case, the Reason must be set to `InvalidCACertificateRef`
+ and the Message of the Condition must indicate which reference is invalid and why.
+
+ * It refers to an unknown or unsupported kind of resource. In this case, the Reason
+ must be set to `InvalidKind` and the Message of the Condition must explain which
+ kind of resource is unknown or unsupported.
+
+ * It refers to a resource in another namespace. This may change in future
+ spec updates.
+
+ Implementations MAY choose to perform further validation of the certificate
+ content (e.g., checking expiry or enforcing specific formats). In such cases,
+ an implementation-specific Reason and Message must be set for the invalid reference.
+
+ In all cases, the implementation MUST ensure the `ResolvedRefs` Condition on
+ the BackendTLSPolicy is set to `status: False`, with a Reason and Message
+ that indicate the cause of the error. Connections using an invalid
+ CACertificateRef MUST fail, and the client MUST receive an HTTP 5xx error
+ response. If ALL CACertificateRefs are invalid, the implementation MUST also
+ ensure the `Accepted` Condition on the BackendTLSPolicy is set to
+ `status: False`, with a Reason `NoValidCACertificate`.
A single CACertificateRef to a Kubernetes ConfigMap kind has "Core" support.
Implementations MAY choose to support attaching multiple certificates to
@@ -687,8 +247,8 @@ spec:
Support: Core - An optional single reference to a Kubernetes ConfigMap,
with the CA certificate in a key named `ca.crt`.
- Support: Implementation-specific (More than one reference, or other kinds
- of resources).
+ Support: Implementation-specific - More than one reference, other kinds
+ of resources, or a single reference that includes multiple certificates.
items:
description: |-
LocalObjectReference identifies an API object within the namespace of the
@@ -726,15 +286,18 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
hostname:
description: |-
Hostname is used for two purposes in the connection between Gateways and
backends:
1. Hostname MUST be used as the SNI to connect to the backend (RFC 6066).
- 2. If SubjectAltNames is not specified, Hostname MUST be used for
- authentication and MUST match the certificate served by the matching
- backend.
+ 2. Hostname MUST be used for authentication and MUST match the certificate
+ served by the matching backend, unless SubjectAltNames is specified.
+ 3. If SubjectAltNames are specified, Hostname can be used for certificate selection
+ but MUST NOT be used for authentication. If you want to use the value
+ of the Hostname field for authentication, you MUST add it to the SubjectAltNames list.
Support: Core
maxLength: 253
@@ -744,10 +307,10 @@ spec:
subjectAltNames:
description: |-
SubjectAltNames contains one or more Subject Alternative Names.
- When specified, the certificate served from the backend MUST have at least one
- Subject Alternate Name matching one of the specified SubjectAltNames.
+ When specified the certificate served from the backend MUST
+ have at least one Subject Alternate Name matching one of the specified SubjectAltNames.
- Support: Core
+ Support: Extended
items:
description: SubjectAltName represents Subject Alternative Name.
properties:
@@ -804,6 +367,7 @@ spec:
"")'
maxItems: 5
type: array
+ x-kubernetes-list-type: atomic
wellKnownCACertificates:
description: |-
WellKnownCACertificates specifies whether system CA certificates may be used in
@@ -811,10 +375,11 @@ spec:
If WellKnownCACertificates is unspecified or empty (""), then CACertificateRefs
must be specified with at least one entry for a valid configuration. Only one of
- CACertificateRefs or WellKnownCACertificates may be specified, not both. If an
- implementation does not support the WellKnownCACertificates field or the value
- supplied is not supported, the Status Conditions on the Policy MUST be
- updated to include an Accepted: False Condition with Reason: Invalid.
+ CACertificateRefs or WellKnownCACertificates may be specified, not both.
+ If an implementation does not support the WellKnownCACertificates field, or
+ the supplied value is not recognized, the implementation MUST ensure the
+ `Accepted` Condition on the BackendTLSPolicy is set to `status: False`, with
+ a Reason `Invalid`.
Support: Implementation-specific
enum:
@@ -1125,10 +690,12 @@ spec:
type: string
required:
- ancestorRef
+ - conditions
- controllerName
type: object
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
required:
- ancestors
type: object
@@ -1139,6 +706,667 @@ spec:
storage: true
subresources:
status: {}
+ - deprecated: true
+ deprecationWarning: The v1alpha3 version of BackendTLSPolicy has been deprecated
+ and will be removed in a future release of the API. Please upgrade to v1.
+ name: v1alpha3
+ schema:
+ openAPIV3Schema:
+ description: |-
+ BackendTLSPolicy provides a way to configure how a Gateway
+ connects to a Backend via TLS.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: Spec defines the desired state of BackendTLSPolicy.
+ properties:
+ options:
+ additionalProperties:
+ description: |-
+ AnnotationValue is the value of an annotation in Gateway API. This is used
+ for validation of maps such as TLS options. This roughly matches Kubernetes
+ annotation validation, although the length validation in that case is based
+ on the entire size of the annotations struct.
+ maxLength: 4096
+ minLength: 0
+ type: string
+ description: |-
+ Options are a list of key/value pairs to enable extended TLS
+ configuration for each implementation. For example, configuring the
+ minimum TLS version or supported cipher suites.
+
+ A set of common keys MAY be defined by the API in the future. To avoid
+ any ambiguity, implementation-specific definitions MUST use
+ domain-prefixed names, such as `example.com/my-custom-option`.
+ Un-prefixed names are reserved for key names defined by Gateway API.
+
+ Support: Implementation-specific
+ maxProperties: 16
+ type: object
+ targetRefs:
+ description: |-
+ TargetRefs identifies an API object to apply the policy to.
+ Only Services have Extended support. Implementations MAY support
+ additional objects, with Implementation Specific support.
+ Note that this config applies to the entire referenced resource
+ by default, but this default may change in the future to provide
+ a more granular application of the policy.
+
+ TargetRefs must be _distinct_. This means either that:
+
+ * They select different targets. If this is the case, then targetRef
+ entries are distinct. In terms of fields, this means that the
+ multi-part key defined by `group`, `kind`, and `name` must
+ be unique across all targetRef entries in the BackendTLSPolicy.
+ * They select different sectionNames in the same target.
+
+ When more than one BackendTLSPolicy selects the same target and
+ sectionName, implementations MUST determine precedence using the
+ following criteria, continuing on ties:
+
+ * The older policy by creation timestamp takes precedence. For
+ example, a policy with a creation timestamp of "2021-07-15
+ 01:02:03" MUST be given precedence over a policy with a
+ creation timestamp of "2021-07-15 01:02:04".
+ * The policy appearing first in alphabetical order by {name}.
+ For example, a policy named `bar` is given precedence over a
+ policy named `baz`.
+
+ For any BackendTLSPolicy that does not take precedence, the
+ implementation MUST ensure the `Accepted` Condition is set to
+ `status: False`, with Reason `Conflicted`.
+
+ Support: Extended for Kubernetes Service
+
+ Support: Implementation-specific for any other resource
+ items:
+ description: |-
+ LocalPolicyTargetReferenceWithSectionName identifies an API object to apply a
+ direct policy to. This should be used as part of Policy resources that can
+ target single resources. For more information on how this policy attachment
+ mode works, and a sample Policy resource, refer to the policy attachment
+ documentation for Gateway API.
+
+ Note: This should only be used for direct policy attachment when references
+ to SectionName are actually needed. In all other cases,
+ LocalPolicyTargetReference should be used.
+ properties:
+ group:
+ description: Group is the group of the target resource.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the target resource.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the target resource.
+ maxLength: 253
+ minLength: 1
+ type: string
+ sectionName:
+ description: |-
+ SectionName is the name of a section within the target resource. When
+ unspecified, this targetRef targets the entire resource. In the following
+ resources, SectionName is interpreted as the following:
+
+ * Gateway: Listener name
+ * HTTPRoute: HTTPRouteRule name
+ * Service: Port name
+
+ If a SectionName is specified, but does not exist on the targeted object,
+ the Policy must fail to attach, and the policy implementation should record
+ a `ResolvedRefs` or similar Condition in the Policy's status.
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 16
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ x-kubernetes-validations:
+ - message: sectionName must be specified when targetRefs includes
+ 2 or more references to the same target
+ rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name ? ((!has(p1.sectionName) || p1.sectionName
+ == '''') == (!has(p2.sectionName) || p2.sectionName == ''''))
+ : true))'
+ - message: sectionName must be unique when targetRefs includes 2 or
+ more references to the same target
+ rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name && (((!has(p1.sectionName) ||
+ p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName
+ == '')) || (has(p1.sectionName) && has(p2.sectionName) && p1.sectionName
+ == p2.sectionName))))
+ validation:
+ description: Validation contains backend TLS validation configuration.
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to Kubernetes objects that
+ contain a PEM-encoded TLS CA certificate bundle, which is used to
+ validate a TLS handshake between the Gateway and backend Pod.
+
+ If CACertificateRefs is empty or unspecified, then WellKnownCACertificates must be
+ specified. Only one of CACertificateRefs or WellKnownCACertificates may be specified,
+ not both. If CACertificateRefs is empty or unspecified, the configuration for
+ WellKnownCACertificates MUST be honored instead if supported by the implementation.
+
+ A CACertificateRef is invalid if:
+
+ * It refers to a resource that cannot be resolved (e.g., the referenced resource
+ does not exist) or is misconfigured (e.g., a ConfigMap does not contain a key
+ named `ca.crt`). In this case, the Reason must be set to `InvalidCACertificateRef`
+ and the Message of the Condition must indicate which reference is invalid and why.
+
+ * It refers to an unknown or unsupported kind of resource. In this case, the Reason
+ must be set to `InvalidKind` and the Message of the Condition must explain which
+ kind of resource is unknown or unsupported.
+
+ * It refers to a resource in another namespace. This may change in future
+ spec updates.
+
+ Implementations MAY choose to perform further validation of the certificate
+ content (e.g., checking expiry or enforcing specific formats). In such cases,
+ an implementation-specific Reason and Message must be set for the invalid reference.
+
+ In all cases, the implementation MUST ensure the `ResolvedRefs` Condition on
+ the BackendTLSPolicy is set to `status: False`, with a Reason and Message
+ that indicate the cause of the error. Connections using an invalid
+ CACertificateRef MUST fail, and the client MUST receive an HTTP 5xx error
+ response. If ALL CACertificateRefs are invalid, the implementation MUST also
+ ensure the `Accepted` Condition on the BackendTLSPolicy is set to
+ `status: False`, with a Reason `NoValidCACertificate`.
+
+ A single CACertificateRef to a Kubernetes ConfigMap kind has "Core" support.
+ Implementations MAY choose to support attaching multiple certificates to
+ a backend, but this behavior is implementation-specific.
+
+ Support: Core - An optional single reference to a Kubernetes ConfigMap,
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific - More than one reference, other kinds
+ of resources, or a single reference that includes multiple certificates.
+ items:
+ description: |-
+ LocalObjectReference identifies an API object within the namespace of the
+ referrer.
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent. For example "HTTPRoute"
+ or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ type: array
+ x-kubernetes-list-type: atomic
+ hostname:
+ description: |-
+ Hostname is used for two purposes in the connection between Gateways and
+ backends:
+
+ 1. Hostname MUST be used as the SNI to connect to the backend (RFC 6066).
+ 2. Hostname MUST be used for authentication and MUST match the certificate
+ served by the matching backend, unless SubjectAltNames is specified.
+ 3. If SubjectAltNames are specified, Hostname can be used for certificate selection
+ but MUST NOT be used for authentication. If you want to use the value
+ of the Hostname field for authentication, you MUST add it to the SubjectAltNames list.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ subjectAltNames:
+ description: |-
+ SubjectAltNames contains one or more Subject Alternative Names.
+ When specified the certificate served from the backend MUST
+ have at least one Subject Alternate Name matching one of the specified SubjectAltNames.
+
+ Support: Extended
+ items:
+ description: SubjectAltName represents Subject Alternative Name.
+ properties:
+ hostname:
+ description: |-
+ Hostname contains Subject Alternative Name specified in DNS name format.
+ Required when Type is set to Hostname, ignored otherwise.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ type:
+ description: |-
+ Type determines the format of the Subject Alternative Name. Always required.
+
+ Support: Core
+ enum:
+ - Hostname
+ - URI
+ type: string
+ uri:
+ description: |-
+ URI contains Subject Alternative Name specified in a full URI format.
+ It MUST include both a scheme (e.g., "http" or "ftp") and a scheme-specific-part.
+ Common values include SPIFFE IDs like "spiffe://mycluster.example.com/ns/myns/sa/svc1sa".
+ Required when Type is set to URI, ignored otherwise.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?
+ type: string
+ required:
+ - type
+ type: object
+ x-kubernetes-validations:
+ - message: SubjectAltName element must contain Hostname, if
+ Type is set to Hostname
+ rule: '!(self.type == "Hostname" && (!has(self.hostname) ||
+ self.hostname == ""))'
+ - message: SubjectAltName element must not contain Hostname,
+ if Type is not set to Hostname
+ rule: '!(self.type != "Hostname" && has(self.hostname) &&
+ self.hostname != "")'
+ - message: SubjectAltName element must contain URI, if Type
+ is set to URI
+ rule: '!(self.type == "URI" && (!has(self.uri) || self.uri
+ == ""))'
+ - message: SubjectAltName element must not contain URI, if Type
+ is not set to URI
+ rule: '!(self.type != "URI" && has(self.uri) && self.uri !=
+ "")'
+ maxItems: 5
+ type: array
+ x-kubernetes-list-type: atomic
+ wellKnownCACertificates:
+ description: |-
+ WellKnownCACertificates specifies whether system CA certificates may be used in
+ the TLS handshake between the gateway and backend pod.
+
+ If WellKnownCACertificates is unspecified or empty (""), then CACertificateRefs
+ must be specified with at least one entry for a valid configuration. Only one of
+ CACertificateRefs or WellKnownCACertificates may be specified, not both.
+ If an implementation does not support the WellKnownCACertificates field, or
+ the supplied value is not recognized, the implementation MUST ensure the
+ `Accepted` Condition on the BackendTLSPolicy is set to `status: False`, with
+ a Reason `Invalid`.
+
+ Support: Implementation-specific
+ enum:
+ - System
+ type: string
+ required:
+ - hostname
+ type: object
+ x-kubernetes-validations:
+ - message: must not contain both CACertificateRefs and WellKnownCACertificates
+ rule: '!(has(self.caCertificateRefs) && size(self.caCertificateRefs)
+ > 0 && has(self.wellKnownCACertificates) && self.wellKnownCACertificates
+ != "")'
+ - message: must specify either CACertificateRefs or WellKnownCACertificates
+ rule: (has(self.caCertificateRefs) && size(self.caCertificateRefs)
+ > 0 || has(self.wellKnownCACertificates) && self.wellKnownCACertificates
+ != "")
+ required:
+ - targetRefs
+ - validation
+ type: object
+ status:
+ description: Status defines the current state of BackendTLSPolicy.
+ properties:
+ ancestors:
+ description: |-
+ Ancestors is a list of ancestor resources (usually Gateways) that are
+ associated with the policy, and the status of the policy with respect to
+ each ancestor. When this policy attaches to a parent, the controller that
+ manages the parent and the ancestors MUST add an entry to this list when
+ the controller first sees the policy and SHOULD update the entry as
+ appropriate when the relevant ancestor is modified.
+
+ Note that choosing the relevant ancestor is left to the Policy designers;
+ an important part of Policy design is designing the right object level at
+ which to namespace this status.
+
+ Note also that implementations MUST ONLY populate ancestor status for
+ the Ancestor resources they are responsible for. Implementations MUST
+ use the ControllerName field to uniquely identify the entries in this list
+ that they are responsible for.
+
+ Note that to achieve this, the list of PolicyAncestorStatus structs
+ MUST be treated as a map with a composite key, made up of the AncestorRef
+ and ControllerName fields combined.
+
+ A maximum of 16 ancestors will be represented in this list. An empty list
+ means the Policy is not relevant for any ancestors.
+
+ If this slice is full, implementations MUST NOT add further entries.
+ Instead they MUST consider the policy unimplementable and signal that
+ on any related resources such as the ancestor that would be referenced
+ here. For example, if this list was full on BackendTLSPolicy, no
+ additional Gateways would be able to reference the Service targeted by
+ the BackendTLSPolicy.
+ items:
+ description: |-
+ PolicyAncestorStatus describes the status of a route with respect to an
+ associated Ancestor.
+
+ Ancestors refer to objects that are either the Target of a policy or above it
+ in terms of object hierarchy. For example, if a policy targets a Service, the
+ Policy's Ancestors are, in order, the Service, the HTTPRoute, the Gateway, and
+ the GatewayClass. Almost always, in this hierarchy, the Gateway will be the most
+ useful object to place Policy status on, so we recommend that implementations
+ SHOULD use Gateway as the PolicyAncestorStatus object unless the designers
+ have a _very_ good reason otherwise.
+
+ In the context of policy attachment, the Ancestor is used to distinguish which
+ resource results in a distinct application of this policy. For example, if a policy
+ targets a Service, it may have a distinct result per attached Gateway.
+
+ Policies targeting the same resource may have different effects depending on the
+ ancestors of those resources. For example, different Gateways targeting the same
+ Service may have different capabilities, especially if they have different underlying
+ implementations.
+
+ For example, in BackendTLSPolicy, the Policy attaches to a Service that is
+ used as a backend in a HTTPRoute that is itself attached to a Gateway.
+ In this case, the relevant object for status is the Gateway, and that is the
+ ancestor object referred to in this status.
+
+ Note that a parent is also an ancestor, so for objects where the parent is the
+ relevant object for status, this struct SHOULD still be used.
+
+ This struct is intended to be used in a slice that's effectively a map,
+ with a composite key made up of the AncestorRef and the ControllerName.
+ properties:
+ ancestorRef:
+ description: |-
+ AncestorRef corresponds with a ParentRef in the spec that this
+ PolicyAncestorStatus struct describes the status of.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: |-
+ Group is the group of the referent.
+ When unspecified, "gateway.networking.k8s.io" is inferred.
+ To set the core API group (such as for a "Service" kind referent),
+ Group must be explicitly set to "" (empty string).
+
+ Support: Core
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Gateway
+ description: |-
+ Kind is kind of the referent.
+
+ There are two kinds of parent resources with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ Support for other resources is Implementation-Specific.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: |-
+ Name is the name of the referent.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent. When unspecified, this refers
+ to the local namespace of the Route.
+
+ Note that there are specific rules for ParentRefs which cross namespace
+ boundaries. Cross-namespace references are only valid if they are explicitly
+ allowed by something in the namespace they are referring to. For example:
+ Gateway has the AllowedRoutes field, and ReferenceGrant provides a
+ generic way to enable any other kind of cross-namespace reference.
+
+
+ ParentRefs from a Route to a Service in the same namespace are "producer"
+ routes, which apply default routing rules to inbound connections from
+ any namespace to the Service.
+
+ ParentRefs from a Route to a Service in a different namespace are
+ "consumer" routes, and these routing rules are only applied to outbound
+ connections originating from the same namespace as the Route, for which
+ the intended destination of the connections are a Service targeted as a
+ ParentRef of the Route.
+
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port is the network port this Route targets. It can be interpreted
+ differently based on the type of parent resource.
+
+ When the parent resource is a Gateway, this targets all listeners
+ listening on the specified port that also support this kind of Route(and
+ select this Route). It's not recommended to set `Port` unless the
+ networking behaviors specified in a Route must apply to a specific port
+ as opposed to a listener(s) whose port(s) may be changed. When both Port
+ and SectionName are specified, the name and port of the selected listener
+ must match both specified values.
+
+
+ When the parent resource is a Service, this targets a specific port in the
+ Service spec. When both Port (experimental) and SectionName are specified,
+ the name and port of the selected port must match both specified values.
+
+
+ Implementations MAY choose to support other parent resources.
+ Implementations supporting other types of parent resources MUST clearly
+ document how/if Port is interpreted.
+
+ For the purpose of status, an attachment is considered successful as
+ long as the parent resource accepts it partially. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
+ from the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route,
+ the Route MUST be considered detached from the Gateway.
+
+ Support: Extended
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ sectionName:
+ description: |-
+ SectionName is the name of a section within the target resource. In the
+ following resources, SectionName is interpreted as the following:
+
+ * Gateway: Listener name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+ * Service: Port name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+
+ Implementations MAY choose to support attaching Routes to other resources.
+ If that is the case, they MUST clearly document how SectionName is
+ interpreted.
+
+ When unspecified (empty string), this will reference the entire resource.
+ For the purpose of status, an attachment is considered successful if at
+ least one section in the parent resource accepts it. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
+ the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route, the
+ Route MUST be considered detached from the Gateway.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - name
+ type: object
+ conditions:
+ description: Conditions describes the status of the Policy with
+ respect to the given Ancestor.
+ items:
+ description: Condition contains details for one aspect of
+ the current state of this API Resource.
+ properties:
+ lastTransitionTime:
+ description: |-
+ lastTransitionTime is the last time the condition transitioned from one status to another.
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
+ format: date-time
+ type: string
+ message:
+ description: |-
+ message is a human readable message indicating details about the transition.
+ This may be an empty string.
+ maxLength: 32768
+ type: string
+ observedGeneration:
+ description: |-
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+ with respect to the current state of the instance.
+ format: int64
+ minimum: 0
+ type: integer
+ reason:
+ description: |-
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
+ Producers of specific condition types may define expected values and meanings for this field,
+ and whether the values are considered a guaranteed API.
+ The value should be a CamelCase string.
+ This field may not be empty.
+ maxLength: 1024
+ minLength: 1
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+ type: string
+ status:
+ description: status of the condition, one of True, False,
+ Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
+ type: string
+ type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ maxLength: 316
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+ type: string
+ required:
+ - lastTransitionTime
+ - message
+ - reason
+ - status
+ - type
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-map-keys:
+ - type
+ x-kubernetes-list-type: map
+ controllerName:
+ description: |-
+ ControllerName is a domain/path string that indicates the name of the
+ controller that wrote this status. This corresponds with the
+ controllerName field on GatewayClass.
+
+ Example: "example.net/gateway-controller".
+
+ The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are
+ valid Kubernetes names
+ (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).
+
+ Controllers MUST populate this field when writing status. Controllers should ensure that
+ entries to status populated with their ControllerName are cleaned up when they are no
+ longer necessary.
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$
+ type: string
+ required:
+ - ancestorRef
+ - conditions
+ - controllerName
+ type: object
+ maxItems: 16
+ type: array
+ x-kubernetes-list-type: atomic
+ required:
+ - ancestors
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: false
status:
acceptedNames:
kind: ""
@@ -1154,9 +1382,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: gatewayclasses.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -1389,7 +1616,7 @@ spec:
- type
x-kubernetes-list-type: map
supportedFeatures:
- description: |
+ description: |-
SupportedFeatures is the set of features the GatewayClass support.
It MUST be sorted in ascending alphabetical order by the Name key.
items:
@@ -1633,7 +1860,7 @@ spec:
- type
x-kubernetes-list-type: map
supportedFeatures:
- description: |
+ description: |-
SupportedFeatures is the set of features the GatewayClass support.
It MUST be sorted in ascending alphabetical order by the Name key.
items:
@@ -1674,9 +1901,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: gateways.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -1732,11 +1958,11 @@ spec:
description: Spec defines the desired state of Gateway.
properties:
addresses:
- description: |+
+ description: |-
Addresses requested for this Gateway. This is optional and behavior can
depend on the implementation. If a value is set in the spec and the
requested address is invalid or unavailable, the implementation MUST
- indicate this in the associated entry in GatewayStatus.Addresses.
+ indicate this in an associated entry in GatewayStatus.Conditions.
The Addresses field represents a request for the address(es) on the
"outside of the Gateway", that traffic bound for this Gateway will use.
@@ -1753,10 +1979,9 @@ spec:
GatewayStatus.Addresses.
Support: Extended
-
items:
- description: GatewayAddress describes an address that can be bound
- to a Gateway.
+ description: GatewaySpecAddress describes an address that can be
+ bound to a Gateway.
oneOf:
- properties:
type:
@@ -1781,96 +2006,137 @@ spec:
type: string
value:
description: |-
- Value of the address. The validity of the values will depend
- on the type and support by the controller.
+ When a value is unspecified, an implementation SHOULD automatically
+ assign an address matching the requested type if possible.
+
+ If an implementation does not support an empty value, they MUST set the
+ "Programmed" condition in status to False with a reason of "AddressNotAssigned".
Examples: `1.2.3.4`, `128::1`, `my-ip-address`.
maxLength: 253
- minLength: 1
type: string
- required:
- - value
type: object
x-kubernetes-validations:
- - message: Hostname value must only contain valid characters (matching
- ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)
- rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):
+ - message: Hostname value must be empty or contain only valid characters
+ (matching ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)
+ rule: 'self.type == ''Hostname'' ? (!has(self.value) || self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$""")):
true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: IPAddress values must be unique
- rule: 'self.all(a1, a1.type == ''IPAddress'' ? self.exists_one(a2,
- a2.type == a1.type && a2.value == a1.value) : true )'
+ rule: 'self.all(a1, a1.type == ''IPAddress'' && has(a1.value) ?
+ self.exists_one(a2, a2.type == a1.type && has(a2.value) && a2.value
+ == a1.value) : true )'
- message: Hostname values must be unique
- rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2,
- a2.type == a1.type && a2.value == a1.value) : true )'
- backendTLS:
- description: |+
- BackendTLS configures TLS settings for when this Gateway is connecting to
- backends with TLS.
-
- Support: Core
-
+ rule: 'self.all(a1, a1.type == ''Hostname'' && has(a1.value) ?
+ self.exists_one(a2, a2.type == a1.type && has(a2.value) && a2.value
+ == a1.value) : true )'
+ allowedListeners:
+ description: |-
+ AllowedListeners defines which ListenerSets can be attached to this Gateway.
+ While this feature is experimental, the default value is to allow no ListenerSets.
properties:
- clientCertificateRef:
- description: |+
- ClientCertificateRef is a reference to an object that contains a Client
- Certificate and the associated private key.
-
- References to a resource in different namespace are invalid UNLESS there
- is a ReferenceGrant in the target namespace that allows the certificate
- to be attached. If a ReferenceGrant does not allow this reference, the
- "ResolvedRefs" condition MUST be set to False for this listener with the
- "RefNotPermitted" reason.
-
- ClientCertificateRef can reference to standard Kubernetes resources, i.e.
- Secret, or implementation-specific custom resources.
-
- This setting can be overridden on the service level by use of BackendTLSPolicy.
-
- Support: Core
-
+ namespaces:
+ default:
+ from: None
+ description: |-
+ Namespaces defines which namespaces ListenerSets can be attached to this Gateway.
+ While this feature is experimental, the default value is to allow no ListenerSets.
properties:
- group:
- default: ""
+ from:
+ default: None
description: |-
- Group is the group of the referent. For example, "gateway.networking.k8s.io".
- When unspecified or empty string, core API group is inferred.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ From indicates where ListenerSets can attach to this Gateway. Possible
+ values are:
+
+ * Same: Only ListenerSets in the same namespace may be attached to this Gateway.
+ * Selector: ListenerSets in namespaces selected by the selector may be attached to this Gateway.
+ * All: ListenerSets in all namespaces may be attached to this Gateway.
+ * None: Only listeners defined in the Gateway's spec are allowed
+
+ While this feature is experimental, the default value None
+ enum:
+ - All
+ - Selector
+ - Same
+ - None
type: string
- kind:
- default: Secret
- description: Kind is kind of the referent. For example "Secret".
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the referent.
- maxLength: 253
- minLength: 1
- type: string
- namespace:
+ selector:
description: |-
- Namespace is the namespace of the referenced object. When unspecified, the local
- namespace is inferred.
-
- Note that when a namespace different than the local namespace is specified,
- a ReferenceGrant object is required in the referent namespace to allow that
- namespace's owner to accept the reference. See the ReferenceGrant
- documentation for details.
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- required:
- - name
+ Selector must be specified when From is set to "Selector". In that case,
+ only ListenerSets in Namespaces matching this Selector will be selected by this
+ Gateway. This field is ignored for other values of "From".
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector
+ requirements. The requirements are ANDed.
+ items:
+ description: |-
+ A label selector requirement is a selector that contains values, a key, and an operator that
+ relates the key and values.
+ properties:
+ key:
+ description: key is the label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: |-
+ operator represents a key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: |-
+ values is an array of string values. If the operator is In or NotIn,
+ the values array must be non-empty. If the operator is Exists or DoesNotExist,
+ the values array must be empty. This array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ x-kubernetes-list-type: atomic
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: |-
+ matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions, whose key field is "key", the
+ operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
type: object
type: object
+ defaultScope:
+ description: |-
+ DefaultScope, when set, configures the Gateway as a default Gateway,
+ meaning it will dynamically and implicitly have Routes (e.g. HTTPRoute)
+ attached to it, according to the scope configured here.
+
+ If unset (the default) or set to None, the Gateway will not act as a
+ default Gateway; if set, the Gateway will claim any Route with a
+ matching scope set in its UseDefaultGateway field, subject to the usual
+ rules about which routes the Gateway can attach to.
+
+ Think carefully before using this functionality! While the normal rules
+ about which Route can apply are still enforced, it is simply easier for
+ the wrong Route to be accidentally attached to this Gateway in this
+ configuration. If the Gateway operator is not also the operator in
+ control of the scope (e.g. namespace) with tight controls and checks on
+ what kind of workloads and Routes get added in that scope, we strongly
+ recommend not using this just because it seems convenient, and instead
+ stick to direct Route attachment.
+ enum:
+ - All
+ - None
+ type: string
gatewayClassName:
description: |-
GatewayClassName used for this Gateway. This is the name of a
@@ -1965,6 +2231,11 @@ spec:
the merging behavior is implementation specific.
It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.
+ If the referent cannot be found, refers to an unsupported kind, or when
+ the data within that resource is malformed, the Gateway SHOULD be
+ rejected with the "Accepted" status condition set to "False" and an
+ "InvalidParameters" reason.
+
Support: Implementation-specific
properties:
group:
@@ -1995,6 +2266,8 @@ spec:
logical endpoints that are bound on this Gateway's addresses.
At least one Listener MUST be specified.
+ ## Distinct Listeners
+
Each Listener in a set of Listeners (for example, in a single Gateway)
MUST be _distinct_, in that a traffic flow MUST be able to be assigned to
exactly one listener. (This section uses "set of Listeners" rather than
@@ -2006,55 +2279,76 @@ spec:
combination of Port, Protocol, and, if supported by the protocol, Hostname.
Some combinations of port, protocol, and TLS settings are considered
- Core support and MUST be supported by implementations based on their
- targeted conformance profile:
+ Core support and MUST be supported by implementations based on the objects
+ they support:
- HTTP Profile
+ HTTPRoute
1. HTTPRoute, Port: 80, Protocol: HTTP
2. HTTPRoute, Port: 443, Protocol: HTTPS, TLS Mode: Terminate, TLS keypair provided
- TLS Profile
+ TLSRoute
1. TLSRoute, Port: 443, Protocol: TLS, TLS Mode: Passthrough
"Distinct" Listeners have the following property:
- The implementation can match inbound requests to a single distinct
- Listener. When multiple Listeners share values for fields (for
+ **The implementation can match inbound requests to a single distinct
+ Listener**.
+
+ When multiple Listeners share values for fields (for
example, two Listeners with the same Port value), the implementation
can match requests to only one of the Listeners using other
Listener fields.
- For example, the following Listener scenarios are distinct:
+ When multiple listeners have the same value for the Protocol field, then
+ each of the Listeners with matching Protocol values MUST have different
+ values for other fields.
- 1. Multiple Listeners with the same Port that all use the "HTTP"
- Protocol that all have unique Hostname values.
- 2. Multiple Listeners with the same Port that use either the "HTTPS" or
- "TLS" Protocol that all have unique Hostname values.
- 3. A mixture of "TCP" and "UDP" Protocol Listeners, where no Listener
- with the same Protocol has the same Port value.
+ The set of fields that MUST be different for a Listener differs per protocol.
+ The following rules define the rules for what fields MUST be considered for
+ Listeners to be distinct with each protocol currently defined in the
+ Gateway API spec.
- Some fields in the Listener struct have possible values that affect
- whether the Listener is distinct. Hostname is particularly relevant
- for HTTP or HTTPS protocols.
+ The set of listeners that all share a protocol value MUST have _different_
+ values for _at least one_ of these fields to be distinct:
- When using the Hostname value to select between same-Port, same-Protocol
- Listeners, the Hostname value must be different on each Listener for the
- Listener to be distinct.
+ * **HTTP, HTTPS, TLS**: Port, Hostname
+ * **TCP, UDP**: Port
- When the Listeners are distinct based on Hostname, inbound request
+ One **very** important rule to call out involves what happens when an
+ implementation:
+
+ * Supports TCP protocol Listeners, as well as HTTP, HTTPS, or TLS protocol
+ Listeners, and
+ * sees HTTP, HTTPS, or TLS protocols with the same `port` as one with TCP
+ Protocol.
+
+ In this case all the Listeners that share a port with the
+ TCP Listener are not distinct and so MUST NOT be accepted.
+
+ If an implementation does not support TCP Protocol Listeners, then the
+ previous rule does not apply, and the TCP Listeners SHOULD NOT be
+ accepted.
+
+ Note that the `tls` field is not used for determining if a listener is distinct, because
+ Listeners that _only_ differ on TLS config will still conflict in all cases.
+
+ ### Listeners that are distinct only by Hostname
+
+ When the Listeners are distinct based only on Hostname, inbound request
hostnames MUST match from the most specific to least specific Hostname
values to choose the correct Listener and its associated set of Routes.
- Exact matches must be processed before wildcard matches, and wildcard
- matches must be processed before fallback (empty Hostname value)
+ Exact matches MUST be processed before wildcard matches, and wildcard
+ matches MUST be processed before fallback (empty Hostname value)
matches. For example, `"foo.example.com"` takes precedence over
`"*.example.com"`, and `"*.example.com"` takes precedence over `""`.
Additionally, if there are multiple wildcard entries, more specific
wildcard entries must be processed before less specific wildcard entries.
For example, `"*.foo.example.com"` takes precedence over `"*.example.com"`.
+
The precise definition here is that the higher the number of dots in the
hostname to the right of the wildcard character, the higher the precedence.
@@ -2062,18 +2356,26 @@ spec:
the left, however, so `"*.example.com"` will match both
`"foo.bar.example.com"` _and_ `"bar.example.com"`.
+ ## Handling indistinct Listeners
+
If a set of Listeners contains Listeners that are not distinct, then those
- Listeners are Conflicted, and the implementation MUST set the "Conflicted"
+ Listeners are _Conflicted_, and the implementation MUST set the "Conflicted"
condition in the Listener Status to "True".
+ The words "indistinct" and "conflicted" are considered equivalent for the
+ purpose of this documentation.
+
Implementations MAY choose to accept a Gateway with some Conflicted
Listeners only if they only accept the partial Listener set that contains
- no Conflicted Listeners. To put this another way, implementations may
- accept a partial Listener set only if they throw out *all* the conflicting
- Listeners. No picking one of the conflicting listeners as the winner.
- This also means that the Gateway must have at least one non-conflicting
- Listener in this case, otherwise it violates the requirement that at
- least one Listener must be present.
+ no Conflicted Listeners.
+
+ Specifically, an implementation MAY accept a partial Listener set subject to
+ the following rules:
+
+ * The implementation MUST NOT pick one conflicting Listener as the winner.
+ ALL indistinct Listeners must not be accepted for processing.
+ * At least one distinct Listener MUST be present, or else the Gateway effectively
+ contains _no_ Listeners, and must be rejected from processing as a whole.
The implementation MUST set a "ListenersNotValid" condition on the
Gateway Status when the Gateway contains Conflicted Listeners whether or
@@ -2082,7 +2384,25 @@ spec:
Accepted. Additionally, the Listener status for those listeners SHOULD
indicate which Listeners are conflicted and not Accepted.
- A Gateway's Listeners are considered "compatible" if:
+ ## General Listener behavior
+
+ Note that, for all distinct Listeners, requests SHOULD match at most one Listener.
+ For example, if Listeners are defined for "foo.example.com" and "*.example.com", a
+ request to "foo.example.com" SHOULD only be routed using routes attached
+ to the "foo.example.com" Listener (and not the "*.example.com" Listener).
+
+ This concept is known as "Listener Isolation", and it is an Extended feature
+ of Gateway API. Implementations that do not support Listener Isolation MUST
+ clearly document this, and MUST NOT claim support for the
+ `GatewayHTTPListenerIsolation` feature.
+
+ Implementations that _do_ support Listener Isolation SHOULD claim support
+ for the Extended `GatewayHTTPListenerIsolation` feature and pass the associated
+ conformance tests.
+
+ ## Compatible Listeners
+
+ A Gateway's Listeners are considered _compatible_ if:
1. They are distinct.
2. The implementation can serve them in compliance with the Addresses
@@ -2097,16 +2417,11 @@ spec:
on the same address, or cannot mix HTTPS and generic TLS listens on the same port
would not consider those cases compatible, even though they are distinct.
- Note that requests SHOULD match at most one Listener. For example, if
- Listeners are defined for "foo.example.com" and "*.example.com", a
- request to "foo.example.com" SHOULD only be routed using routes attached
- to the "foo.example.com" Listener (and not the "*.example.com" Listener).
- This concept is known as "Listener Isolation". Implementations that do
- not support Listener Isolation MUST clearly document this.
-
Implementations MAY merge separate Gateways onto a single set of
Addresses if all Listeners across all Gateways are compatible.
+ In a future release the MinItems=1 requirement MAY be dropped.
+
Support: Core
items:
description: |-
@@ -2177,6 +2492,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
namespaces:
default:
from: Same
@@ -2268,10 +2584,31 @@ spec:
* TLS: The Listener Hostname MUST match the SNI.
* HTTP: The Listener Hostname MUST match the Host header of the request.
- * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP
- protocol layers as described above. If an implementation does not
- ensure that both the SNI and Host header match the Listener hostname,
- it MUST clearly document that.
+ * HTTPS: The Listener Hostname SHOULD match both the SNI and Host header.
+ Note that this does not require the SNI and Host header to be the same.
+ The semantics of this are described in more detail below.
+
+ To ensure security, Section 11.1 of RFC-6066 emphasizes that server
+ implementations that rely on SNI hostname matching MUST also verify
+ hostnames within the application protocol.
+
+ Section 9.1.2 of RFC-7540 provides a mechanism for servers to reject the
+ reuse of a connection by responding with the HTTP 421 Misdirected Request
+ status code. This indicates that the origin server has rejected the
+ request because it appears to have been misdirected.
+
+ To detect misdirected requests, Gateways SHOULD match the authority of
+ the requests with all the SNI hostname(s) configured across all the
+ Gateway Listeners on the same port and protocol:
+
+ * If another Listener has an exact match or more specific wildcard entry,
+ the Gateway SHOULD return a 421.
+ * If the current Listener (selected by SNI matching during ClientHello)
+ does not match the Host:
+ * If another Listener does match the Host the Gateway SHOULD return a
+ 421.
+ * If no other Listener matches the Host, the Gateway MUST return a
+ 404.
For HTTPRoute and TLSRoute resources, there is an interaction with the
`spec.hostnames` array. When both listener and route specify hostnames,
@@ -2323,7 +2660,7 @@ spec:
the Protocol field is "HTTPS" or "TLS". It is invalid to set this field
if the Protocol field is "HTTP", "TCP", or "UDP".
- The association of SNIs to Certificate defined in GatewayTLSConfig is
+ The association of SNIs to Certificate defined in ListenerTLSConfig is
defined based on the Hostname field for this listener.
The GatewayClass MUST use the longest matching SNI out of all
@@ -2410,94 +2747,7 @@ spec:
type: object
maxItems: 64
type: array
- frontendValidation:
- description: |+
- FrontendValidation holds configuration information for validating the frontend (client).
- Setting this field will require clients to send a client certificate
- required for validation during the TLS handshake. In browsers this may result in a dialog appearing
- that requests a user to specify the client certificate.
- The maximum depth of a certificate chain accepted in verification is Implementation specific.
-
- Support: Extended
-
- properties:
- caCertificateRefs:
- description: |-
- CACertificateRefs contains one or more references to
- Kubernetes objects that contain TLS certificates of
- the Certificate Authorities that can be used
- as a trust anchor to validate the certificates presented by the client.
-
- A single CA certificate reference to a Kubernetes ConfigMap
- has "Core" support.
- Implementations MAY choose to support attaching multiple CA certificates to
- a Listener, but this behavior is implementation-specific.
-
- Support: Core - A single reference to a Kubernetes ConfigMap
- with the CA certificate in a key named `ca.crt`.
-
- Support: Implementation-specific (More than one reference, or other kinds
- of resources).
-
- References to a resource in a different namespace are invalid UNLESS there
- is a ReferenceGrant in the target namespace that allows the certificate
- to be attached. If a ReferenceGrant does not allow this reference, the
- "ResolvedRefs" condition MUST be set to False for this listener with the
- "RefNotPermitted" reason.
- items:
- description: |-
- ObjectReference identifies an API object including its namespace.
-
- The API object must be valid in the cluster; the Group and Kind must
- be registered in the cluster for this reference to be valid.
-
- References to objects with invalid Group and Kind are not valid, and must
- be rejected by the implementation, with appropriate Conditions set
- on the containing object.
- properties:
- group:
- description: |-
- Group is the group of the referent. For example, "gateway.networking.k8s.io".
- When unspecified or empty string, core API group is inferred.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- kind:
- description: Kind is kind of the referent. For
- example "ConfigMap" or "Service".
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the referent.
- maxLength: 253
- minLength: 1
- type: string
- namespace:
- description: |-
- Namespace is the namespace of the referenced object. When unspecified, the local
- namespace is inferred.
-
- Note that when a namespace different than the local namespace is specified,
- a ReferenceGrant object is required in the referent namespace to allow that
- namespace's owner to accept the reference. See the ReferenceGrant
- documentation for details.
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- required:
- - group
- - kind
- - name
- type: object
- maxItems: 8
- minItems: 1
- type: array
- type: object
+ x-kubernetes-list-type: atomic
mode:
default: Terminate
description: |-
@@ -2576,6 +2826,366 @@ spec:
rule: 'self.all(l1, self.exists_one(l2, l1.port == l2.port && l1.protocol
== l2.protocol && (has(l1.hostname) && has(l2.hostname) ? l1.hostname
== l2.hostname : !has(l1.hostname) && !has(l2.hostname))))'
+ tls:
+ description: |-
+ TLS specifies frontend and backend tls configuration for entire gateway.
+
+ Support: Extended
+ properties:
+ backend:
+ description: |-
+ Backend describes TLS configuration for gateway when connecting
+ to backends.
+
+ Note that this contains only details for the Gateway as a TLS client,
+ and does _not_ imply behavior about how to choose which backend should
+ get a TLS connection. That is determined by the presence of a BackendTLSPolicy.
+
+ Support: Core
+ properties:
+ clientCertificateRef:
+ description: |-
+ ClientCertificateRef is a reference to an object that contains a Client
+ Certificate and the associated private key.
+
+ References to a resource in different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+
+ ClientCertificateRef can reference to standard Kubernetes resources, i.e.
+ Secret, or implementation-specific custom resources.
+
+ Support: Core
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Secret
+ description: Kind is kind of the referent. For example
+ "Secret".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - name
+ type: object
+ type: object
+ frontend:
+ description: |-
+ Frontend describes TLS config when client connects to Gateway.
+ Support: Core
+ properties:
+ default:
+ description: |-
+ Default specifies the default client certificate validation configuration
+ for all Listeners handling HTTPS traffic, unless a per-port configuration
+ is defined.
+
+ support: Core
+ properties:
+ validation:
+ description: |-
+ Validation holds configuration information for validating the frontend (client).
+ Setting this field will result in mutual authentication when connecting to the gateway.
+ In browsers this may result in a dialog appearing
+ that requests a user to specify the client certificate.
+ The maximum depth of a certificate chain accepted in verification is Implementation specific.
+
+ Support: Core
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to
+ Kubernetes objects that contain TLS certificates of
+ the Certificate Authorities that can be used
+ as a trust anchor to validate the certificates presented by the client.
+
+ A single CA certificate reference to a Kubernetes ConfigMap
+ has "Core" support.
+ Implementations MAY choose to support attaching multiple CA certificates to
+ a Listener, but this behavior is implementation-specific.
+
+ Support: Core - A single reference to a Kubernetes ConfigMap
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific (More than one certificate in a ConfigMap
+ with different keys or more than one reference, or other kinds of resources).
+
+ References to a resource in a different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+ items:
+ description: |-
+ ObjectReference identifies an API object including its namespace.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When set to the empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent. For
+ example "ConfigMap" or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ mode:
+ default: AllowValidOnly
+ description: |-
+ FrontendValidationMode defines the mode for validating the client certificate.
+ There are two possible modes:
+
+ - AllowValidOnly: In this mode, the gateway will accept connections only if
+ the client presents a valid certificate. This certificate must successfully
+ pass validation against the CA certificates specified in `CACertificateRefs`.
+ - AllowInsecureFallback: In this mode, the gateway will accept connections
+ even if the client certificate is not presented or fails verification.
+
+ This approach delegates client authorization to the backend and introduce
+ a significant security risk. It should be used in testing environments or
+ on a temporary basis in non-testing environments.
+
+ Defaults to AllowValidOnly.
+
+ Support: Core
+ enum:
+ - AllowValidOnly
+ - AllowInsecureFallback
+ type: string
+ required:
+ - caCertificateRefs
+ type: object
+ type: object
+ perPort:
+ description: |-
+ PerPort specifies tls configuration assigned per port.
+ Per port configuration is optional. Once set this configuration overrides
+ the default configuration for all Listeners handling HTTPS traffic
+ that match this port.
+ Each override port requires a unique TLS configuration.
+
+ support: Core
+ items:
+ properties:
+ port:
+ description: |-
+ The Port indicates the Port Number to which the TLS configuration will be
+ applied. This configuration will be applied to all Listeners handling HTTPS
+ traffic that match this port.
+
+ Support: Core
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ tls:
+ description: |-
+ TLS store the configuration that will be applied to all Listeners handling
+ HTTPS traffic and matching given port.
+
+ Support: Core
+ properties:
+ validation:
+ description: |-
+ Validation holds configuration information for validating the frontend (client).
+ Setting this field will result in mutual authentication when connecting to the gateway.
+ In browsers this may result in a dialog appearing
+ that requests a user to specify the client certificate.
+ The maximum depth of a certificate chain accepted in verification is Implementation specific.
+
+ Support: Core
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to
+ Kubernetes objects that contain TLS certificates of
+ the Certificate Authorities that can be used
+ as a trust anchor to validate the certificates presented by the client.
+
+ A single CA certificate reference to a Kubernetes ConfigMap
+ has "Core" support.
+ Implementations MAY choose to support attaching multiple CA certificates to
+ a Listener, but this behavior is implementation-specific.
+
+ Support: Core - A single reference to a Kubernetes ConfigMap
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific (More than one certificate in a ConfigMap
+ with different keys or more than one reference, or other kinds of resources).
+
+ References to a resource in a different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+ items:
+ description: |-
+ ObjectReference identifies an API object including its namespace.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When set to the empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent.
+ For example "ConfigMap" or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ mode:
+ default: AllowValidOnly
+ description: |-
+ FrontendValidationMode defines the mode for validating the client certificate.
+ There are two possible modes:
+
+ - AllowValidOnly: In this mode, the gateway will accept connections only if
+ the client presents a valid certificate. This certificate must successfully
+ pass validation against the CA certificates specified in `CACertificateRefs`.
+ - AllowInsecureFallback: In this mode, the gateway will accept connections
+ even if the client certificate is not presented or fails verification.
+
+ This approach delegates client authorization to the backend and introduce
+ a significant security risk. It should be used in testing environments or
+ on a temporary basis in non-testing environments.
+
+ Defaults to AllowValidOnly.
+
+ Support: Core
+ enum:
+ - AllowValidOnly
+ - AllowInsecureFallback
+ type: string
+ required:
+ - caCertificateRefs
+ type: object
+ type: object
+ required:
+ - port
+ - tls
+ type: object
+ maxItems: 64
+ type: array
+ x-kubernetes-list-map-keys:
+ - port
+ x-kubernetes-list-type: map
+ x-kubernetes-validations:
+ - message: Port for TLS configuration must be unique within
+ the Gateway
+ rule: self.all(t1, self.exists_one(t2, t1.port == t2.port))
+ required:
+ - default
+ type: object
+ type: object
required:
- gatewayClassName
- listeners
@@ -2596,7 +3206,7 @@ spec:
description: Status defines the current state of Gateway.
properties:
addresses:
- description: |+
+ description: |-
Addresses lists the network addresses that have been bound to the
Gateway.
@@ -2606,7 +3216,6 @@ spec:
* no addresses are specified, all addresses are dynamically assigned
* a combination of specified and dynamic addresses are assigned
* a specified address was unusable (e.g. already in use)
-
items:
description: GatewayStatusAddress describes a network address that
is bound to a Gateway.
@@ -2651,6 +3260,7 @@ spec:
true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
conditions:
default:
- lastTransitionTime: "1970-01-01T00:00:00Z"
@@ -2864,6 +3474,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
required:
- attachedRoutes
- conditions
@@ -2924,11 +3535,11 @@ spec:
description: Spec defines the desired state of Gateway.
properties:
addresses:
- description: |+
+ description: |-
Addresses requested for this Gateway. This is optional and behavior can
depend on the implementation. If a value is set in the spec and the
requested address is invalid or unavailable, the implementation MUST
- indicate this in the associated entry in GatewayStatus.Addresses.
+ indicate this in an associated entry in GatewayStatus.Conditions.
The Addresses field represents a request for the address(es) on the
"outside of the Gateway", that traffic bound for this Gateway will use.
@@ -2945,10 +3556,9 @@ spec:
GatewayStatus.Addresses.
Support: Extended
-
items:
- description: GatewayAddress describes an address that can be bound
- to a Gateway.
+ description: GatewaySpecAddress describes an address that can be
+ bound to a Gateway.
oneOf:
- properties:
type:
@@ -2973,96 +3583,137 @@ spec:
type: string
value:
description: |-
- Value of the address. The validity of the values will depend
- on the type and support by the controller.
+ When a value is unspecified, an implementation SHOULD automatically
+ assign an address matching the requested type if possible.
+
+ If an implementation does not support an empty value, they MUST set the
+ "Programmed" condition in status to False with a reason of "AddressNotAssigned".
Examples: `1.2.3.4`, `128::1`, `my-ip-address`.
maxLength: 253
- minLength: 1
type: string
- required:
- - value
type: object
x-kubernetes-validations:
- - message: Hostname value must only contain valid characters (matching
- ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)
- rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):
+ - message: Hostname value must be empty or contain only valid characters
+ (matching ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)
+ rule: 'self.type == ''Hostname'' ? (!has(self.value) || self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$""")):
true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: IPAddress values must be unique
- rule: 'self.all(a1, a1.type == ''IPAddress'' ? self.exists_one(a2,
- a2.type == a1.type && a2.value == a1.value) : true )'
+ rule: 'self.all(a1, a1.type == ''IPAddress'' && has(a1.value) ?
+ self.exists_one(a2, a2.type == a1.type && has(a2.value) && a2.value
+ == a1.value) : true )'
- message: Hostname values must be unique
- rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2,
- a2.type == a1.type && a2.value == a1.value) : true )'
- backendTLS:
- description: |+
- BackendTLS configures TLS settings for when this Gateway is connecting to
- backends with TLS.
-
- Support: Core
-
+ rule: 'self.all(a1, a1.type == ''Hostname'' && has(a1.value) ?
+ self.exists_one(a2, a2.type == a1.type && has(a2.value) && a2.value
+ == a1.value) : true )'
+ allowedListeners:
+ description: |-
+ AllowedListeners defines which ListenerSets can be attached to this Gateway.
+ While this feature is experimental, the default value is to allow no ListenerSets.
properties:
- clientCertificateRef:
- description: |+
- ClientCertificateRef is a reference to an object that contains a Client
- Certificate and the associated private key.
-
- References to a resource in different namespace are invalid UNLESS there
- is a ReferenceGrant in the target namespace that allows the certificate
- to be attached. If a ReferenceGrant does not allow this reference, the
- "ResolvedRefs" condition MUST be set to False for this listener with the
- "RefNotPermitted" reason.
-
- ClientCertificateRef can reference to standard Kubernetes resources, i.e.
- Secret, or implementation-specific custom resources.
-
- This setting can be overridden on the service level by use of BackendTLSPolicy.
-
- Support: Core
-
+ namespaces:
+ default:
+ from: None
+ description: |-
+ Namespaces defines which namespaces ListenerSets can be attached to this Gateway.
+ While this feature is experimental, the default value is to allow no ListenerSets.
properties:
- group:
- default: ""
+ from:
+ default: None
description: |-
- Group is the group of the referent. For example, "gateway.networking.k8s.io".
- When unspecified or empty string, core API group is inferred.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ From indicates where ListenerSets can attach to this Gateway. Possible
+ values are:
+
+ * Same: Only ListenerSets in the same namespace may be attached to this Gateway.
+ * Selector: ListenerSets in namespaces selected by the selector may be attached to this Gateway.
+ * All: ListenerSets in all namespaces may be attached to this Gateway.
+ * None: Only listeners defined in the Gateway's spec are allowed
+
+ While this feature is experimental, the default value None
+ enum:
+ - All
+ - Selector
+ - Same
+ - None
type: string
- kind:
- default: Secret
- description: Kind is kind of the referent. For example "Secret".
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the referent.
- maxLength: 253
- minLength: 1
- type: string
- namespace:
+ selector:
description: |-
- Namespace is the namespace of the referenced object. When unspecified, the local
- namespace is inferred.
-
- Note that when a namespace different than the local namespace is specified,
- a ReferenceGrant object is required in the referent namespace to allow that
- namespace's owner to accept the reference. See the ReferenceGrant
- documentation for details.
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- required:
- - name
+ Selector must be specified when From is set to "Selector". In that case,
+ only ListenerSets in Namespaces matching this Selector will be selected by this
+ Gateway. This field is ignored for other values of "From".
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector
+ requirements. The requirements are ANDed.
+ items:
+ description: |-
+ A label selector requirement is a selector that contains values, a key, and an operator that
+ relates the key and values.
+ properties:
+ key:
+ description: key is the label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: |-
+ operator represents a key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: |-
+ values is an array of string values. If the operator is In or NotIn,
+ the values array must be non-empty. If the operator is Exists or DoesNotExist,
+ the values array must be empty. This array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ x-kubernetes-list-type: atomic
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: |-
+ matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions, whose key field is "key", the
+ operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
type: object
type: object
+ defaultScope:
+ description: |-
+ DefaultScope, when set, configures the Gateway as a default Gateway,
+ meaning it will dynamically and implicitly have Routes (e.g. HTTPRoute)
+ attached to it, according to the scope configured here.
+
+ If unset (the default) or set to None, the Gateway will not act as a
+ default Gateway; if set, the Gateway will claim any Route with a
+ matching scope set in its UseDefaultGateway field, subject to the usual
+ rules about which routes the Gateway can attach to.
+
+ Think carefully before using this functionality! While the normal rules
+ about which Route can apply are still enforced, it is simply easier for
+ the wrong Route to be accidentally attached to this Gateway in this
+ configuration. If the Gateway operator is not also the operator in
+ control of the scope (e.g. namespace) with tight controls and checks on
+ what kind of workloads and Routes get added in that scope, we strongly
+ recommend not using this just because it seems convenient, and instead
+ stick to direct Route attachment.
+ enum:
+ - All
+ - None
+ type: string
gatewayClassName:
description: |-
GatewayClassName used for this Gateway. This is the name of a
@@ -3157,6 +3808,11 @@ spec:
the merging behavior is implementation specific.
It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.
+ If the referent cannot be found, refers to an unsupported kind, or when
+ the data within that resource is malformed, the Gateway SHOULD be
+ rejected with the "Accepted" status condition set to "False" and an
+ "InvalidParameters" reason.
+
Support: Implementation-specific
properties:
group:
@@ -3187,6 +3843,8 @@ spec:
logical endpoints that are bound on this Gateway's addresses.
At least one Listener MUST be specified.
+ ## Distinct Listeners
+
Each Listener in a set of Listeners (for example, in a single Gateway)
MUST be _distinct_, in that a traffic flow MUST be able to be assigned to
exactly one listener. (This section uses "set of Listeners" rather than
@@ -3198,55 +3856,76 @@ spec:
combination of Port, Protocol, and, if supported by the protocol, Hostname.
Some combinations of port, protocol, and TLS settings are considered
- Core support and MUST be supported by implementations based on their
- targeted conformance profile:
+ Core support and MUST be supported by implementations based on the objects
+ they support:
- HTTP Profile
+ HTTPRoute
1. HTTPRoute, Port: 80, Protocol: HTTP
2. HTTPRoute, Port: 443, Protocol: HTTPS, TLS Mode: Terminate, TLS keypair provided
- TLS Profile
+ TLSRoute
1. TLSRoute, Port: 443, Protocol: TLS, TLS Mode: Passthrough
"Distinct" Listeners have the following property:
- The implementation can match inbound requests to a single distinct
- Listener. When multiple Listeners share values for fields (for
+ **The implementation can match inbound requests to a single distinct
+ Listener**.
+
+ When multiple Listeners share values for fields (for
example, two Listeners with the same Port value), the implementation
can match requests to only one of the Listeners using other
Listener fields.
- For example, the following Listener scenarios are distinct:
+ When multiple listeners have the same value for the Protocol field, then
+ each of the Listeners with matching Protocol values MUST have different
+ values for other fields.
- 1. Multiple Listeners with the same Port that all use the "HTTP"
- Protocol that all have unique Hostname values.
- 2. Multiple Listeners with the same Port that use either the "HTTPS" or
- "TLS" Protocol that all have unique Hostname values.
- 3. A mixture of "TCP" and "UDP" Protocol Listeners, where no Listener
- with the same Protocol has the same Port value.
+ The set of fields that MUST be different for a Listener differs per protocol.
+ The following rules define the rules for what fields MUST be considered for
+ Listeners to be distinct with each protocol currently defined in the
+ Gateway API spec.
- Some fields in the Listener struct have possible values that affect
- whether the Listener is distinct. Hostname is particularly relevant
- for HTTP or HTTPS protocols.
+ The set of listeners that all share a protocol value MUST have _different_
+ values for _at least one_ of these fields to be distinct:
- When using the Hostname value to select between same-Port, same-Protocol
- Listeners, the Hostname value must be different on each Listener for the
- Listener to be distinct.
+ * **HTTP, HTTPS, TLS**: Port, Hostname
+ * **TCP, UDP**: Port
- When the Listeners are distinct based on Hostname, inbound request
+ One **very** important rule to call out involves what happens when an
+ implementation:
+
+ * Supports TCP protocol Listeners, as well as HTTP, HTTPS, or TLS protocol
+ Listeners, and
+ * sees HTTP, HTTPS, or TLS protocols with the same `port` as one with TCP
+ Protocol.
+
+ In this case all the Listeners that share a port with the
+ TCP Listener are not distinct and so MUST NOT be accepted.
+
+ If an implementation does not support TCP Protocol Listeners, then the
+ previous rule does not apply, and the TCP Listeners SHOULD NOT be
+ accepted.
+
+ Note that the `tls` field is not used for determining if a listener is distinct, because
+ Listeners that _only_ differ on TLS config will still conflict in all cases.
+
+ ### Listeners that are distinct only by Hostname
+
+ When the Listeners are distinct based only on Hostname, inbound request
hostnames MUST match from the most specific to least specific Hostname
values to choose the correct Listener and its associated set of Routes.
- Exact matches must be processed before wildcard matches, and wildcard
- matches must be processed before fallback (empty Hostname value)
+ Exact matches MUST be processed before wildcard matches, and wildcard
+ matches MUST be processed before fallback (empty Hostname value)
matches. For example, `"foo.example.com"` takes precedence over
`"*.example.com"`, and `"*.example.com"` takes precedence over `""`.
Additionally, if there are multiple wildcard entries, more specific
wildcard entries must be processed before less specific wildcard entries.
For example, `"*.foo.example.com"` takes precedence over `"*.example.com"`.
+
The precise definition here is that the higher the number of dots in the
hostname to the right of the wildcard character, the higher the precedence.
@@ -3254,18 +3933,26 @@ spec:
the left, however, so `"*.example.com"` will match both
`"foo.bar.example.com"` _and_ `"bar.example.com"`.
+ ## Handling indistinct Listeners
+
If a set of Listeners contains Listeners that are not distinct, then those
- Listeners are Conflicted, and the implementation MUST set the "Conflicted"
+ Listeners are _Conflicted_, and the implementation MUST set the "Conflicted"
condition in the Listener Status to "True".
+ The words "indistinct" and "conflicted" are considered equivalent for the
+ purpose of this documentation.
+
Implementations MAY choose to accept a Gateway with some Conflicted
Listeners only if they only accept the partial Listener set that contains
- no Conflicted Listeners. To put this another way, implementations may
- accept a partial Listener set only if they throw out *all* the conflicting
- Listeners. No picking one of the conflicting listeners as the winner.
- This also means that the Gateway must have at least one non-conflicting
- Listener in this case, otherwise it violates the requirement that at
- least one Listener must be present.
+ no Conflicted Listeners.
+
+ Specifically, an implementation MAY accept a partial Listener set subject to
+ the following rules:
+
+ * The implementation MUST NOT pick one conflicting Listener as the winner.
+ ALL indistinct Listeners must not be accepted for processing.
+ * At least one distinct Listener MUST be present, or else the Gateway effectively
+ contains _no_ Listeners, and must be rejected from processing as a whole.
The implementation MUST set a "ListenersNotValid" condition on the
Gateway Status when the Gateway contains Conflicted Listeners whether or
@@ -3274,7 +3961,25 @@ spec:
Accepted. Additionally, the Listener status for those listeners SHOULD
indicate which Listeners are conflicted and not Accepted.
- A Gateway's Listeners are considered "compatible" if:
+ ## General Listener behavior
+
+ Note that, for all distinct Listeners, requests SHOULD match at most one Listener.
+ For example, if Listeners are defined for "foo.example.com" and "*.example.com", a
+ request to "foo.example.com" SHOULD only be routed using routes attached
+ to the "foo.example.com" Listener (and not the "*.example.com" Listener).
+
+ This concept is known as "Listener Isolation", and it is an Extended feature
+ of Gateway API. Implementations that do not support Listener Isolation MUST
+ clearly document this, and MUST NOT claim support for the
+ `GatewayHTTPListenerIsolation` feature.
+
+ Implementations that _do_ support Listener Isolation SHOULD claim support
+ for the Extended `GatewayHTTPListenerIsolation` feature and pass the associated
+ conformance tests.
+
+ ## Compatible Listeners
+
+ A Gateway's Listeners are considered _compatible_ if:
1. They are distinct.
2. The implementation can serve them in compliance with the Addresses
@@ -3289,16 +3994,11 @@ spec:
on the same address, or cannot mix HTTPS and generic TLS listens on the same port
would not consider those cases compatible, even though they are distinct.
- Note that requests SHOULD match at most one Listener. For example, if
- Listeners are defined for "foo.example.com" and "*.example.com", a
- request to "foo.example.com" SHOULD only be routed using routes attached
- to the "foo.example.com" Listener (and not the "*.example.com" Listener).
- This concept is known as "Listener Isolation". Implementations that do
- not support Listener Isolation MUST clearly document this.
-
Implementations MAY merge separate Gateways onto a single set of
Addresses if all Listeners across all Gateways are compatible.
+ In a future release the MinItems=1 requirement MAY be dropped.
+
Support: Core
items:
description: |-
@@ -3369,6 +4069,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
namespaces:
default:
from: Same
@@ -3460,10 +4161,31 @@ spec:
* TLS: The Listener Hostname MUST match the SNI.
* HTTP: The Listener Hostname MUST match the Host header of the request.
- * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP
- protocol layers as described above. If an implementation does not
- ensure that both the SNI and Host header match the Listener hostname,
- it MUST clearly document that.
+ * HTTPS: The Listener Hostname SHOULD match both the SNI and Host header.
+ Note that this does not require the SNI and Host header to be the same.
+ The semantics of this are described in more detail below.
+
+ To ensure security, Section 11.1 of RFC-6066 emphasizes that server
+ implementations that rely on SNI hostname matching MUST also verify
+ hostnames within the application protocol.
+
+ Section 9.1.2 of RFC-7540 provides a mechanism for servers to reject the
+ reuse of a connection by responding with the HTTP 421 Misdirected Request
+ status code. This indicates that the origin server has rejected the
+ request because it appears to have been misdirected.
+
+ To detect misdirected requests, Gateways SHOULD match the authority of
+ the requests with all the SNI hostname(s) configured across all the
+ Gateway Listeners on the same port and protocol:
+
+ * If another Listener has an exact match or more specific wildcard entry,
+ the Gateway SHOULD return a 421.
+ * If the current Listener (selected by SNI matching during ClientHello)
+ does not match the Host:
+ * If another Listener does match the Host the Gateway SHOULD return a
+ 421.
+ * If no other Listener matches the Host, the Gateway MUST return a
+ 404.
For HTTPRoute and TLSRoute resources, there is an interaction with the
`spec.hostnames` array. When both listener and route specify hostnames,
@@ -3515,7 +4237,7 @@ spec:
the Protocol field is "HTTPS" or "TLS". It is invalid to set this field
if the Protocol field is "HTTP", "TCP", or "UDP".
- The association of SNIs to Certificate defined in GatewayTLSConfig is
+ The association of SNIs to Certificate defined in ListenerTLSConfig is
defined based on the Hostname field for this listener.
The GatewayClass MUST use the longest matching SNI out of all
@@ -3602,94 +4324,7 @@ spec:
type: object
maxItems: 64
type: array
- frontendValidation:
- description: |+
- FrontendValidation holds configuration information for validating the frontend (client).
- Setting this field will require clients to send a client certificate
- required for validation during the TLS handshake. In browsers this may result in a dialog appearing
- that requests a user to specify the client certificate.
- The maximum depth of a certificate chain accepted in verification is Implementation specific.
-
- Support: Extended
-
- properties:
- caCertificateRefs:
- description: |-
- CACertificateRefs contains one or more references to
- Kubernetes objects that contain TLS certificates of
- the Certificate Authorities that can be used
- as a trust anchor to validate the certificates presented by the client.
-
- A single CA certificate reference to a Kubernetes ConfigMap
- has "Core" support.
- Implementations MAY choose to support attaching multiple CA certificates to
- a Listener, but this behavior is implementation-specific.
-
- Support: Core - A single reference to a Kubernetes ConfigMap
- with the CA certificate in a key named `ca.crt`.
-
- Support: Implementation-specific (More than one reference, or other kinds
- of resources).
-
- References to a resource in a different namespace are invalid UNLESS there
- is a ReferenceGrant in the target namespace that allows the certificate
- to be attached. If a ReferenceGrant does not allow this reference, the
- "ResolvedRefs" condition MUST be set to False for this listener with the
- "RefNotPermitted" reason.
- items:
- description: |-
- ObjectReference identifies an API object including its namespace.
-
- The API object must be valid in the cluster; the Group and Kind must
- be registered in the cluster for this reference to be valid.
-
- References to objects with invalid Group and Kind are not valid, and must
- be rejected by the implementation, with appropriate Conditions set
- on the containing object.
- properties:
- group:
- description: |-
- Group is the group of the referent. For example, "gateway.networking.k8s.io".
- When unspecified or empty string, core API group is inferred.
- maxLength: 253
- pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
- type: string
- kind:
- description: Kind is kind of the referent. For
- example "ConfigMap" or "Service".
- maxLength: 63
- minLength: 1
- pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
- type: string
- name:
- description: Name is the name of the referent.
- maxLength: 253
- minLength: 1
- type: string
- namespace:
- description: |-
- Namespace is the namespace of the referenced object. When unspecified, the local
- namespace is inferred.
-
- Note that when a namespace different than the local namespace is specified,
- a ReferenceGrant object is required in the referent namespace to allow that
- namespace's owner to accept the reference. See the ReferenceGrant
- documentation for details.
-
- Support: Core
- maxLength: 63
- minLength: 1
- pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
- type: string
- required:
- - group
- - kind
- - name
- type: object
- maxItems: 8
- minItems: 1
- type: array
- type: object
+ x-kubernetes-list-type: atomic
mode:
default: Terminate
description: |-
@@ -3768,6 +4403,366 @@ spec:
rule: 'self.all(l1, self.exists_one(l2, l1.port == l2.port && l1.protocol
== l2.protocol && (has(l1.hostname) && has(l2.hostname) ? l1.hostname
== l2.hostname : !has(l1.hostname) && !has(l2.hostname))))'
+ tls:
+ description: |-
+ TLS specifies frontend and backend tls configuration for entire gateway.
+
+ Support: Extended
+ properties:
+ backend:
+ description: |-
+ Backend describes TLS configuration for gateway when connecting
+ to backends.
+
+ Note that this contains only details for the Gateway as a TLS client,
+ and does _not_ imply behavior about how to choose which backend should
+ get a TLS connection. That is determined by the presence of a BackendTLSPolicy.
+
+ Support: Core
+ properties:
+ clientCertificateRef:
+ description: |-
+ ClientCertificateRef is a reference to an object that contains a Client
+ Certificate and the associated private key.
+
+ References to a resource in different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+
+ ClientCertificateRef can reference to standard Kubernetes resources, i.e.
+ Secret, or implementation-specific custom resources.
+
+ Support: Core
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Secret
+ description: Kind is kind of the referent. For example
+ "Secret".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - name
+ type: object
+ type: object
+ frontend:
+ description: |-
+ Frontend describes TLS config when client connects to Gateway.
+ Support: Core
+ properties:
+ default:
+ description: |-
+ Default specifies the default client certificate validation configuration
+ for all Listeners handling HTTPS traffic, unless a per-port configuration
+ is defined.
+
+ support: Core
+ properties:
+ validation:
+ description: |-
+ Validation holds configuration information for validating the frontend (client).
+ Setting this field will result in mutual authentication when connecting to the gateway.
+ In browsers this may result in a dialog appearing
+ that requests a user to specify the client certificate.
+ The maximum depth of a certificate chain accepted in verification is Implementation specific.
+
+ Support: Core
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to
+ Kubernetes objects that contain TLS certificates of
+ the Certificate Authorities that can be used
+ as a trust anchor to validate the certificates presented by the client.
+
+ A single CA certificate reference to a Kubernetes ConfigMap
+ has "Core" support.
+ Implementations MAY choose to support attaching multiple CA certificates to
+ a Listener, but this behavior is implementation-specific.
+
+ Support: Core - A single reference to a Kubernetes ConfigMap
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific (More than one certificate in a ConfigMap
+ with different keys or more than one reference, or other kinds of resources).
+
+ References to a resource in a different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+ items:
+ description: |-
+ ObjectReference identifies an API object including its namespace.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When set to the empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent. For
+ example "ConfigMap" or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ mode:
+ default: AllowValidOnly
+ description: |-
+ FrontendValidationMode defines the mode for validating the client certificate.
+ There are two possible modes:
+
+ - AllowValidOnly: In this mode, the gateway will accept connections only if
+ the client presents a valid certificate. This certificate must successfully
+ pass validation against the CA certificates specified in `CACertificateRefs`.
+ - AllowInsecureFallback: In this mode, the gateway will accept connections
+ even if the client certificate is not presented or fails verification.
+
+ This approach delegates client authorization to the backend and introduce
+ a significant security risk. It should be used in testing environments or
+ on a temporary basis in non-testing environments.
+
+ Defaults to AllowValidOnly.
+
+ Support: Core
+ enum:
+ - AllowValidOnly
+ - AllowInsecureFallback
+ type: string
+ required:
+ - caCertificateRefs
+ type: object
+ type: object
+ perPort:
+ description: |-
+ PerPort specifies tls configuration assigned per port.
+ Per port configuration is optional. Once set this configuration overrides
+ the default configuration for all Listeners handling HTTPS traffic
+ that match this port.
+ Each override port requires a unique TLS configuration.
+
+ support: Core
+ items:
+ properties:
+ port:
+ description: |-
+ The Port indicates the Port Number to which the TLS configuration will be
+ applied. This configuration will be applied to all Listeners handling HTTPS
+ traffic that match this port.
+
+ Support: Core
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ tls:
+ description: |-
+ TLS store the configuration that will be applied to all Listeners handling
+ HTTPS traffic and matching given port.
+
+ Support: Core
+ properties:
+ validation:
+ description: |-
+ Validation holds configuration information for validating the frontend (client).
+ Setting this field will result in mutual authentication when connecting to the gateway.
+ In browsers this may result in a dialog appearing
+ that requests a user to specify the client certificate.
+ The maximum depth of a certificate chain accepted in verification is Implementation specific.
+
+ Support: Core
+ properties:
+ caCertificateRefs:
+ description: |-
+ CACertificateRefs contains one or more references to
+ Kubernetes objects that contain TLS certificates of
+ the Certificate Authorities that can be used
+ as a trust anchor to validate the certificates presented by the client.
+
+ A single CA certificate reference to a Kubernetes ConfigMap
+ has "Core" support.
+ Implementations MAY choose to support attaching multiple CA certificates to
+ a Listener, but this behavior is implementation-specific.
+
+ Support: Core - A single reference to a Kubernetes ConfigMap
+ with the CA certificate in a key named `ca.crt`.
+
+ Support: Implementation-specific (More than one certificate in a ConfigMap
+ with different keys or more than one reference, or other kinds of resources).
+
+ References to a resource in a different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+ items:
+ description: |-
+ ObjectReference identifies an API object including its namespace.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When set to the empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent.
+ For example "ConfigMap" or "Service".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ mode:
+ default: AllowValidOnly
+ description: |-
+ FrontendValidationMode defines the mode for validating the client certificate.
+ There are two possible modes:
+
+ - AllowValidOnly: In this mode, the gateway will accept connections only if
+ the client presents a valid certificate. This certificate must successfully
+ pass validation against the CA certificates specified in `CACertificateRefs`.
+ - AllowInsecureFallback: In this mode, the gateway will accept connections
+ even if the client certificate is not presented or fails verification.
+
+ This approach delegates client authorization to the backend and introduce
+ a significant security risk. It should be used in testing environments or
+ on a temporary basis in non-testing environments.
+
+ Defaults to AllowValidOnly.
+
+ Support: Core
+ enum:
+ - AllowValidOnly
+ - AllowInsecureFallback
+ type: string
+ required:
+ - caCertificateRefs
+ type: object
+ type: object
+ required:
+ - port
+ - tls
+ type: object
+ maxItems: 64
+ type: array
+ x-kubernetes-list-map-keys:
+ - port
+ x-kubernetes-list-type: map
+ x-kubernetes-validations:
+ - message: Port for TLS configuration must be unique within
+ the Gateway
+ rule: self.all(t1, self.exists_one(t2, t1.port == t2.port))
+ required:
+ - default
+ type: object
+ type: object
required:
- gatewayClassName
- listeners
@@ -3788,7 +4783,7 @@ spec:
description: Status defines the current state of Gateway.
properties:
addresses:
- description: |+
+ description: |-
Addresses lists the network addresses that have been bound to the
Gateway.
@@ -3798,7 +4793,6 @@ spec:
* no addresses are specified, all addresses are dynamically assigned
* a combination of specified and dynamic addresses are assigned
* a specified address was unusable (e.g. already in use)
-
items:
description: GatewayStatusAddress describes a network address that
is bound to a Gateway.
@@ -3843,6 +4837,7 @@ spec:
true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
conditions:
default:
- lastTransitionTime: "1970-01-01T00:00:00Z"
@@ -4056,6 +5051,7 @@ spec:
type: object
maxItems: 8
type: array
+ x-kubernetes-list-type: atomic
required:
- attachedRoutes
- conditions
@@ -4090,9 +5086,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: grpcroutes.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -4238,8 +5233,9 @@ spec:
type: string
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
parentRefs:
- description: |+
+ description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
to be attached to. Note that the referenced parent resource needs to
allow this for the attachment to be complete. For Gateways, that means
@@ -4301,11 +5297,6 @@ spec:
connections originating from the same namespace as the Route, for which
the intended destination of the connections are a Service targeted as a
ParentRef of the Route.
-
-
-
-
-
items:
description: |-
ParentReference identifies an API object (usually a Gateway) that can be considered
@@ -4455,6 +5446,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -4479,9 +5471,7 @@ spec:
|| p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port
== p2.port))))
rules:
- description: |+
- Rules are a list of GRPC matchers, filters and actions.
-
+ description: Rules are a list of GRPC matchers, filters and actions.
items:
description: |-
GRPCRouteRule defines the semantics for matching a gRPC request based on
@@ -4527,7 +5517,6 @@ spec:
namespace's owner to accept the reference. See the ReferenceGrant
documentation for details.
-
When the BackendRef points to a Kubernetes Service, implementations SHOULD
honor the appProtocol field if it is set for the target Service Port.
@@ -4542,8 +5531,6 @@ spec:
If a Route is not able to send traffic to the backend using the specified
protocol then the backend is considered invalid. Implementations MUST set the
"ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.
-
-
properties:
filters:
description: |-
@@ -4629,7 +5616,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -4704,7 +5691,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -4732,7 +5719,7 @@ spec:
x-kubernetes-list-type: map
type: object
requestMirror:
- description: |+
+ description: |-
RequestMirror defines a schema for a filter that mirrors requests.
Requests are sent to the specified destination, but responses from
that destination are ignored.
@@ -4742,7 +5729,6 @@ spec:
backends.
Support: Extended
-
properties:
backendRef:
description: |-
@@ -4838,13 +5824,12 @@ spec:
rule: '(size(self.group) == 0 && self.kind
== ''Service'') ? has(self.port) : true'
fraction:
- description: |+
+ description: |-
Fraction represents the fraction of requests that should be
mirrored to BackendRef.
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
properties:
denominator:
default: 100
@@ -4863,14 +5848,13 @@ spec:
to denominator
rule: self.numerator <= self.denominator
percent:
- description: |+
+ description: |-
Percent represents the percentage of requests that should be
mirrored to BackendRef. Its minimum value is 0 (indicating 0% of
requests) and its maximum value is 100 (indicating 100% of requests).
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
format: int32
maximum: 100
minimum: 0
@@ -4915,7 +5899,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -4990,7 +5974,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -5018,7 +6002,7 @@ spec:
x-kubernetes-list-type: map
type: object
type:
- description: |+
+ description: |-
Type identifies the type of filter to apply. As with other API fields,
types are classified into three conformance levels:
@@ -5043,7 +6027,6 @@ spec:
If a reference to a custom filter type cannot be resolved, the filter
MUST NOT be skipped. Instead, requests that would have been processed by
that filter MUST receive a HTTP error response.
-
enum:
- ResponseHeaderModifier
- RequestHeaderModifier
@@ -5085,6 +6068,7 @@ spec:
rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: RequestHeaderModifier filter cannot be repeated
rule: self.filter(f, f.type == 'RequestHeaderModifier').size()
@@ -5181,6 +6165,7 @@ spec:
? has(self.port) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
filters:
description: |-
Filters define the filters that are applied to requests that match
@@ -5200,7 +6185,7 @@ spec:
Specifying the same filter multiple times is not supported unless explicitly
indicated in the filter.
- If an implementation can not support a combination of filters, it must clearly
+ If an implementation cannot support a combination of filters, it must clearly
document that limitation. In cases where incompatible or unsupported
filters are specified and cause the `Accepted` condition to be set to status
`False`, implementations may use the `IncompatibleFilters` reason to specify
@@ -5283,7 +6268,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -5357,7 +6342,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -5385,7 +6370,7 @@ spec:
x-kubernetes-list-type: map
type: object
requestMirror:
- description: |+
+ description: |-
RequestMirror defines a schema for a filter that mirrors requests.
Requests are sent to the specified destination, but responses from
that destination are ignored.
@@ -5395,7 +6380,6 @@ spec:
backends.
Support: Extended
-
properties:
backendRef:
description: |-
@@ -5491,13 +6475,12 @@ spec:
rule: '(size(self.group) == 0 && self.kind == ''Service'')
? has(self.port) : true'
fraction:
- description: |+
+ description: |-
Fraction represents the fraction of requests that should be
mirrored to BackendRef.
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
properties:
denominator:
default: 100
@@ -5516,14 +6499,13 @@ spec:
denominator
rule: self.numerator <= self.denominator
percent:
- description: |+
+ description: |-
Percent represents the percentage of requests that should be
mirrored to BackendRef. Its minimum value is 0 (indicating 0% of
requests) and its maximum value is 100 (indicating 100% of requests).
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
format: int32
maximum: 100
minimum: 0
@@ -5567,7 +6549,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -5641,7 +6623,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -5669,7 +6651,7 @@ spec:
x-kubernetes-list-type: map
type: object
type:
- description: |+
+ description: |-
Type identifies the type of filter to apply. As with other API fields,
types are classified into three conformance levels:
@@ -5694,7 +6676,6 @@ spec:
If a reference to a custom filter type cannot be resolved, the filter
MUST NOT be skipped. Instead, requests that would have been processed by
that filter MUST receive a HTTP error response.
-
enum:
- ResponseHeaderModifier
- RequestHeaderModifier
@@ -5735,6 +6716,7 @@ spec:
rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: RequestHeaderModifier filter cannot be repeated
rule: self.filter(f, f.type == 'RequestHeaderModifier').size()
@@ -5910,10 +6892,11 @@ spec:
has(self.method) ? self.method.matches(r"""^[A-Za-z_][A-Za-z_0-9]*$"""):
true'
type: object
- maxItems: 8
+ maxItems: 64
type: array
+ x-kubernetes-list-type: atomic
name:
- description: |
+ description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
Support: Extended
@@ -5922,12 +6905,11 @@ spec:
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
sessionPersistence:
- description: |+
+ description: |-
SessionPersistence defines and configures session persistence
for the route rule.
Support: Extended
-
properties:
absoluteTimeout:
description: |-
@@ -5962,6 +6944,8 @@ spec:
absolute lifetime of the cookie tracked by the gateway and
is optional.
+ Defaults to "Session".
+
Support: Core for "Session" type
Support: Extended for "Permanent" type
@@ -6012,6 +6996,7 @@ spec:
type: object
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: While 16 rules and 64 matches per rule are allowed, the
total number of matches across all rules in a route must be less
@@ -6036,6 +7021,24 @@ spec:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
type: object
status:
description: Status defines the current state of GRPCRoute.
@@ -6079,7 +7082,7 @@ spec:
There are a number of cases where the "Accepted" condition may not be set
due to lack of controller visibility, that includes when:
- * The Route refers to a non-existent parent.
+ * The Route refers to a nonexistent parent.
* The Route is of a type that the controller does not support.
* The Route is in a namespace the controller does not have access to.
items:
@@ -6300,14 +7303,18 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
+ required:
+ - spec
type: object
served: true
storage: true
@@ -6328,9 +7335,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: httproutes.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -6456,8 +7462,9 @@ spec:
type: string
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
parentRefs:
- description: |+
+ description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
to be attached to. Note that the referenced parent resource needs to
allow this for the attachment to be complete. For Gateways, that means
@@ -6519,11 +7526,6 @@ spec:
connections originating from the same namespace as the Route, for which
the intended destination of the connections are a Service targeted as a
ParentRef of the Route.
-
-
-
-
-
items:
description: |-
ParentReference identifies an API object (usually a Gateway) that can be considered
@@ -6673,6 +7675,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -6702,9 +7705,7 @@ spec:
- path:
type: PathPrefix
value: /
- description: |+
- Rules are a list of HTTP matchers, filters and actions.
-
+ description: Rules are a list of HTTP matchers, filters and actions.
items:
description: |-
HTTPRouteRule defines semantics for matching an HTTP request based on
@@ -6757,7 +7758,6 @@ spec:
namespace's owner to accept the reference. See the ReferenceGrant
documentation for details.
-
When the BackendRef points to a Kubernetes Service, implementations SHOULD
honor the appProtocol field if it is set for the target Service Port.
@@ -6772,8 +7772,6 @@ spec:
If a Route is not able to send traffic to the backend using the specified
protocol then the backend is considered invalid. Implementations MUST set the
"ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.
-
-
properties:
filters:
description: |-
@@ -6791,6 +7789,290 @@ spec:
authentication strategies, rate-limiting, and traffic shaping. API
guarantee/conformance is defined based on the type of the filter.
properties:
+ cors:
+ description: |-
+ CORS defines a schema for a filter that responds to the
+ cross-origin request based on HTTP response header.
+
+ Support: Extended
+ properties:
+ allowCredentials:
+ description: |-
+ AllowCredentials indicates whether the actual cross-origin request allows
+ to include credentials.
+
+ When set to true, the gateway will include the `Access-Control-Allow-Credentials`
+ response header with value true (case-sensitive).
+
+ When set to false or omitted the gateway will omit the header
+ `Access-Control-Allow-Credentials` entirely (this is the standard CORS
+ behavior).
+
+ Support: Extended
+ type: boolean
+ allowHeaders:
+ description: |-
+ AllowHeaders indicates which HTTP request headers are supported for
+ accessing the requested resource.
+
+ Header names are not case sensitive.
+
+ Multiple header names in the value of the `Access-Control-Allow-Headers`
+ response header are separated by a comma (",").
+
+ When the `AllowHeaders` field is configured with one or more headers, the
+ gateway must return the `Access-Control-Allow-Headers` response header
+ which value is present in the `AllowHeaders` field.
+
+ If any header name in the `Access-Control-Request-Headers` request header
+ is not included in the list of header names specified by the response
+ header `Access-Control-Allow-Headers`, it will present an error on the
+ client side.
+
+ If any header name in the `Access-Control-Allow-Headers` response header
+ does not recognize by the client, it will also occur an error on the
+ client side.
+
+ A wildcard indicates that the requests with all HTTP headers are allowed.
+ The `Access-Control-Allow-Headers` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowHeaders` field
+ specified with the `*` wildcard, the gateway must specify one or more
+ HTTP headers in the value of the `Access-Control-Allow-Headers` response
+ header. The value of the header `Access-Control-Allow-Headers` is same as
+ the `Access-Control-Request-Headers` header provided by the client. If
+ the header `Access-Control-Request-Headers` is not included in the
+ request, the gateway will omit the `Access-Control-Allow-Headers`
+ response header, instead of specifying the `*` wildcard. A Gateway
+ implementation may choose to add implementation-specific default headers.
+
+ Support: Extended
+ items:
+ description: |-
+ HTTPHeaderName is the name of an HTTP header.
+
+ Valid values include:
+
+ * "Authorization"
+ * "Set-Cookie"
+
+ Invalid values include:
+
+ - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo
+ headers are not currently supported by this type.
+ - "/invalid" - "/ " is an invalid character
+ maxLength: 256
+ minLength: 1
+ pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ allowMethods:
+ description: |-
+ AllowMethods indicates which HTTP methods are supported for accessing the
+ requested resource.
+
+ Valid values are any method defined by RFC9110, along with the special
+ value `*`, which represents all HTTP methods are allowed.
+
+ Method names are case sensitive, so these values are also case-sensitive.
+ (See https://www.rfc-editor.org/rfc/rfc2616#section-5.1.1)
+
+ Multiple method names in the value of the `Access-Control-Allow-Methods`
+ response header are separated by a comma (",").
+
+ A CORS-safelisted method is a method that is `GET`, `HEAD`, or `POST`.
+ (See https://fetch.spec.whatwg.org/#cors-safelisted-method) The
+ CORS-safelisted methods are always allowed, regardless of whether they
+ are specified in the `AllowMethods` field.
+
+ When the `AllowMethods` field is configured with one or more methods, the
+ gateway must return the `Access-Control-Allow-Methods` response header
+ which value is present in the `AllowMethods` field.
+
+ If the HTTP method of the `Access-Control-Request-Method` request header
+ is not included in the list of methods specified by the response header
+ `Access-Control-Allow-Methods`, it will present an error on the client
+ side.
+
+ The `Access-Control-Allow-Methods` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowMethods` field
+ specified with the `*` wildcard, the gateway must specify one HTTP method
+ in the value of the Access-Control-Allow-Methods response header. The
+ value of the header `Access-Control-Allow-Methods` is same as the
+ `Access-Control-Request-Method` header provided by the client. If the
+ header `Access-Control-Request-Method` is not included in the request,
+ the gateway will omit the `Access-Control-Allow-Methods` response header,
+ instead of specifying the `*` wildcard. A Gateway implementation may
+ choose to add implementation-specific default methods.
+
+ Support: Extended
+ items:
+ enum:
+ - GET
+ - HEAD
+ - POST
+ - PUT
+ - DELETE
+ - CONNECT
+ - OPTIONS
+ - TRACE
+ - PATCH
+ - '*'
+ type: string
+ maxItems: 9
+ type: array
+ x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowMethods cannot contain '*' alongside
+ other methods
+ rule: '!(''*'' in self && self.size() > 1)'
+ allowOrigins:
+ description: |-
+ AllowOrigins indicates whether the response can be shared with requested
+ resource from the given `Origin`.
+
+ The `Origin` consists of a scheme and a host, with an optional port, and
+ takes the form `://(:)`.
+
+ Valid values for scheme are: `http` and `https`.
+
+ Valid values for port are any integer between 1 and 65535 (the list of
+ available TCP/UDP ports). Note that, if not included, port `80` is
+ assumed for `http` scheme origins, and port `443` is assumed for `https`
+ origins. This may affect origin matching.
+
+ The host part of the origin may contain the wildcard character `*`. These
+ wildcard characters behave as follows:
+
+ * `*` is a greedy match to the _left_, including any number of
+ DNS labels to the left of its position. This also means that
+ `*` will include any number of period `.` characters to the
+ left of its position.
+ * A wildcard by itself matches all hosts.
+
+ An origin value that includes _only_ the `*` character indicates requests
+ from all `Origin`s are allowed.
+
+ When the `AllowOrigins` field is configured with multiple origins, it
+ means the server supports clients from multiple origins. If the request
+ `Origin` matches the configured allowed origins, the gateway must return
+ the given `Origin` and sets value of the header
+ `Access-Control-Allow-Origin` same as the `Origin` header provided by the
+ client.
+
+ The status code of a successful response to a "preflight" request is
+ always an OK status (i.e., 204 or 200).
+
+ If the request `Origin` does not match the configured allowed origins,
+ the gateway returns 204/200 response but doesn't set the relevant
+ cross-origin response headers. Alternatively, the gateway responds with
+ 403 status to the "preflight" request is denied, coupled with omitting
+ the CORS headers. The cross-origin request fails on the client side.
+ Therefore, the client doesn't attempt the actual cross-origin request.
+
+ The `Access-Control-Allow-Origin` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowOrigins` field
+ specified with the `*` wildcard, the gateway must return a single origin
+ in the value of the `Access-Control-Allow-Origin` response header,
+ instead of specifying the `*` wildcard. The value of the header
+ `Access-Control-Allow-Origin` is same as the `Origin` header provided by
+ the client.
+
+ Support: Extended
+ items:
+ description: |-
+ The CORSOrigin MUST NOT be a relative URI, and it MUST follow the URI syntax and
+ encoding rules specified in RFC3986. The CORSOrigin MUST include both a
+ scheme (e.g., "http" or "spiffe") and a scheme-specific-part, or it should be a single '*' character.
+ URIs that include an authority MUST include a fully qualified domain name or
+ IP address as the host.
+ maxLength: 253
+ minLength: 1
+ pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$)
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowOrigins cannot contain '*' alongside
+ other origins
+ rule: '!(''*'' in self && self.size() > 1)'
+ exposeHeaders:
+ description: |-
+ ExposeHeaders indicates which HTTP response headers can be exposed
+ to client-side scripts in response to a cross-origin request.
+
+ A CORS-safelisted response header is an HTTP header in a CORS response
+ that it is considered safe to expose to the client scripts.
+ The CORS-safelisted response headers include the following headers:
+ `Cache-Control`
+ `Content-Language`
+ `Content-Length`
+ `Content-Type`
+ `Expires`
+ `Last-Modified`
+ `Pragma`
+ (See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name)
+ The CORS-safelisted response headers are exposed to client by default.
+
+ When an HTTP header name is specified using the `ExposeHeaders` field,
+ this additional header will be exposed as part of the response to the
+ client.
+
+ Header names are not case sensitive.
+
+ Multiple header names in the value of the `Access-Control-Expose-Headers`
+ response header are separated by a comma (",").
+
+ A wildcard indicates that the responses with all HTTP headers are exposed
+ to clients. The `Access-Control-Expose-Headers` response header can only
+ use `*` wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ Support: Extended
+ items:
+ description: |-
+ HTTPHeaderName is the name of an HTTP header.
+
+ Valid values include:
+
+ * "Authorization"
+ * "Set-Cookie"
+
+ Invalid values include:
+
+ - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo
+ headers are not currently supported by this type.
+ - "/invalid" - "/ " is an invalid character
+ maxLength: 256
+ minLength: 1
+ pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ maxAge:
+ default: 5
+ description: |-
+ MaxAge indicates the duration (in seconds) for the client to cache the
+ results of a "preflight" request.
+
+ The information provided by the `Access-Control-Allow-Methods` and
+ `Access-Control-Allow-Headers` response headers can be cached by the
+ client until the time specified by `Access-Control-Max-Age` elapses.
+
+ The default value of `Access-Control-Max-Age` response header is 5
+ (seconds).
+ format: int32
+ minimum: 1
+ type: integer
+ type: object
extensionRef:
description: |-
ExtensionRef is an optional, implementation-specific extension to the
@@ -6826,6 +8108,253 @@ spec:
- kind
- name
type: object
+ externalAuth:
+ description: |-
+ ExternalAuth configures settings related to sending request details
+ to an external auth service. The external service MUST authenticate
+ the request, and MAY authorize the request as well.
+
+ If there is any problem communicating with the external service,
+ this filter MUST fail closed.
+
+ Support: Extended
+ properties:
+ backendRef:
+ description: |-
+ BackendRef is a reference to a backend to send authorization
+ requests to.
+
+ The backend must speak the selected protocol (GRPC or HTTP) on the
+ referenced port.
+
+ If the backend service requires TLS, use BackendTLSPolicy to tell the
+ implementation to supply the TLS details to be used to connect to that
+ backend.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind
+ == ''Service'') ? has(self.port) : true'
+ forwardBody:
+ description: |-
+ ForwardBody controls if requests to the authorization server should include
+ the body of the client request; and if so, how big that body is allowed
+ to be.
+
+ It is expected that implementations will buffer the request body up to
+ `forwardBody.maxSize` bytes. Bodies over that size must be rejected with a
+ 4xx series error (413 or 403 are common examples), and fail processing
+ of the filter.
+
+ If unset, or `forwardBody.maxSize` is set to `0`, then the body will not
+ be forwarded.
+
+ Feature Name: HTTPRouteExternalAuthForwardBody
+ properties:
+ maxSize:
+ description: |-
+ MaxSize specifies how large in bytes the largest body that will be buffered
+ and sent to the authorization server. If the body size is larger than
+ `maxSize`, then the body sent to the authorization server must be
+ truncated to `maxSize` bytes.
+
+ Experimental note: This behavior needs to be checked against
+ various dataplanes; it may need to be changed.
+ See https://github.com/kubernetes-sigs/gateway-api/pull/4001#discussion_r2291405746
+ for more.
+
+ If 0, the body will not be sent to the authorization server.
+ type: integer
+ type: object
+ grpc:
+ description: |-
+ GRPCAuthConfig contains configuration for communication with ext_authz
+ protocol-speaking backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what headers from the client request
+ will be sent to the authorization server.
+
+ If this list is empty, then all headers must be sent.
+
+ If the list has entries, only those entries must be sent.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ type: object
+ http:
+ description: |-
+ HTTPAuthConfig contains configuration for communication with HTTP-speaking
+ backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what additional headers from the client request
+ will be sent to the authorization server.
+
+ The following headers must always be sent to the authorization server,
+ regardless of this setting:
+
+ * `Host`
+ * `Method`
+ * `Path`
+ * `Content-Length`
+ * `Authorization`
+
+ If this list is empty, then only those headers must be sent.
+
+ Note that `Content-Length` has a special behavior, in that the length
+ sent must be correct for the actual request to the external authorization
+ server - that is, it must reflect the actual number of bytes sent in the
+ body of the request to the authorization server.
+
+ So if the `forwardBody` stanza is unset, or `forwardBody.maxSize` is set
+ to `0`, then `Content-Length` must be `0`. If `forwardBody.maxSize` is set
+ to anything other than `0`, then the `Content-Length` of the authorization
+ request must be set to the actual number of bytes forwarded.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ allowedResponseHeaders:
+ description: |-
+ AllowedResponseHeaders specifies what headers from the authorization response
+ will be copied into the request to the backend.
+
+ If this list is empty, then all headers from the authorization server
+ except Authority or Host must be copied.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ path:
+ description: |-
+ Path sets the prefix that paths from the client request will have added
+ when forwarded to the authorization server.
+
+ When empty or unspecified, no prefix is added.
+
+ Valid values are the same as the "value" regex for path values in the `match`
+ stanza, and the validation regex will screen out invalid paths in the same way.
+ Even with the validation, implementations MUST sanitize this input before using it
+ directly.
+ maxLength: 1024
+ pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$
+ type: string
+ type: object
+ protocol:
+ description: |-
+ ExternalAuthProtocol describes which protocol to use when communicating with an
+ ext_authz authorization server.
+
+ When this is set to GRPC, each backend must use the Envoy ext_authz protocol
+ on the port specified in `backendRefs`. Requests and responses are defined
+ in the protobufs explained at:
+ https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto
+
+ When this is set to HTTP, each backend must respond with a `200` status
+ code in on a successful authorization. Any other code is considered
+ an authorization failure.
+
+ Feature Names:
+ GRPC Support - HTTPRouteExternalAuthGRPC
+ HTTP Support - HTTPRouteExternalAuthHTTP
+ enum:
+ - HTTP
+ - GRPC
+ type: string
+ required:
+ - backendRef
+ - protocol
+ type: object
+ x-kubernetes-validations:
+ - message: grpc must be specified when protocol
+ is set to 'GRPC'
+ rule: 'self.protocol == ''GRPC'' ? has(self.grpc)
+ : true'
+ - message: protocol must be 'GRPC' when grpc is
+ set
+ rule: 'has(self.grpc) ? self.protocol == ''GRPC''
+ : true'
+ - message: http must be specified when protocol
+ is set to 'HTTP'
+ rule: 'self.protocol == ''HTTP'' ? has(self.http)
+ : true'
+ - message: protocol must be 'HTTP' when http is
+ set
+ rule: 'has(self.http) ? self.protocol == ''HTTP''
+ : true'
requestHeaderModifier:
description: |-
RequestHeaderModifier defines a schema for a filter that modifies request
@@ -6859,7 +8388,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -6934,7 +8463,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -6962,7 +8491,7 @@ spec:
x-kubernetes-list-type: map
type: object
requestMirror:
- description: |+
+ description: |-
RequestMirror defines a schema for a filter that mirrors requests.
Requests are sent to the specified destination, but responses from
that destination are ignored.
@@ -6972,7 +8501,6 @@ spec:
backends.
Support: Extended
-
properties:
backendRef:
description: |-
@@ -7068,13 +8596,12 @@ spec:
rule: '(size(self.group) == 0 && self.kind
== ''Service'') ? has(self.port) : true'
fraction:
- description: |+
+ description: |-
Fraction represents the fraction of requests that should be
mirrored to BackendRef.
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
properties:
denominator:
default: 100
@@ -7093,14 +8620,13 @@ spec:
to denominator
rule: self.numerator <= self.denominator
percent:
- description: |+
+ description: |-
Percent represents the percentage of requests that should be
mirrored to BackendRef. Its minimum value is 0 (indicating 0% of
requests) and its maximum value is 100 (indicating 100% of requests).
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
format: int32
maximum: 100
minimum: 0
@@ -7298,7 +8824,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -7373,7 +8899,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -7441,6 +8967,8 @@ spec:
- RequestRedirect
- URLRewrite
- ExtensionRef
+ - CORS
+ - ExternalAuth
type: string
urlRewrite:
description: |-
@@ -7573,13 +9101,21 @@ spec:
- message: filter.extensionRef must be specified for
ExtensionRef filter.type
rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'
+ - message: filter.cors must be nil if the filter.type
+ is not CORS
+ rule: '!(has(self.cors) && self.type != ''CORS'')'
+ - message: filter.cors must be specified for CORS filter.type
+ rule: '!(!has(self.cors) && self.type == ''CORS'')'
+ - message: filter.externalAuth must be nil if the filter.type
+ is not ExternalAuth
+ rule: '!(has(self.externalAuth) && self.type != ''ExternalAuth'')'
+ - message: filter.externalAuth must be specified for
+ ExternalAuth filter.type
+ rule: '!(!has(self.externalAuth) && self.type == ''ExternalAuth'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- - message: May specify either httpRouteFilterRequestRedirect
- or httpRouteFilterRequestRewrite, but not both
- rule: '!(self.exists(f, f.type == ''RequestRedirect'')
- && self.exists(f, f.type == ''URLRewrite''))'
- message: May specify either httpRouteFilterRequestRedirect
or httpRouteFilterRequestRewrite, but not both
rule: '!(self.exists(f, f.type == ''RequestRedirect'')
@@ -7685,6 +9221,7 @@ spec:
? has(self.port) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
filters:
description: |-
Filters define the filters that are applied to requests that match
@@ -7694,7 +9231,7 @@ spec:
they are specified.
Implementations MAY choose to implement this ordering strictly, rejecting
- any combination or order of filters that can not be supported. If implementations
+ any combination or order of filters that cannot be supported. If implementations
choose a strict interpretation of filter ordering, they MUST clearly document
that behavior.
@@ -7716,7 +9253,7 @@ spec:
All filters are expected to be compatible with each other except for the
URLRewrite and RequestRedirect filters, which may not be combined. If an
- implementation can not support other combinations of filters, they must clearly
+ implementation cannot support other combinations of filters, they must clearly
document that limitation. In cases where incompatible or unsupported
filters are specified and cause the `Accepted` condition to be set to status
`False`, implementations may use the `IncompatibleFilters` reason to specify
@@ -7732,6 +9269,290 @@ spec:
authentication strategies, rate-limiting, and traffic shaping. API
guarantee/conformance is defined based on the type of the filter.
properties:
+ cors:
+ description: |-
+ CORS defines a schema for a filter that responds to the
+ cross-origin request based on HTTP response header.
+
+ Support: Extended
+ properties:
+ allowCredentials:
+ description: |-
+ AllowCredentials indicates whether the actual cross-origin request allows
+ to include credentials.
+
+ When set to true, the gateway will include the `Access-Control-Allow-Credentials`
+ response header with value true (case-sensitive).
+
+ When set to false or omitted the gateway will omit the header
+ `Access-Control-Allow-Credentials` entirely (this is the standard CORS
+ behavior).
+
+ Support: Extended
+ type: boolean
+ allowHeaders:
+ description: |-
+ AllowHeaders indicates which HTTP request headers are supported for
+ accessing the requested resource.
+
+ Header names are not case sensitive.
+
+ Multiple header names in the value of the `Access-Control-Allow-Headers`
+ response header are separated by a comma (",").
+
+ When the `AllowHeaders` field is configured with one or more headers, the
+ gateway must return the `Access-Control-Allow-Headers` response header
+ which value is present in the `AllowHeaders` field.
+
+ If any header name in the `Access-Control-Request-Headers` request header
+ is not included in the list of header names specified by the response
+ header `Access-Control-Allow-Headers`, it will present an error on the
+ client side.
+
+ If any header name in the `Access-Control-Allow-Headers` response header
+ does not recognize by the client, it will also occur an error on the
+ client side.
+
+ A wildcard indicates that the requests with all HTTP headers are allowed.
+ The `Access-Control-Allow-Headers` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowHeaders` field
+ specified with the `*` wildcard, the gateway must specify one or more
+ HTTP headers in the value of the `Access-Control-Allow-Headers` response
+ header. The value of the header `Access-Control-Allow-Headers` is same as
+ the `Access-Control-Request-Headers` header provided by the client. If
+ the header `Access-Control-Request-Headers` is not included in the
+ request, the gateway will omit the `Access-Control-Allow-Headers`
+ response header, instead of specifying the `*` wildcard. A Gateway
+ implementation may choose to add implementation-specific default headers.
+
+ Support: Extended
+ items:
+ description: |-
+ HTTPHeaderName is the name of an HTTP header.
+
+ Valid values include:
+
+ * "Authorization"
+ * "Set-Cookie"
+
+ Invalid values include:
+
+ - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo
+ headers are not currently supported by this type.
+ - "/invalid" - "/ " is an invalid character
+ maxLength: 256
+ minLength: 1
+ pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ allowMethods:
+ description: |-
+ AllowMethods indicates which HTTP methods are supported for accessing the
+ requested resource.
+
+ Valid values are any method defined by RFC9110, along with the special
+ value `*`, which represents all HTTP methods are allowed.
+
+ Method names are case sensitive, so these values are also case-sensitive.
+ (See https://www.rfc-editor.org/rfc/rfc2616#section-5.1.1)
+
+ Multiple method names in the value of the `Access-Control-Allow-Methods`
+ response header are separated by a comma (",").
+
+ A CORS-safelisted method is a method that is `GET`, `HEAD`, or `POST`.
+ (See https://fetch.spec.whatwg.org/#cors-safelisted-method) The
+ CORS-safelisted methods are always allowed, regardless of whether they
+ are specified in the `AllowMethods` field.
+
+ When the `AllowMethods` field is configured with one or more methods, the
+ gateway must return the `Access-Control-Allow-Methods` response header
+ which value is present in the `AllowMethods` field.
+
+ If the HTTP method of the `Access-Control-Request-Method` request header
+ is not included in the list of methods specified by the response header
+ `Access-Control-Allow-Methods`, it will present an error on the client
+ side.
+
+ The `Access-Control-Allow-Methods` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowMethods` field
+ specified with the `*` wildcard, the gateway must specify one HTTP method
+ in the value of the Access-Control-Allow-Methods response header. The
+ value of the header `Access-Control-Allow-Methods` is same as the
+ `Access-Control-Request-Method` header provided by the client. If the
+ header `Access-Control-Request-Method` is not included in the request,
+ the gateway will omit the `Access-Control-Allow-Methods` response header,
+ instead of specifying the `*` wildcard. A Gateway implementation may
+ choose to add implementation-specific default methods.
+
+ Support: Extended
+ items:
+ enum:
+ - GET
+ - HEAD
+ - POST
+ - PUT
+ - DELETE
+ - CONNECT
+ - OPTIONS
+ - TRACE
+ - PATCH
+ - '*'
+ type: string
+ maxItems: 9
+ type: array
+ x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowMethods cannot contain '*' alongside
+ other methods
+ rule: '!(''*'' in self && self.size() > 1)'
+ allowOrigins:
+ description: |-
+ AllowOrigins indicates whether the response can be shared with requested
+ resource from the given `Origin`.
+
+ The `Origin` consists of a scheme and a host, with an optional port, and
+ takes the form `://(:)`.
+
+ Valid values for scheme are: `http` and `https`.
+
+ Valid values for port are any integer between 1 and 65535 (the list of
+ available TCP/UDP ports). Note that, if not included, port `80` is
+ assumed for `http` scheme origins, and port `443` is assumed for `https`
+ origins. This may affect origin matching.
+
+ The host part of the origin may contain the wildcard character `*`. These
+ wildcard characters behave as follows:
+
+ * `*` is a greedy match to the _left_, including any number of
+ DNS labels to the left of its position. This also means that
+ `*` will include any number of period `.` characters to the
+ left of its position.
+ * A wildcard by itself matches all hosts.
+
+ An origin value that includes _only_ the `*` character indicates requests
+ from all `Origin`s are allowed.
+
+ When the `AllowOrigins` field is configured with multiple origins, it
+ means the server supports clients from multiple origins. If the request
+ `Origin` matches the configured allowed origins, the gateway must return
+ the given `Origin` and sets value of the header
+ `Access-Control-Allow-Origin` same as the `Origin` header provided by the
+ client.
+
+ The status code of a successful response to a "preflight" request is
+ always an OK status (i.e., 204 or 200).
+
+ If the request `Origin` does not match the configured allowed origins,
+ the gateway returns 204/200 response but doesn't set the relevant
+ cross-origin response headers. Alternatively, the gateway responds with
+ 403 status to the "preflight" request is denied, coupled with omitting
+ the CORS headers. The cross-origin request fails on the client side.
+ Therefore, the client doesn't attempt the actual cross-origin request.
+
+ The `Access-Control-Allow-Origin` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowOrigins` field
+ specified with the `*` wildcard, the gateway must return a single origin
+ in the value of the `Access-Control-Allow-Origin` response header,
+ instead of specifying the `*` wildcard. The value of the header
+ `Access-Control-Allow-Origin` is same as the `Origin` header provided by
+ the client.
+
+ Support: Extended
+ items:
+ description: |-
+ The CORSOrigin MUST NOT be a relative URI, and it MUST follow the URI syntax and
+ encoding rules specified in RFC3986. The CORSOrigin MUST include both a
+ scheme (e.g., "http" or "spiffe") and a scheme-specific-part, or it should be a single '*' character.
+ URIs that include an authority MUST include a fully qualified domain name or
+ IP address as the host.
+ maxLength: 253
+ minLength: 1
+ pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$)
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowOrigins cannot contain '*' alongside
+ other origins
+ rule: '!(''*'' in self && self.size() > 1)'
+ exposeHeaders:
+ description: |-
+ ExposeHeaders indicates which HTTP response headers can be exposed
+ to client-side scripts in response to a cross-origin request.
+
+ A CORS-safelisted response header is an HTTP header in a CORS response
+ that it is considered safe to expose to the client scripts.
+ The CORS-safelisted response headers include the following headers:
+ `Cache-Control`
+ `Content-Language`
+ `Content-Length`
+ `Content-Type`
+ `Expires`
+ `Last-Modified`
+ `Pragma`
+ (See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name)
+ The CORS-safelisted response headers are exposed to client by default.
+
+ When an HTTP header name is specified using the `ExposeHeaders` field,
+ this additional header will be exposed as part of the response to the
+ client.
+
+ Header names are not case sensitive.
+
+ Multiple header names in the value of the `Access-Control-Expose-Headers`
+ response header are separated by a comma (",").
+
+ A wildcard indicates that the responses with all HTTP headers are exposed
+ to clients. The `Access-Control-Expose-Headers` response header can only
+ use `*` wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ Support: Extended
+ items:
+ description: |-
+ HTTPHeaderName is the name of an HTTP header.
+
+ Valid values include:
+
+ * "Authorization"
+ * "Set-Cookie"
+
+ Invalid values include:
+
+ - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo
+ headers are not currently supported by this type.
+ - "/invalid" - "/ " is an invalid character
+ maxLength: 256
+ minLength: 1
+ pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ maxAge:
+ default: 5
+ description: |-
+ MaxAge indicates the duration (in seconds) for the client to cache the
+ results of a "preflight" request.
+
+ The information provided by the `Access-Control-Allow-Methods` and
+ `Access-Control-Allow-Headers` response headers can be cached by the
+ client until the time specified by `Access-Control-Max-Age` elapses.
+
+ The default value of `Access-Control-Max-Age` response header is 5
+ (seconds).
+ format: int32
+ minimum: 1
+ type: integer
+ type: object
extensionRef:
description: |-
ExtensionRef is an optional, implementation-specific extension to the
@@ -7767,6 +9588,251 @@ spec:
- kind
- name
type: object
+ externalAuth:
+ description: |-
+ ExternalAuth configures settings related to sending request details
+ to an external auth service. The external service MUST authenticate
+ the request, and MAY authorize the request as well.
+
+ If there is any problem communicating with the external service,
+ this filter MUST fail closed.
+
+ Support: Extended
+ properties:
+ backendRef:
+ description: |-
+ BackendRef is a reference to a backend to send authorization
+ requests to.
+
+ The backend must speak the selected protocol (GRPC or HTTP) on the
+ referenced port.
+
+ If the backend service requires TLS, use BackendTLSPolicy to tell the
+ implementation to supply the TLS details to be used to connect to that
+ backend.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind == ''Service'')
+ ? has(self.port) : true'
+ forwardBody:
+ description: |-
+ ForwardBody controls if requests to the authorization server should include
+ the body of the client request; and if so, how big that body is allowed
+ to be.
+
+ It is expected that implementations will buffer the request body up to
+ `forwardBody.maxSize` bytes. Bodies over that size must be rejected with a
+ 4xx series error (413 or 403 are common examples), and fail processing
+ of the filter.
+
+ If unset, or `forwardBody.maxSize` is set to `0`, then the body will not
+ be forwarded.
+
+ Feature Name: HTTPRouteExternalAuthForwardBody
+ properties:
+ maxSize:
+ description: |-
+ MaxSize specifies how large in bytes the largest body that will be buffered
+ and sent to the authorization server. If the body size is larger than
+ `maxSize`, then the body sent to the authorization server must be
+ truncated to `maxSize` bytes.
+
+ Experimental note: This behavior needs to be checked against
+ various dataplanes; it may need to be changed.
+ See https://github.com/kubernetes-sigs/gateway-api/pull/4001#discussion_r2291405746
+ for more.
+
+ If 0, the body will not be sent to the authorization server.
+ type: integer
+ type: object
+ grpc:
+ description: |-
+ GRPCAuthConfig contains configuration for communication with ext_authz
+ protocol-speaking backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what headers from the client request
+ will be sent to the authorization server.
+
+ If this list is empty, then all headers must be sent.
+
+ If the list has entries, only those entries must be sent.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ type: object
+ http:
+ description: |-
+ HTTPAuthConfig contains configuration for communication with HTTP-speaking
+ backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what additional headers from the client request
+ will be sent to the authorization server.
+
+ The following headers must always be sent to the authorization server,
+ regardless of this setting:
+
+ * `Host`
+ * `Method`
+ * `Path`
+ * `Content-Length`
+ * `Authorization`
+
+ If this list is empty, then only those headers must be sent.
+
+ Note that `Content-Length` has a special behavior, in that the length
+ sent must be correct for the actual request to the external authorization
+ server - that is, it must reflect the actual number of bytes sent in the
+ body of the request to the authorization server.
+
+ So if the `forwardBody` stanza is unset, or `forwardBody.maxSize` is set
+ to `0`, then `Content-Length` must be `0`. If `forwardBody.maxSize` is set
+ to anything other than `0`, then the `Content-Length` of the authorization
+ request must be set to the actual number of bytes forwarded.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ allowedResponseHeaders:
+ description: |-
+ AllowedResponseHeaders specifies what headers from the authorization response
+ will be copied into the request to the backend.
+
+ If this list is empty, then all headers from the authorization server
+ except Authority or Host must be copied.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ path:
+ description: |-
+ Path sets the prefix that paths from the client request will have added
+ when forwarded to the authorization server.
+
+ When empty or unspecified, no prefix is added.
+
+ Valid values are the same as the "value" regex for path values in the `match`
+ stanza, and the validation regex will screen out invalid paths in the same way.
+ Even with the validation, implementations MUST sanitize this input before using it
+ directly.
+ maxLength: 1024
+ pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$
+ type: string
+ type: object
+ protocol:
+ description: |-
+ ExternalAuthProtocol describes which protocol to use when communicating with an
+ ext_authz authorization server.
+
+ When this is set to GRPC, each backend must use the Envoy ext_authz protocol
+ on the port specified in `backendRefs`. Requests and responses are defined
+ in the protobufs explained at:
+ https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto
+
+ When this is set to HTTP, each backend must respond with a `200` status
+ code in on a successful authorization. Any other code is considered
+ an authorization failure.
+
+ Feature Names:
+ GRPC Support - HTTPRouteExternalAuthGRPC
+ HTTP Support - HTTPRouteExternalAuthHTTP
+ enum:
+ - HTTP
+ - GRPC
+ type: string
+ required:
+ - backendRef
+ - protocol
+ type: object
+ x-kubernetes-validations:
+ - message: grpc must be specified when protocol is set
+ to 'GRPC'
+ rule: 'self.protocol == ''GRPC'' ? has(self.grpc) :
+ true'
+ - message: protocol must be 'GRPC' when grpc is set
+ rule: 'has(self.grpc) ? self.protocol == ''GRPC'' :
+ true'
+ - message: http must be specified when protocol is set
+ to 'HTTP'
+ rule: 'self.protocol == ''HTTP'' ? has(self.http) :
+ true'
+ - message: protocol must be 'HTTP' when http is set
+ rule: 'has(self.http) ? self.protocol == ''HTTP'' :
+ true'
requestHeaderModifier:
description: |-
RequestHeaderModifier defines a schema for a filter that modifies request
@@ -7799,7 +9865,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -7873,7 +9939,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -7901,7 +9967,7 @@ spec:
x-kubernetes-list-type: map
type: object
requestMirror:
- description: |+
+ description: |-
RequestMirror defines a schema for a filter that mirrors requests.
Requests are sent to the specified destination, but responses from
that destination are ignored.
@@ -7911,7 +9977,6 @@ spec:
backends.
Support: Extended
-
properties:
backendRef:
description: |-
@@ -8007,13 +10072,12 @@ spec:
rule: '(size(self.group) == 0 && self.kind == ''Service'')
? has(self.port) : true'
fraction:
- description: |+
+ description: |-
Fraction represents the fraction of requests that should be
mirrored to BackendRef.
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
properties:
denominator:
default: 100
@@ -8032,14 +10096,13 @@ spec:
denominator
rule: self.numerator <= self.denominator
percent:
- description: |+
+ description: |-
Percent represents the percentage of requests that should be
mirrored to BackendRef. Its minimum value is 0 (indicating 0% of
requests) and its maximum value is 100 (indicating 100% of requests).
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
format: int32
maximum: 100
minimum: 0
@@ -8236,7 +10299,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -8310,7 +10373,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -8378,6 +10441,8 @@ spec:
- RequestRedirect
- URLRewrite
- ExtensionRef
+ - CORS
+ - ExternalAuth
type: string
urlRewrite:
description: |-
@@ -8507,8 +10572,20 @@ spec:
- message: filter.extensionRef must be specified for ExtensionRef
filter.type
rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'
+ - message: filter.cors must be nil if the filter.type is not
+ CORS
+ rule: '!(has(self.cors) && self.type != ''CORS'')'
+ - message: filter.cors must be specified for CORS filter.type
+ rule: '!(!has(self.cors) && self.type == ''CORS'')'
+ - message: filter.externalAuth must be nil if the filter.type
+ is not ExternalAuth
+ rule: '!(has(self.externalAuth) && self.type != ''ExternalAuth'')'
+ - message: filter.externalAuth must be specified for ExternalAuth
+ filter.type
+ rule: '!(!has(self.externalAuth) && self.type == ''ExternalAuth'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: May specify either httpRouteFilterRequestRedirect
or httpRouteFilterRequestRewrite, but not both
@@ -8610,7 +10687,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, only the first
entry with an equivalent name MUST be considered for a match. Subsequent
@@ -8820,8 +10897,9 @@ spec:
type: object
maxItems: 64
type: array
+ x-kubernetes-list-type: atomic
name:
- description: |
+ description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
Support: Extended
@@ -8830,15 +10908,14 @@ spec:
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
retry:
- description: |+
+ description: |-
Retry defines the configuration for when to retry an HTTP request.
Support: Extended
-
properties:
attempts:
description: |-
- Attempts specifies the maxmimum number of times an individual request
+ Attempts specifies the maximum number of times an individual request
from the gateway to a backend should be retried.
If the maximum number of retries has been attempted without a successful
@@ -8912,20 +10989,18 @@ spec:
Implementations MAY support specifying discrete values in the 400-499 range,
which are often inadvisable to retry.
-
-
maximum: 599
minimum: 400
type: integer
type: array
+ x-kubernetes-list-type: atomic
type: object
sessionPersistence:
- description: |+
+ description: |-
SessionPersistence defines and configures session persistence
for the route rule.
Support: Extended
-
properties:
absoluteTimeout:
description: |-
@@ -8960,6 +11035,8 @@ spec:
absolute lifetime of the cookie tracked by the gateway and
is optional.
+ Defaults to "Session".
+
Support: Core for "Session" type
Support: Extended for "Permanent" type
@@ -9112,6 +11189,7 @@ spec:
!= ''PathPrefix'') ? false : true) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: While 16 rules and 64 matches per rule are allowed, the
total number of matches across all rules in a route must be less
@@ -9130,6 +11208,24 @@ spec:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
type: object
status:
description: Status defines the current state of HTTPRoute.
@@ -9173,7 +11269,7 @@ spec:
There are a number of cases where the "Accepted" condition may not be set
due to lack of controller visibility, that includes when:
- * The Route refers to a non-existent parent.
+ * The Route refers to a nonexistent parent.
* The Route is of a type that the controller does not support.
* The Route is in a namespace the controller does not have access to.
items:
@@ -9394,11 +11490,13 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -9522,8 +11620,9 @@ spec:
type: string
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
parentRefs:
- description: |+
+ description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
to be attached to. Note that the referenced parent resource needs to
allow this for the attachment to be complete. For Gateways, that means
@@ -9585,11 +11684,6 @@ spec:
connections originating from the same namespace as the Route, for which
the intended destination of the connections are a Service targeted as a
ParentRef of the Route.
-
-
-
-
-
items:
description: |-
ParentReference identifies an API object (usually a Gateway) that can be considered
@@ -9739,6 +11833,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -9768,9 +11863,7 @@ spec:
- path:
type: PathPrefix
value: /
- description: |+
- Rules are a list of HTTP matchers, filters and actions.
-
+ description: Rules are a list of HTTP matchers, filters and actions.
items:
description: |-
HTTPRouteRule defines semantics for matching an HTTP request based on
@@ -9823,7 +11916,6 @@ spec:
namespace's owner to accept the reference. See the ReferenceGrant
documentation for details.
-
When the BackendRef points to a Kubernetes Service, implementations SHOULD
honor the appProtocol field if it is set for the target Service Port.
@@ -9838,8 +11930,6 @@ spec:
If a Route is not able to send traffic to the backend using the specified
protocol then the backend is considered invalid. Implementations MUST set the
"ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.
-
-
properties:
filters:
description: |-
@@ -9857,6 +11947,290 @@ spec:
authentication strategies, rate-limiting, and traffic shaping. API
guarantee/conformance is defined based on the type of the filter.
properties:
+ cors:
+ description: |-
+ CORS defines a schema for a filter that responds to the
+ cross-origin request based on HTTP response header.
+
+ Support: Extended
+ properties:
+ allowCredentials:
+ description: |-
+ AllowCredentials indicates whether the actual cross-origin request allows
+ to include credentials.
+
+ When set to true, the gateway will include the `Access-Control-Allow-Credentials`
+ response header with value true (case-sensitive).
+
+ When set to false or omitted the gateway will omit the header
+ `Access-Control-Allow-Credentials` entirely (this is the standard CORS
+ behavior).
+
+ Support: Extended
+ type: boolean
+ allowHeaders:
+ description: |-
+ AllowHeaders indicates which HTTP request headers are supported for
+ accessing the requested resource.
+
+ Header names are not case sensitive.
+
+ Multiple header names in the value of the `Access-Control-Allow-Headers`
+ response header are separated by a comma (",").
+
+ When the `AllowHeaders` field is configured with one or more headers, the
+ gateway must return the `Access-Control-Allow-Headers` response header
+ which value is present in the `AllowHeaders` field.
+
+ If any header name in the `Access-Control-Request-Headers` request header
+ is not included in the list of header names specified by the response
+ header `Access-Control-Allow-Headers`, it will present an error on the
+ client side.
+
+ If any header name in the `Access-Control-Allow-Headers` response header
+ does not recognize by the client, it will also occur an error on the
+ client side.
+
+ A wildcard indicates that the requests with all HTTP headers are allowed.
+ The `Access-Control-Allow-Headers` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowHeaders` field
+ specified with the `*` wildcard, the gateway must specify one or more
+ HTTP headers in the value of the `Access-Control-Allow-Headers` response
+ header. The value of the header `Access-Control-Allow-Headers` is same as
+ the `Access-Control-Request-Headers` header provided by the client. If
+ the header `Access-Control-Request-Headers` is not included in the
+ request, the gateway will omit the `Access-Control-Allow-Headers`
+ response header, instead of specifying the `*` wildcard. A Gateway
+ implementation may choose to add implementation-specific default headers.
+
+ Support: Extended
+ items:
+ description: |-
+ HTTPHeaderName is the name of an HTTP header.
+
+ Valid values include:
+
+ * "Authorization"
+ * "Set-Cookie"
+
+ Invalid values include:
+
+ - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo
+ headers are not currently supported by this type.
+ - "/invalid" - "/ " is an invalid character
+ maxLength: 256
+ minLength: 1
+ pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ allowMethods:
+ description: |-
+ AllowMethods indicates which HTTP methods are supported for accessing the
+ requested resource.
+
+ Valid values are any method defined by RFC9110, along with the special
+ value `*`, which represents all HTTP methods are allowed.
+
+ Method names are case sensitive, so these values are also case-sensitive.
+ (See https://www.rfc-editor.org/rfc/rfc2616#section-5.1.1)
+
+ Multiple method names in the value of the `Access-Control-Allow-Methods`
+ response header are separated by a comma (",").
+
+ A CORS-safelisted method is a method that is `GET`, `HEAD`, or `POST`.
+ (See https://fetch.spec.whatwg.org/#cors-safelisted-method) The
+ CORS-safelisted methods are always allowed, regardless of whether they
+ are specified in the `AllowMethods` field.
+
+ When the `AllowMethods` field is configured with one or more methods, the
+ gateway must return the `Access-Control-Allow-Methods` response header
+ which value is present in the `AllowMethods` field.
+
+ If the HTTP method of the `Access-Control-Request-Method` request header
+ is not included in the list of methods specified by the response header
+ `Access-Control-Allow-Methods`, it will present an error on the client
+ side.
+
+ The `Access-Control-Allow-Methods` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowMethods` field
+ specified with the `*` wildcard, the gateway must specify one HTTP method
+ in the value of the Access-Control-Allow-Methods response header. The
+ value of the header `Access-Control-Allow-Methods` is same as the
+ `Access-Control-Request-Method` header provided by the client. If the
+ header `Access-Control-Request-Method` is not included in the request,
+ the gateway will omit the `Access-Control-Allow-Methods` response header,
+ instead of specifying the `*` wildcard. A Gateway implementation may
+ choose to add implementation-specific default methods.
+
+ Support: Extended
+ items:
+ enum:
+ - GET
+ - HEAD
+ - POST
+ - PUT
+ - DELETE
+ - CONNECT
+ - OPTIONS
+ - TRACE
+ - PATCH
+ - '*'
+ type: string
+ maxItems: 9
+ type: array
+ x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowMethods cannot contain '*' alongside
+ other methods
+ rule: '!(''*'' in self && self.size() > 1)'
+ allowOrigins:
+ description: |-
+ AllowOrigins indicates whether the response can be shared with requested
+ resource from the given `Origin`.
+
+ The `Origin` consists of a scheme and a host, with an optional port, and
+ takes the form `://(:)`.
+
+ Valid values for scheme are: `http` and `https`.
+
+ Valid values for port are any integer between 1 and 65535 (the list of
+ available TCP/UDP ports). Note that, if not included, port `80` is
+ assumed for `http` scheme origins, and port `443` is assumed for `https`
+ origins. This may affect origin matching.
+
+ The host part of the origin may contain the wildcard character `*`. These
+ wildcard characters behave as follows:
+
+ * `*` is a greedy match to the _left_, including any number of
+ DNS labels to the left of its position. This also means that
+ `*` will include any number of period `.` characters to the
+ left of its position.
+ * A wildcard by itself matches all hosts.
+
+ An origin value that includes _only_ the `*` character indicates requests
+ from all `Origin`s are allowed.
+
+ When the `AllowOrigins` field is configured with multiple origins, it
+ means the server supports clients from multiple origins. If the request
+ `Origin` matches the configured allowed origins, the gateway must return
+ the given `Origin` and sets value of the header
+ `Access-Control-Allow-Origin` same as the `Origin` header provided by the
+ client.
+
+ The status code of a successful response to a "preflight" request is
+ always an OK status (i.e., 204 or 200).
+
+ If the request `Origin` does not match the configured allowed origins,
+ the gateway returns 204/200 response but doesn't set the relevant
+ cross-origin response headers. Alternatively, the gateway responds with
+ 403 status to the "preflight" request is denied, coupled with omitting
+ the CORS headers. The cross-origin request fails on the client side.
+ Therefore, the client doesn't attempt the actual cross-origin request.
+
+ The `Access-Control-Allow-Origin` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowOrigins` field
+ specified with the `*` wildcard, the gateway must return a single origin
+ in the value of the `Access-Control-Allow-Origin` response header,
+ instead of specifying the `*` wildcard. The value of the header
+ `Access-Control-Allow-Origin` is same as the `Origin` header provided by
+ the client.
+
+ Support: Extended
+ items:
+ description: |-
+ The CORSOrigin MUST NOT be a relative URI, and it MUST follow the URI syntax and
+ encoding rules specified in RFC3986. The CORSOrigin MUST include both a
+ scheme (e.g., "http" or "spiffe") and a scheme-specific-part, or it should be a single '*' character.
+ URIs that include an authority MUST include a fully qualified domain name or
+ IP address as the host.
+ maxLength: 253
+ minLength: 1
+ pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$)
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowOrigins cannot contain '*' alongside
+ other origins
+ rule: '!(''*'' in self && self.size() > 1)'
+ exposeHeaders:
+ description: |-
+ ExposeHeaders indicates which HTTP response headers can be exposed
+ to client-side scripts in response to a cross-origin request.
+
+ A CORS-safelisted response header is an HTTP header in a CORS response
+ that it is considered safe to expose to the client scripts.
+ The CORS-safelisted response headers include the following headers:
+ `Cache-Control`
+ `Content-Language`
+ `Content-Length`
+ `Content-Type`
+ `Expires`
+ `Last-Modified`
+ `Pragma`
+ (See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name)
+ The CORS-safelisted response headers are exposed to client by default.
+
+ When an HTTP header name is specified using the `ExposeHeaders` field,
+ this additional header will be exposed as part of the response to the
+ client.
+
+ Header names are not case sensitive.
+
+ Multiple header names in the value of the `Access-Control-Expose-Headers`
+ response header are separated by a comma (",").
+
+ A wildcard indicates that the responses with all HTTP headers are exposed
+ to clients. The `Access-Control-Expose-Headers` response header can only
+ use `*` wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ Support: Extended
+ items:
+ description: |-
+ HTTPHeaderName is the name of an HTTP header.
+
+ Valid values include:
+
+ * "Authorization"
+ * "Set-Cookie"
+
+ Invalid values include:
+
+ - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo
+ headers are not currently supported by this type.
+ - "/invalid" - "/ " is an invalid character
+ maxLength: 256
+ minLength: 1
+ pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ maxAge:
+ default: 5
+ description: |-
+ MaxAge indicates the duration (in seconds) for the client to cache the
+ results of a "preflight" request.
+
+ The information provided by the `Access-Control-Allow-Methods` and
+ `Access-Control-Allow-Headers` response headers can be cached by the
+ client until the time specified by `Access-Control-Max-Age` elapses.
+
+ The default value of `Access-Control-Max-Age` response header is 5
+ (seconds).
+ format: int32
+ minimum: 1
+ type: integer
+ type: object
extensionRef:
description: |-
ExtensionRef is an optional, implementation-specific extension to the
@@ -9892,6 +12266,253 @@ spec:
- kind
- name
type: object
+ externalAuth:
+ description: |-
+ ExternalAuth configures settings related to sending request details
+ to an external auth service. The external service MUST authenticate
+ the request, and MAY authorize the request as well.
+
+ If there is any problem communicating with the external service,
+ this filter MUST fail closed.
+
+ Support: Extended
+ properties:
+ backendRef:
+ description: |-
+ BackendRef is a reference to a backend to send authorization
+ requests to.
+
+ The backend must speak the selected protocol (GRPC or HTTP) on the
+ referenced port.
+
+ If the backend service requires TLS, use BackendTLSPolicy to tell the
+ implementation to supply the TLS details to be used to connect to that
+ backend.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind
+ == ''Service'') ? has(self.port) : true'
+ forwardBody:
+ description: |-
+ ForwardBody controls if requests to the authorization server should include
+ the body of the client request; and if so, how big that body is allowed
+ to be.
+
+ It is expected that implementations will buffer the request body up to
+ `forwardBody.maxSize` bytes. Bodies over that size must be rejected with a
+ 4xx series error (413 or 403 are common examples), and fail processing
+ of the filter.
+
+ If unset, or `forwardBody.maxSize` is set to `0`, then the body will not
+ be forwarded.
+
+ Feature Name: HTTPRouteExternalAuthForwardBody
+ properties:
+ maxSize:
+ description: |-
+ MaxSize specifies how large in bytes the largest body that will be buffered
+ and sent to the authorization server. If the body size is larger than
+ `maxSize`, then the body sent to the authorization server must be
+ truncated to `maxSize` bytes.
+
+ Experimental note: This behavior needs to be checked against
+ various dataplanes; it may need to be changed.
+ See https://github.com/kubernetes-sigs/gateway-api/pull/4001#discussion_r2291405746
+ for more.
+
+ If 0, the body will not be sent to the authorization server.
+ type: integer
+ type: object
+ grpc:
+ description: |-
+ GRPCAuthConfig contains configuration for communication with ext_authz
+ protocol-speaking backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what headers from the client request
+ will be sent to the authorization server.
+
+ If this list is empty, then all headers must be sent.
+
+ If the list has entries, only those entries must be sent.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ type: object
+ http:
+ description: |-
+ HTTPAuthConfig contains configuration for communication with HTTP-speaking
+ backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what additional headers from the client request
+ will be sent to the authorization server.
+
+ The following headers must always be sent to the authorization server,
+ regardless of this setting:
+
+ * `Host`
+ * `Method`
+ * `Path`
+ * `Content-Length`
+ * `Authorization`
+
+ If this list is empty, then only those headers must be sent.
+
+ Note that `Content-Length` has a special behavior, in that the length
+ sent must be correct for the actual request to the external authorization
+ server - that is, it must reflect the actual number of bytes sent in the
+ body of the request to the authorization server.
+
+ So if the `forwardBody` stanza is unset, or `forwardBody.maxSize` is set
+ to `0`, then `Content-Length` must be `0`. If `forwardBody.maxSize` is set
+ to anything other than `0`, then the `Content-Length` of the authorization
+ request must be set to the actual number of bytes forwarded.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ allowedResponseHeaders:
+ description: |-
+ AllowedResponseHeaders specifies what headers from the authorization response
+ will be copied into the request to the backend.
+
+ If this list is empty, then all headers from the authorization server
+ except Authority or Host must be copied.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ path:
+ description: |-
+ Path sets the prefix that paths from the client request will have added
+ when forwarded to the authorization server.
+
+ When empty or unspecified, no prefix is added.
+
+ Valid values are the same as the "value" regex for path values in the `match`
+ stanza, and the validation regex will screen out invalid paths in the same way.
+ Even with the validation, implementations MUST sanitize this input before using it
+ directly.
+ maxLength: 1024
+ pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$
+ type: string
+ type: object
+ protocol:
+ description: |-
+ ExternalAuthProtocol describes which protocol to use when communicating with an
+ ext_authz authorization server.
+
+ When this is set to GRPC, each backend must use the Envoy ext_authz protocol
+ on the port specified in `backendRefs`. Requests and responses are defined
+ in the protobufs explained at:
+ https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto
+
+ When this is set to HTTP, each backend must respond with a `200` status
+ code in on a successful authorization. Any other code is considered
+ an authorization failure.
+
+ Feature Names:
+ GRPC Support - HTTPRouteExternalAuthGRPC
+ HTTP Support - HTTPRouteExternalAuthHTTP
+ enum:
+ - HTTP
+ - GRPC
+ type: string
+ required:
+ - backendRef
+ - protocol
+ type: object
+ x-kubernetes-validations:
+ - message: grpc must be specified when protocol
+ is set to 'GRPC'
+ rule: 'self.protocol == ''GRPC'' ? has(self.grpc)
+ : true'
+ - message: protocol must be 'GRPC' when grpc is
+ set
+ rule: 'has(self.grpc) ? self.protocol == ''GRPC''
+ : true'
+ - message: http must be specified when protocol
+ is set to 'HTTP'
+ rule: 'self.protocol == ''HTTP'' ? has(self.http)
+ : true'
+ - message: protocol must be 'HTTP' when http is
+ set
+ rule: 'has(self.http) ? self.protocol == ''HTTP''
+ : true'
requestHeaderModifier:
description: |-
RequestHeaderModifier defines a schema for a filter that modifies request
@@ -9925,7 +12546,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -10000,7 +12621,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -10028,7 +12649,7 @@ spec:
x-kubernetes-list-type: map
type: object
requestMirror:
- description: |+
+ description: |-
RequestMirror defines a schema for a filter that mirrors requests.
Requests are sent to the specified destination, but responses from
that destination are ignored.
@@ -10038,7 +12659,6 @@ spec:
backends.
Support: Extended
-
properties:
backendRef:
description: |-
@@ -10134,13 +12754,12 @@ spec:
rule: '(size(self.group) == 0 && self.kind
== ''Service'') ? has(self.port) : true'
fraction:
- description: |+
+ description: |-
Fraction represents the fraction of requests that should be
mirrored to BackendRef.
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
properties:
denominator:
default: 100
@@ -10159,14 +12778,13 @@ spec:
to denominator
rule: self.numerator <= self.denominator
percent:
- description: |+
+ description: |-
Percent represents the percentage of requests that should be
mirrored to BackendRef. Its minimum value is 0 (indicating 0% of
requests) and its maximum value is 100 (indicating 100% of requests).
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
format: int32
maximum: 100
minimum: 0
@@ -10364,7 +12982,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -10439,7 +13057,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -10507,6 +13125,8 @@ spec:
- RequestRedirect
- URLRewrite
- ExtensionRef
+ - CORS
+ - ExternalAuth
type: string
urlRewrite:
description: |-
@@ -10639,13 +13259,21 @@ spec:
- message: filter.extensionRef must be specified for
ExtensionRef filter.type
rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'
+ - message: filter.cors must be nil if the filter.type
+ is not CORS
+ rule: '!(has(self.cors) && self.type != ''CORS'')'
+ - message: filter.cors must be specified for CORS filter.type
+ rule: '!(!has(self.cors) && self.type == ''CORS'')'
+ - message: filter.externalAuth must be nil if the filter.type
+ is not ExternalAuth
+ rule: '!(has(self.externalAuth) && self.type != ''ExternalAuth'')'
+ - message: filter.externalAuth must be specified for
+ ExternalAuth filter.type
+ rule: '!(!has(self.externalAuth) && self.type == ''ExternalAuth'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- - message: May specify either httpRouteFilterRequestRedirect
- or httpRouteFilterRequestRewrite, but not both
- rule: '!(self.exists(f, f.type == ''RequestRedirect'')
- && self.exists(f, f.type == ''URLRewrite''))'
- message: May specify either httpRouteFilterRequestRedirect
or httpRouteFilterRequestRewrite, but not both
rule: '!(self.exists(f, f.type == ''RequestRedirect'')
@@ -10751,6 +13379,7 @@ spec:
? has(self.port) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
filters:
description: |-
Filters define the filters that are applied to requests that match
@@ -10760,7 +13389,7 @@ spec:
they are specified.
Implementations MAY choose to implement this ordering strictly, rejecting
- any combination or order of filters that can not be supported. If implementations
+ any combination or order of filters that cannot be supported. If implementations
choose a strict interpretation of filter ordering, they MUST clearly document
that behavior.
@@ -10782,7 +13411,7 @@ spec:
All filters are expected to be compatible with each other except for the
URLRewrite and RequestRedirect filters, which may not be combined. If an
- implementation can not support other combinations of filters, they must clearly
+ implementation cannot support other combinations of filters, they must clearly
document that limitation. In cases where incompatible or unsupported
filters are specified and cause the `Accepted` condition to be set to status
`False`, implementations may use the `IncompatibleFilters` reason to specify
@@ -10798,6 +13427,290 @@ spec:
authentication strategies, rate-limiting, and traffic shaping. API
guarantee/conformance is defined based on the type of the filter.
properties:
+ cors:
+ description: |-
+ CORS defines a schema for a filter that responds to the
+ cross-origin request based on HTTP response header.
+
+ Support: Extended
+ properties:
+ allowCredentials:
+ description: |-
+ AllowCredentials indicates whether the actual cross-origin request allows
+ to include credentials.
+
+ When set to true, the gateway will include the `Access-Control-Allow-Credentials`
+ response header with value true (case-sensitive).
+
+ When set to false or omitted the gateway will omit the header
+ `Access-Control-Allow-Credentials` entirely (this is the standard CORS
+ behavior).
+
+ Support: Extended
+ type: boolean
+ allowHeaders:
+ description: |-
+ AllowHeaders indicates which HTTP request headers are supported for
+ accessing the requested resource.
+
+ Header names are not case sensitive.
+
+ Multiple header names in the value of the `Access-Control-Allow-Headers`
+ response header are separated by a comma (",").
+
+ When the `AllowHeaders` field is configured with one or more headers, the
+ gateway must return the `Access-Control-Allow-Headers` response header
+ which value is present in the `AllowHeaders` field.
+
+ If any header name in the `Access-Control-Request-Headers` request header
+ is not included in the list of header names specified by the response
+ header `Access-Control-Allow-Headers`, it will present an error on the
+ client side.
+
+ If any header name in the `Access-Control-Allow-Headers` response header
+ does not recognize by the client, it will also occur an error on the
+ client side.
+
+ A wildcard indicates that the requests with all HTTP headers are allowed.
+ The `Access-Control-Allow-Headers` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowHeaders` field
+ specified with the `*` wildcard, the gateway must specify one or more
+ HTTP headers in the value of the `Access-Control-Allow-Headers` response
+ header. The value of the header `Access-Control-Allow-Headers` is same as
+ the `Access-Control-Request-Headers` header provided by the client. If
+ the header `Access-Control-Request-Headers` is not included in the
+ request, the gateway will omit the `Access-Control-Allow-Headers`
+ response header, instead of specifying the `*` wildcard. A Gateway
+ implementation may choose to add implementation-specific default headers.
+
+ Support: Extended
+ items:
+ description: |-
+ HTTPHeaderName is the name of an HTTP header.
+
+ Valid values include:
+
+ * "Authorization"
+ * "Set-Cookie"
+
+ Invalid values include:
+
+ - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo
+ headers are not currently supported by this type.
+ - "/invalid" - "/ " is an invalid character
+ maxLength: 256
+ minLength: 1
+ pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ allowMethods:
+ description: |-
+ AllowMethods indicates which HTTP methods are supported for accessing the
+ requested resource.
+
+ Valid values are any method defined by RFC9110, along with the special
+ value `*`, which represents all HTTP methods are allowed.
+
+ Method names are case sensitive, so these values are also case-sensitive.
+ (See https://www.rfc-editor.org/rfc/rfc2616#section-5.1.1)
+
+ Multiple method names in the value of the `Access-Control-Allow-Methods`
+ response header are separated by a comma (",").
+
+ A CORS-safelisted method is a method that is `GET`, `HEAD`, or `POST`.
+ (See https://fetch.spec.whatwg.org/#cors-safelisted-method) The
+ CORS-safelisted methods are always allowed, regardless of whether they
+ are specified in the `AllowMethods` field.
+
+ When the `AllowMethods` field is configured with one or more methods, the
+ gateway must return the `Access-Control-Allow-Methods` response header
+ which value is present in the `AllowMethods` field.
+
+ If the HTTP method of the `Access-Control-Request-Method` request header
+ is not included in the list of methods specified by the response header
+ `Access-Control-Allow-Methods`, it will present an error on the client
+ side.
+
+ The `Access-Control-Allow-Methods` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowMethods` field
+ specified with the `*` wildcard, the gateway must specify one HTTP method
+ in the value of the Access-Control-Allow-Methods response header. The
+ value of the header `Access-Control-Allow-Methods` is same as the
+ `Access-Control-Request-Method` header provided by the client. If the
+ header `Access-Control-Request-Method` is not included in the request,
+ the gateway will omit the `Access-Control-Allow-Methods` response header,
+ instead of specifying the `*` wildcard. A Gateway implementation may
+ choose to add implementation-specific default methods.
+
+ Support: Extended
+ items:
+ enum:
+ - GET
+ - HEAD
+ - POST
+ - PUT
+ - DELETE
+ - CONNECT
+ - OPTIONS
+ - TRACE
+ - PATCH
+ - '*'
+ type: string
+ maxItems: 9
+ type: array
+ x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowMethods cannot contain '*' alongside
+ other methods
+ rule: '!(''*'' in self && self.size() > 1)'
+ allowOrigins:
+ description: |-
+ AllowOrigins indicates whether the response can be shared with requested
+ resource from the given `Origin`.
+
+ The `Origin` consists of a scheme and a host, with an optional port, and
+ takes the form `://(:)`.
+
+ Valid values for scheme are: `http` and `https`.
+
+ Valid values for port are any integer between 1 and 65535 (the list of
+ available TCP/UDP ports). Note that, if not included, port `80` is
+ assumed for `http` scheme origins, and port `443` is assumed for `https`
+ origins. This may affect origin matching.
+
+ The host part of the origin may contain the wildcard character `*`. These
+ wildcard characters behave as follows:
+
+ * `*` is a greedy match to the _left_, including any number of
+ DNS labels to the left of its position. This also means that
+ `*` will include any number of period `.` characters to the
+ left of its position.
+ * A wildcard by itself matches all hosts.
+
+ An origin value that includes _only_ the `*` character indicates requests
+ from all `Origin`s are allowed.
+
+ When the `AllowOrigins` field is configured with multiple origins, it
+ means the server supports clients from multiple origins. If the request
+ `Origin` matches the configured allowed origins, the gateway must return
+ the given `Origin` and sets value of the header
+ `Access-Control-Allow-Origin` same as the `Origin` header provided by the
+ client.
+
+ The status code of a successful response to a "preflight" request is
+ always an OK status (i.e., 204 or 200).
+
+ If the request `Origin` does not match the configured allowed origins,
+ the gateway returns 204/200 response but doesn't set the relevant
+ cross-origin response headers. Alternatively, the gateway responds with
+ 403 status to the "preflight" request is denied, coupled with omitting
+ the CORS headers. The cross-origin request fails on the client side.
+ Therefore, the client doesn't attempt the actual cross-origin request.
+
+ The `Access-Control-Allow-Origin` response header can only use `*`
+ wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ When the `AllowCredentials` field is true and `AllowOrigins` field
+ specified with the `*` wildcard, the gateway must return a single origin
+ in the value of the `Access-Control-Allow-Origin` response header,
+ instead of specifying the `*` wildcard. The value of the header
+ `Access-Control-Allow-Origin` is same as the `Origin` header provided by
+ the client.
+
+ Support: Extended
+ items:
+ description: |-
+ The CORSOrigin MUST NOT be a relative URI, and it MUST follow the URI syntax and
+ encoding rules specified in RFC3986. The CORSOrigin MUST include both a
+ scheme (e.g., "http" or "spiffe") and a scheme-specific-part, or it should be a single '*' character.
+ URIs that include an authority MUST include a fully qualified domain name or
+ IP address as the host.
+ maxLength: 253
+ minLength: 1
+ pattern: (^\*$)|(^([a-zA-Z][a-zA-Z0-9+\-.]+):\/\/([^:/?#]+)(:([0-9]{1,5}))?$)
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ x-kubernetes-validations:
+ - message: AllowOrigins cannot contain '*' alongside
+ other origins
+ rule: '!(''*'' in self && self.size() > 1)'
+ exposeHeaders:
+ description: |-
+ ExposeHeaders indicates which HTTP response headers can be exposed
+ to client-side scripts in response to a cross-origin request.
+
+ A CORS-safelisted response header is an HTTP header in a CORS response
+ that it is considered safe to expose to the client scripts.
+ The CORS-safelisted response headers include the following headers:
+ `Cache-Control`
+ `Content-Language`
+ `Content-Length`
+ `Content-Type`
+ `Expires`
+ `Last-Modified`
+ `Pragma`
+ (See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name)
+ The CORS-safelisted response headers are exposed to client by default.
+
+ When an HTTP header name is specified using the `ExposeHeaders` field,
+ this additional header will be exposed as part of the response to the
+ client.
+
+ Header names are not case sensitive.
+
+ Multiple header names in the value of the `Access-Control-Expose-Headers`
+ response header are separated by a comma (",").
+
+ A wildcard indicates that the responses with all HTTP headers are exposed
+ to clients. The `Access-Control-Expose-Headers` response header can only
+ use `*` wildcard as value when the `AllowCredentials` field is false or omitted.
+
+ Support: Extended
+ items:
+ description: |-
+ HTTPHeaderName is the name of an HTTP header.
+
+ Valid values include:
+
+ * "Authorization"
+ * "Set-Cookie"
+
+ Invalid values include:
+
+ - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo
+ headers are not currently supported by this type.
+ - "/invalid" - "/ " is an invalid character
+ maxLength: 256
+ minLength: 1
+ pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$
+ type: string
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: set
+ maxAge:
+ default: 5
+ description: |-
+ MaxAge indicates the duration (in seconds) for the client to cache the
+ results of a "preflight" request.
+
+ The information provided by the `Access-Control-Allow-Methods` and
+ `Access-Control-Allow-Headers` response headers can be cached by the
+ client until the time specified by `Access-Control-Max-Age` elapses.
+
+ The default value of `Access-Control-Max-Age` response header is 5
+ (seconds).
+ format: int32
+ minimum: 1
+ type: integer
+ type: object
extensionRef:
description: |-
ExtensionRef is an optional, implementation-specific extension to the
@@ -10833,6 +13746,251 @@ spec:
- kind
- name
type: object
+ externalAuth:
+ description: |-
+ ExternalAuth configures settings related to sending request details
+ to an external auth service. The external service MUST authenticate
+ the request, and MAY authorize the request as well.
+
+ If there is any problem communicating with the external service,
+ this filter MUST fail closed.
+
+ Support: Extended
+ properties:
+ backendRef:
+ description: |-
+ BackendRef is a reference to a backend to send authorization
+ requests to.
+
+ The backend must speak the selected protocol (GRPC or HTTP) on the
+ referenced port.
+
+ If the backend service requires TLS, use BackendTLSPolicy to tell the
+ implementation to supply the TLS details to be used to connect to that
+ backend.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind == ''Service'')
+ ? has(self.port) : true'
+ forwardBody:
+ description: |-
+ ForwardBody controls if requests to the authorization server should include
+ the body of the client request; and if so, how big that body is allowed
+ to be.
+
+ It is expected that implementations will buffer the request body up to
+ `forwardBody.maxSize` bytes. Bodies over that size must be rejected with a
+ 4xx series error (413 or 403 are common examples), and fail processing
+ of the filter.
+
+ If unset, or `forwardBody.maxSize` is set to `0`, then the body will not
+ be forwarded.
+
+ Feature Name: HTTPRouteExternalAuthForwardBody
+ properties:
+ maxSize:
+ description: |-
+ MaxSize specifies how large in bytes the largest body that will be buffered
+ and sent to the authorization server. If the body size is larger than
+ `maxSize`, then the body sent to the authorization server must be
+ truncated to `maxSize` bytes.
+
+ Experimental note: This behavior needs to be checked against
+ various dataplanes; it may need to be changed.
+ See https://github.com/kubernetes-sigs/gateway-api/pull/4001#discussion_r2291405746
+ for more.
+
+ If 0, the body will not be sent to the authorization server.
+ type: integer
+ type: object
+ grpc:
+ description: |-
+ GRPCAuthConfig contains configuration for communication with ext_authz
+ protocol-speaking backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what headers from the client request
+ will be sent to the authorization server.
+
+ If this list is empty, then all headers must be sent.
+
+ If the list has entries, only those entries must be sent.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ type: object
+ http:
+ description: |-
+ HTTPAuthConfig contains configuration for communication with HTTP-speaking
+ backends.
+
+ If unset, implementations must assume the default behavior for each
+ included field is intended.
+ properties:
+ allowedHeaders:
+ description: |-
+ AllowedRequestHeaders specifies what additional headers from the client request
+ will be sent to the authorization server.
+
+ The following headers must always be sent to the authorization server,
+ regardless of this setting:
+
+ * `Host`
+ * `Method`
+ * `Path`
+ * `Content-Length`
+ * `Authorization`
+
+ If this list is empty, then only those headers must be sent.
+
+ Note that `Content-Length` has a special behavior, in that the length
+ sent must be correct for the actual request to the external authorization
+ server - that is, it must reflect the actual number of bytes sent in the
+ body of the request to the authorization server.
+
+ So if the `forwardBody` stanza is unset, or `forwardBody.maxSize` is set
+ to `0`, then `Content-Length` must be `0`. If `forwardBody.maxSize` is set
+ to anything other than `0`, then the `Content-Length` of the authorization
+ request must be set to the actual number of bytes forwarded.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ allowedResponseHeaders:
+ description: |-
+ AllowedResponseHeaders specifies what headers from the authorization response
+ will be copied into the request to the backend.
+
+ If this list is empty, then all headers from the authorization server
+ except Authority or Host must be copied.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ path:
+ description: |-
+ Path sets the prefix that paths from the client request will have added
+ when forwarded to the authorization server.
+
+ When empty or unspecified, no prefix is added.
+
+ Valid values are the same as the "value" regex for path values in the `match`
+ stanza, and the validation regex will screen out invalid paths in the same way.
+ Even with the validation, implementations MUST sanitize this input before using it
+ directly.
+ maxLength: 1024
+ pattern: ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$
+ type: string
+ type: object
+ protocol:
+ description: |-
+ ExternalAuthProtocol describes which protocol to use when communicating with an
+ ext_authz authorization server.
+
+ When this is set to GRPC, each backend must use the Envoy ext_authz protocol
+ on the port specified in `backendRefs`. Requests and responses are defined
+ in the protobufs explained at:
+ https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto
+
+ When this is set to HTTP, each backend must respond with a `200` status
+ code in on a successful authorization. Any other code is considered
+ an authorization failure.
+
+ Feature Names:
+ GRPC Support - HTTPRouteExternalAuthGRPC
+ HTTP Support - HTTPRouteExternalAuthHTTP
+ enum:
+ - HTTP
+ - GRPC
+ type: string
+ required:
+ - backendRef
+ - protocol
+ type: object
+ x-kubernetes-validations:
+ - message: grpc must be specified when protocol is set
+ to 'GRPC'
+ rule: 'self.protocol == ''GRPC'' ? has(self.grpc) :
+ true'
+ - message: protocol must be 'GRPC' when grpc is set
+ rule: 'has(self.grpc) ? self.protocol == ''GRPC'' :
+ true'
+ - message: http must be specified when protocol is set
+ to 'HTTP'
+ rule: 'self.protocol == ''HTTP'' ? has(self.http) :
+ true'
+ - message: protocol must be 'HTTP' when http is set
+ rule: 'has(self.http) ? self.protocol == ''HTTP'' :
+ true'
requestHeaderModifier:
description: |-
RequestHeaderModifier defines a schema for a filter that modifies request
@@ -10865,7 +14023,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -10939,7 +14097,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -10967,7 +14125,7 @@ spec:
x-kubernetes-list-type: map
type: object
requestMirror:
- description: |+
+ description: |-
RequestMirror defines a schema for a filter that mirrors requests.
Requests are sent to the specified destination, but responses from
that destination are ignored.
@@ -10977,7 +14135,6 @@ spec:
backends.
Support: Extended
-
properties:
backendRef:
description: |-
@@ -11073,13 +14230,12 @@ spec:
rule: '(size(self.group) == 0 && self.kind == ''Service'')
? has(self.port) : true'
fraction:
- description: |+
+ description: |-
Fraction represents the fraction of requests that should be
mirrored to BackendRef.
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
properties:
denominator:
default: 100
@@ -11098,14 +14254,13 @@ spec:
denominator
rule: self.numerator <= self.denominator
percent:
- description: |+
+ description: |-
Percent represents the percentage of requests that should be
mirrored to BackendRef. Its minimum value is 0 (indicating 0% of
requests) and its maximum value is 100 (indicating 100% of requests).
Only one of Fraction or Percent may be specified. If neither field
is specified, 100% of requests will be mirrored.
-
format: int32
maximum: 100
minimum: 0
@@ -11302,7 +14457,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -11376,7 +14531,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, the first entry with
an equivalent name MUST be considered for a match. Subsequent entries
@@ -11444,6 +14599,8 @@ spec:
- RequestRedirect
- URLRewrite
- ExtensionRef
+ - CORS
+ - ExternalAuth
type: string
urlRewrite:
description: |-
@@ -11573,8 +14730,20 @@ spec:
- message: filter.extensionRef must be specified for ExtensionRef
filter.type
rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'
+ - message: filter.cors must be nil if the filter.type is not
+ CORS
+ rule: '!(has(self.cors) && self.type != ''CORS'')'
+ - message: filter.cors must be specified for CORS filter.type
+ rule: '!(!has(self.cors) && self.type == ''CORS'')'
+ - message: filter.externalAuth must be nil if the filter.type
+ is not ExternalAuth
+ rule: '!(has(self.externalAuth) && self.type != ''ExternalAuth'')'
+ - message: filter.externalAuth must be specified for ExternalAuth
+ filter.type
+ rule: '!(!has(self.externalAuth) && self.type == ''ExternalAuth'')'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: May specify either httpRouteFilterRequestRedirect
or httpRouteFilterRequestRewrite, but not both
@@ -11676,7 +14845,7 @@ spec:
name:
description: |-
Name is the name of the HTTP Header to be matched. Name matching MUST be
- case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
+ case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).
If multiple entries specify equivalent header names, only the first
entry with an equivalent name MUST be considered for a match. Subsequent
@@ -11886,8 +15055,9 @@ spec:
type: object
maxItems: 64
type: array
+ x-kubernetes-list-type: atomic
name:
- description: |
+ description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
Support: Extended
@@ -11896,15 +15066,14 @@ spec:
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
retry:
- description: |+
+ description: |-
Retry defines the configuration for when to retry an HTTP request.
Support: Extended
-
properties:
attempts:
description: |-
- Attempts specifies the maxmimum number of times an individual request
+ Attempts specifies the maximum number of times an individual request
from the gateway to a backend should be retried.
If the maximum number of retries has been attempted without a successful
@@ -11978,20 +15147,18 @@ spec:
Implementations MAY support specifying discrete values in the 400-499 range,
which are often inadvisable to retry.
-
-
maximum: 599
minimum: 400
type: integer
type: array
+ x-kubernetes-list-type: atomic
type: object
sessionPersistence:
- description: |+
+ description: |-
SessionPersistence defines and configures session persistence
for the route rule.
Support: Extended
-
properties:
absoluteTimeout:
description: |-
@@ -12026,6 +15193,8 @@ spec:
absolute lifetime of the cookie tracked by the gateway and
is optional.
+ Defaults to "Session".
+
Support: Core for "Session" type
Support: Extended for "Permanent" type
@@ -12178,6 +15347,7 @@ spec:
!= ''PathPrefix'') ? false : true) : true'
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: While 16 rules and 64 matches per rule are allowed, the
total number of matches across all rules in a route must be less
@@ -12196,6 +15366,24 @@ spec:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
type: object
status:
description: Status defines the current state of HTTPRoute.
@@ -12239,7 +15427,7 @@ spec:
There are a number of cases where the "Accepted" condition may not be set
due to lack of controller visibility, that includes when:
- * The Route refers to a non-existent parent.
+ * The Route refers to a nonexistent parent.
* The Route is of a type that the controller does not support.
* The Route is in a namespace the controller does not have access to.
items:
@@ -12460,11 +15648,13 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -12490,9 +15680,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: referencegrants.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -12611,6 +15800,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
to:
description: |-
To describes the resources that may be referenced by the resources
@@ -12660,6 +15850,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
required:
- from
- to
@@ -12683,9 +15874,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: tcproutes.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -12731,7 +15921,7 @@ spec:
description: Spec defines the desired state of TCPRoute.
properties:
parentRefs:
- description: |+
+ description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
to be attached to. Note that the referenced parent resource needs to
allow this for the attachment to be complete. For Gateways, that means
@@ -12793,11 +15983,6 @@ spec:
connections originating from the same namespace as the Route, for which
the intended destination of the connections are a Service targeted as a
ParentRef of the Route.
-
-
-
-
-
items:
description: |-
ParentReference identifies an API object (usually a Gateway) that can be considered
@@ -12947,6 +16132,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -12971,16 +16157,14 @@ spec:
|| p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port
== p2.port))))
rules:
- description: |+
- Rules are a list of TCP matchers and actions.
-
+ description: Rules are a list of TCP matchers and actions.
items:
description: TCPRouteRule is the configuration for a given rule.
properties:
backendRefs:
description: |-
BackendRefs defines the backend(s) where matching requests should be
- sent. If unspecified or invalid (refers to a non-existent resource or a
+ sent. If unspecified or invalid (refers to a nonexistent resource or a
Service with no endpoints), the underlying implementation MUST actively
reject connection attempts to this backend. Connection rejections must
respect weight; if an invalid backend is requested to have 80% of
@@ -13003,7 +16187,6 @@ spec:
namespace's owner to accept the reference. See the ReferenceGrant
documentation for details.
-
When the BackendRef points to a Kubernetes Service, implementations SHOULD
honor the appProtocol field if it is set for the target Service Port.
@@ -13019,7 +16202,6 @@ spec:
protocol then the backend is considered invalid. Implementations MUST set the
"ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.
-
Note that when the BackendTLSPolicy object is enabled by the implementation,
there are some extra rules about validity to consider here. See the fields
@@ -13115,6 +16297,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
name:
description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
@@ -13124,14 +16307,35 @@ spec:
minLength: 1
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
+ required:
+ - backendRefs
type: object
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
required:
- rules
type: object
@@ -13177,7 +16381,7 @@ spec:
There are a number of cases where the "Accepted" condition may not be set
due to lack of controller visibility, that includes when:
- * The Route refers to a non-existent parent.
+ * The Route refers to a nonexistent parent.
* The Route is of a type that the controller does not support.
* The Route is in a namespace the controller does not have access to.
items:
@@ -13398,11 +16602,13 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -13428,9 +16634,8 @@ kind: CustomResourceDefinition
metadata:
annotations:
api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
+ gateway.networking.k8s.io/bundle-version: v1.4.0
gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
name: tlsroutes.gateway.networking.k8s.io
spec:
group: gateway.networking.k8s.io
@@ -13535,8 +16740,9 @@ spec:
type: string
maxItems: 16
type: array
+ x-kubernetes-list-type: atomic
parentRefs:
- description: |+
+ description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
to be attached to. Note that the referenced parent resource needs to
allow this for the attachment to be complete. For Gateways, that means
@@ -13598,11 +16804,6 @@ spec:
connections originating from the same namespace as the Route, for which
the intended destination of the connections are a Service targeted as a
ParentRef of the Route.
-
-
-
-
-
items:
description: |-
ParentReference identifies an API object (usually a Gateway) that can be considered
@@ -13752,6 +16953,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -13776,16 +16978,14 @@ spec:
|| p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port
== p2.port))))
rules:
- description: |+
- Rules are a list of TLS matchers and actions.
-
+ description: Rules are a list of TLS matchers and actions.
items:
description: TLSRouteRule is the configuration for a given rule.
properties:
backendRefs:
description: |-
BackendRefs defines the backend(s) where matching requests should be
- sent. If unspecified or invalid (refers to a non-existent resource or
+ sent. If unspecified or invalid (refers to a nonexistent resource or
a Service with no endpoints), the rule performs no forwarding; if no
filters are specified that would result in a response being sent, the
underlying implementation must actively reject request attempts to this
@@ -13811,7 +17011,6 @@ spec:
namespace's owner to accept the reference. See the ReferenceGrant
documentation for details.
-
When the BackendRef points to a Kubernetes Service, implementations SHOULD
honor the appProtocol field if it is set for the target Service Port.
@@ -13827,7 +17026,6 @@ spec:
protocol then the backend is considered invalid. Implementations MUST set the
"ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.
-
Note that when the BackendTLSPolicy object is enabled by the implementation,
there are some extra rules about validity to consider here. See the fields
@@ -13923,6 +17121,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
name:
description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
@@ -13932,14 +17131,35 @@ spec:
minLength: 1
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
+ required:
+ - backendRefs
type: object
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
required:
- rules
type: object
@@ -13985,7 +17205,7 @@ spec:
There are a number of cases where the "Accepted" condition may not be set
due to lack of controller visibility, that includes when:
- * The Route refers to a non-existent parent.
+ * The Route refers to a nonexistent parent.
* The Route is of a type that the controller does not support.
* The Route is in a namespace the controller does not have access to.
items:
@@ -14206,11 +17426,13 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -14218,50 +17440,23 @@ spec:
- spec
type: object
served: true
- storage: true
+ storage: false
subresources:
status: {}
-status:
- acceptedNames:
- kind: ""
- plural: ""
- conditions: null
- storedVersions: null
----
-#
-# config/crd/experimental/gateway.networking.k8s.io_udproutes.yaml
-#
-apiVersion: apiextensions.k8s.io/v1
-kind: CustomResourceDefinition
-metadata:
- annotations:
- api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
- gateway.networking.k8s.io/bundle-version: v1.2.1
- gateway.networking.k8s.io/channel: experimental
- creationTimestamp: null
- name: udproutes.gateway.networking.k8s.io
-spec:
- group: gateway.networking.k8s.io
- names:
- categories:
- - gateway-api
- kind: UDPRoute
- listKind: UDPRouteList
- plural: udproutes
- singular: udproute
- scope: Namespaced
- versions:
- additionalPrinterColumns:
- jsonPath: .metadata.creationTimestamp
name: Age
type: date
- name: v1alpha2
+ name: v1alpha3
schema:
openAPIV3Schema:
description: |-
- UDPRoute provides a way to route UDP traffic. When combined with a Gateway
- listener, it can be used to forward traffic on the port specified by the
- listener to a set of backends specified by the UDPRoute.
+ The TLSRoute resource is similar to TCPRoute, but can be configured
+ to match against TLS-specific metadata. This allows more flexibility
+ in matching streams for a given TLS listener.
+
+ If you need to forward traffic to a single target for a TLS listener, you
+ could choose to use a TCPRoute with a TLS listener.
properties:
apiVersion:
description: |-
@@ -14281,10 +17476,69 @@ spec:
metadata:
type: object
spec:
- description: Spec defines the desired state of UDPRoute.
+ description: Spec defines the desired state of TLSRoute.
properties:
+ hostnames:
+ description: |-
+ Hostnames defines a set of SNI hostnames that should match against the
+ SNI attribute of TLS ClientHello message in TLS handshake. This matches
+ the RFC 1123 definition of a hostname with 2 notable exceptions:
+
+ 1. IPs are not allowed in SNI hostnames per RFC 6066.
+ 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard
+ label must appear by itself as the first label.
+
+ If a hostname is specified by both the Listener and TLSRoute, there
+ must be at least one intersecting hostname for the TLSRoute to be
+ attached to the Listener. For example:
+
+ * A Listener with `test.example.com` as the hostname matches TLSRoutes
+ that have specified at least one of `test.example.com` or
+ `*.example.com`.
+ * A Listener with `*.example.com` as the hostname matches TLSRoutes
+ that have specified at least one hostname that matches the Listener
+ hostname. For example, `test.example.com` and `*.example.com` would both
+ match. On the other hand, `example.com` and `test.example.net` would not
+ match.
+
+ If both the Listener and TLSRoute have specified hostnames, any
+ TLSRoute hostnames that do not match the Listener hostname MUST be
+ ignored. For example, if a Listener specified `*.example.com`, and the
+ TLSRoute specified `test.example.com` and `test.example.net`,
+ `test.example.net` must not be considered for a match.
+
+ If both the Listener and TLSRoute have specified hostnames, and none
+ match with the criteria above, then the TLSRoute is not accepted. The
+ implementation must raise an 'Accepted' Condition with a status of
+ `False` in the corresponding RouteParentStatus.
+
+ Support: Core
+ items:
+ description: |-
+ Hostname is the fully qualified domain name of a network host. This matches
+ the RFC 1123 definition of a hostname with 2 notable exceptions:
+
+ 1. IPs are not allowed.
+ 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard
+ label must appear by itself as the first label.
+
+ Hostname can be "precise" which is a domain name without the terminating
+ dot of a network host (e.g. "foo.example.com") or "wildcard", which is a
+ domain name prefixed with a single wildcard label (e.g. `*.example.com`).
+
+ Note that as per RFC1035 and RFC1123, a *label* must consist of lower case
+ alphanumeric characters or '-', and must start and end with an alphanumeric
+ character. No other punctuation is allowed.
+ maxLength: 253
+ minLength: 1
+ pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ maxItems: 16
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
parentRefs:
- description: |+
+ description: |-
ParentRefs references the resources (usually Gateways) that a Route wants
to be attached to. Note that the referenced parent resource needs to
allow this for the attachment to be complete. For Gateways, that means
@@ -14346,11 +17600,6 @@ spec:
connections originating from the same namespace as the Route, for which
the intended destination of the connections are a Service targeted as a
ParentRef of the Route.
-
-
-
-
-
items:
description: |-
ParentReference identifies an API object (usually a Gateway) that can be considered
@@ -14500,6 +17749,7 @@ spec:
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: sectionName or port must be specified when parentRefs includes
2 or more references to the same parent
@@ -14524,20 +17774,21 @@ spec:
|| p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port
== p2.port))))
rules:
- description: |+
- Rules are a list of UDP matchers and actions.
-
+ description: Rules are a list of actions.
items:
- description: UDPRouteRule is the configuration for a given rule.
+ description: TLSRouteRule is the configuration for a given rule.
properties:
backendRefs:
description: |-
BackendRefs defines the backend(s) where matching requests should be
- sent. If unspecified or invalid (refers to a non-existent resource or a
- Service with no endpoints), the underlying implementation MUST actively
- reject connection attempts to this backend. Packet drops must
- respect weight; if an invalid backend is requested to have 80% of
- the packets, then 80% of packets must be dropped instead.
+ sent. If unspecified or invalid (refers to a nonexistent resource or
+ a Service with no endpoints), the rule performs no forwarding; if no
+ filters are specified that would result in a response being sent, the
+ underlying implementation must actively reject request attempts to this
+ backend, by rejecting the connection or returning a 500 status code.
+ Request rejections must respect weight; if an invalid backend is
+ requested to have 80% of requests, then 80% of requests must be rejected
+ instead.
Support: Core for Kubernetes Service
@@ -14556,7 +17807,6 @@ spec:
namespace's owner to accept the reference. See the ReferenceGrant
documentation for details.
-
When the BackendRef points to a Kubernetes Service, implementations SHOULD
honor the appProtocol field if it is set for the target Service Port.
@@ -14572,7 +17822,6 @@ spec:
protocol then the backend is considered invalid. Implementations MUST set the
"ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.
-
Note that when the BackendTLSPolicy object is enabled by the implementation,
there are some extra rules about validity to consider here. See the fields
@@ -14668,6 +17917,7 @@ spec:
maxItems: 16
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
name:
description: |-
Name is the name of the route rule. This name MUST be unique within a Route if it is set.
@@ -14677,19 +17927,41 @@ spec:
minLength: 1
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
type: string
+ required:
+ - backendRefs
type: object
- maxItems: 16
+ maxItems: 1
minItems: 1
type: array
+ x-kubernetes-list-type: atomic
x-kubernetes-validations:
- message: Rule name must be unique within the route
rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
&& l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
required:
+ - hostnames
- rules
type: object
status:
- description: Status defines the current state of UDPRoute.
+ description: Status defines the current state of TLSRoute.
properties:
parents:
description: |-
@@ -14730,7 +18002,7 @@ spec:
There are a number of cases where the "Accepted" condition may not be set
due to lack of controller visibility, that includes when:
- * The Route refers to a non-existent parent.
+ * The Route refers to a nonexistent parent.
* The Route is of a type that the controller does not support.
* The Route is in a namespace the controller does not have access to.
items:
@@ -14951,11 +18223,13 @@ spec:
- name
type: object
required:
+ - conditions
- controllerName
- parentRef
type: object
maxItems: 32
type: array
+ x-kubernetes-list-type: atomic
required:
- parents
type: object
@@ -14972,3 +18246,2416 @@ status:
plural: ""
conditions: null
storedVersions: null
+---
+#
+# config/crd/experimental/gateway.networking.k8s.io_udproutes.yaml
+#
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
+ gateway.networking.k8s.io/bundle-version: v1.4.0
+ gateway.networking.k8s.io/channel: experimental
+ name: udproutes.gateway.networking.k8s.io
+spec:
+ group: gateway.networking.k8s.io
+ names:
+ categories:
+ - gateway-api
+ kind: UDPRoute
+ listKind: UDPRouteList
+ plural: udproutes
+ singular: udproute
+ scope: Namespaced
+ versions:
+ - additionalPrinterColumns:
+ - jsonPath: .metadata.creationTimestamp
+ name: Age
+ type: date
+ name: v1alpha2
+ schema:
+ openAPIV3Schema:
+ description: |-
+ UDPRoute provides a way to route UDP traffic. When combined with a Gateway
+ listener, it can be used to forward traffic on the port specified by the
+ listener to a set of backends specified by the UDPRoute.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: Spec defines the desired state of UDPRoute.
+ properties:
+ parentRefs:
+ description: |-
+ ParentRefs references the resources (usually Gateways) that a Route wants
+ to be attached to. Note that the referenced parent resource needs to
+ allow this for the attachment to be complete. For Gateways, that means
+ the Gateway needs to allow attachment from Routes of this kind and
+ namespace. For Services, that means the Service must either be in the same
+ namespace for a "producer" route, or the mesh implementation must support
+ and allow "consumer" routes for the referenced Service. ReferenceGrant is
+ not applicable for governing ParentRefs to Services - it is not possible to
+ create a "producer" route for a Service in a different namespace from the
+ Route.
+
+ There are two kinds of parent resources with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ This API may be extended in the future to support additional kinds of parent
+ resources.
+
+ ParentRefs must be _distinct_. This means either that:
+
+ * They select different objects. If this is the case, then parentRef
+ entries are distinct. In terms of fields, this means that the
+ multi-part key defined by `group`, `kind`, `namespace`, and `name` must
+ be unique across all parentRef entries in the Route.
+ * They do not select different objects, but for each optional field used,
+ each ParentRef that selects the same object must set the same set of
+ optional fields to different values. If one ParentRef sets a
+ combination of optional fields, all must set the same combination.
+
+ Some examples:
+
+ * If one ParentRef sets `sectionName`, all ParentRefs referencing the
+ same object must also set `sectionName`.
+ * If one ParentRef sets `port`, all ParentRefs referencing the same
+ object must also set `port`.
+ * If one ParentRef sets `sectionName` and `port`, all ParentRefs
+ referencing the same object must also set `sectionName` and `port`.
+
+ It is possible to separately reference multiple distinct objects that may
+ be collapsed by an implementation. For example, some implementations may
+ choose to merge compatible Gateway Listeners together. If that is the
+ case, the list of routes attached to those resources should also be
+ merged.
+
+ Note that for ParentRefs that cross namespace boundaries, there are specific
+ rules. Cross-namespace references are only valid if they are explicitly
+ allowed by something in the namespace they are referring to. For example,
+ Gateway has the AllowedRoutes field, and ReferenceGrant provides a
+ generic way to enable other kinds of cross-namespace reference.
+
+
+ ParentRefs from a Route to a Service in the same namespace are "producer"
+ routes, which apply default routing rules to inbound connections from
+ any namespace to the Service.
+
+ ParentRefs from a Route to a Service in a different namespace are
+ "consumer" routes, and these routing rules are only applied to outbound
+ connections originating from the same namespace as the Route, for which
+ the intended destination of the connections are a Service targeted as a
+ ParentRef of the Route.
+ items:
+ description: |-
+ ParentReference identifies an API object (usually a Gateway) that can be considered
+ a parent of this resource (usually a route). There are two kinds of parent resources
+ with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ This API may be extended in the future to support additional kinds of parent
+ resources.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: |-
+ Group is the group of the referent.
+ When unspecified, "gateway.networking.k8s.io" is inferred.
+ To set the core API group (such as for a "Service" kind referent),
+ Group must be explicitly set to "" (empty string).
+
+ Support: Core
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Gateway
+ description: |-
+ Kind is kind of the referent.
+
+ There are two kinds of parent resources with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ Support for other resources is Implementation-Specific.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: |-
+ Name is the name of the referent.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent. When unspecified, this refers
+ to the local namespace of the Route.
+
+ Note that there are specific rules for ParentRefs which cross namespace
+ boundaries. Cross-namespace references are only valid if they are explicitly
+ allowed by something in the namespace they are referring to. For example:
+ Gateway has the AllowedRoutes field, and ReferenceGrant provides a
+ generic way to enable any other kind of cross-namespace reference.
+
+
+ ParentRefs from a Route to a Service in the same namespace are "producer"
+ routes, which apply default routing rules to inbound connections from
+ any namespace to the Service.
+
+ ParentRefs from a Route to a Service in a different namespace are
+ "consumer" routes, and these routing rules are only applied to outbound
+ connections originating from the same namespace as the Route, for which
+ the intended destination of the connections are a Service targeted as a
+ ParentRef of the Route.
+
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port is the network port this Route targets. It can be interpreted
+ differently based on the type of parent resource.
+
+ When the parent resource is a Gateway, this targets all listeners
+ listening on the specified port that also support this kind of Route(and
+ select this Route). It's not recommended to set `Port` unless the
+ networking behaviors specified in a Route must apply to a specific port
+ as opposed to a listener(s) whose port(s) may be changed. When both Port
+ and SectionName are specified, the name and port of the selected listener
+ must match both specified values.
+
+
+ When the parent resource is a Service, this targets a specific port in the
+ Service spec. When both Port (experimental) and SectionName are specified,
+ the name and port of the selected port must match both specified values.
+
+
+ Implementations MAY choose to support other parent resources.
+ Implementations supporting other types of parent resources MUST clearly
+ document how/if Port is interpreted.
+
+ For the purpose of status, an attachment is considered successful as
+ long as the parent resource accepts it partially. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
+ from the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route,
+ the Route MUST be considered detached from the Gateway.
+
+ Support: Extended
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ sectionName:
+ description: |-
+ SectionName is the name of a section within the target resource. In the
+ following resources, SectionName is interpreted as the following:
+
+ * Gateway: Listener name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+ * Service: Port name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+
+ Implementations MAY choose to support attaching Routes to other resources.
+ If that is the case, they MUST clearly document how SectionName is
+ interpreted.
+
+ When unspecified (empty string), this will reference the entire resource.
+ For the purpose of status, an attachment is considered successful if at
+ least one section in the parent resource accepts it. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
+ the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route, the
+ Route MUST be considered detached from the Gateway.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - name
+ type: object
+ maxItems: 32
+ type: array
+ x-kubernetes-list-type: atomic
+ x-kubernetes-validations:
+ - message: sectionName or port must be specified when parentRefs includes
+ 2 or more references to the same parent
+ rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)
+ || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__
+ == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&
+ p1.__namespace__ == p2.__namespace__)) ? ((!has(p1.sectionName)
+ || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName
+ == '''') && (!has(p1.port) || p1.port == 0) == (!has(p2.port)
+ || p2.port == 0)): true))'
+ - message: sectionName or port must be unique when parentRefs includes
+ 2 or more references to the same parent
+ rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind
+ == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)
+ || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__
+ == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&
+ p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)
+ || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName
+ == '')) || ( has(p1.sectionName) && has(p2.sectionName) && p1.sectionName
+ == p2.sectionName)) && (((!has(p1.port) || p1.port == 0) && (!has(p2.port)
+ || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port
+ == p2.port))))
+ rules:
+ description: Rules are a list of UDP matchers and actions.
+ items:
+ description: UDPRouteRule is the configuration for a given rule.
+ properties:
+ backendRefs:
+ description: |-
+ BackendRefs defines the backend(s) where matching requests should be
+ sent. If unspecified or invalid (refers to a nonexistent resource or a
+ Service with no endpoints), the underlying implementation MUST actively
+ reject connection attempts to this backend. Packet drops must
+ respect weight; if an invalid backend is requested to have 80% of
+ the packets, then 80% of packets must be dropped instead.
+
+ Support: Core for Kubernetes Service
+
+ Support: Extended for Kubernetes ServiceImport
+
+ Support: Implementation-specific for any other resource
+
+ Support for weight: Extended
+ items:
+ description: |-
+ BackendRef defines how a Route should forward a request to a Kubernetes
+ resource.
+
+ Note that when a namespace different than the local namespace is specified, a
+ ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+
+ When the BackendRef points to a Kubernetes Service, implementations SHOULD
+ honor the appProtocol field if it is set for the target Service Port.
+
+ Implementations supporting appProtocol SHOULD recognize the Kubernetes
+ Standard Application Protocols defined in KEP-3726.
+
+ If a Service appProtocol isn't specified, an implementation MAY infer the
+ backend protocol through its own means. Implementations MAY infer the
+ protocol from the Route type referring to the backend Service.
+
+ If a Route is not able to send traffic to the backend using the specified
+ protocol then the backend is considered invalid. Implementations MUST set the
+ "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.
+
+
+ Note that when the BackendTLSPolicy object is enabled by the implementation,
+ there are some extra rules about validity to consider here. See the fields
+ where this struct is used for more information about the exact behavior.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Service
+ description: |-
+ Kind is the Kubernetes resource kind of the referent. For example
+ "Service".
+
+ Defaults to "Service" when not specified.
+
+ ExternalName services can refer to CNAME DNS records that may live
+ outside of the cluster and as such are difficult to reason about in
+ terms of conformance. They also may not be safe to forward to (see
+ CVE-2021-25740 for more information). Implementations SHOULD NOT
+ support ExternalName Services.
+
+ Support: Core (Services with a type other than ExternalName)
+
+ Support: Implementation-specific (Services with type ExternalName)
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the backend. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port specifies the destination port number to use for this resource.
+ Port is required when the referent is a Kubernetes Service. In this
+ case, the port number is the service port number, not the target port.
+ For other resources, destination port might be derived from the referent
+ resource or this field.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ weight:
+ default: 1
+ description: |-
+ Weight specifies the proportion of requests forwarded to the referenced
+ backend. This is computed as weight/(sum of all weights in this
+ BackendRefs list). For non-zero values, there may be some epsilon from
+ the exact proportion defined here depending on the precision an
+ implementation supports. Weight is not a percentage and the sum of
+ weights does not need to equal 100.
+
+ If only one backend is specified and it has a weight greater than 0, 100%
+ of the traffic is forwarded to that backend. If weight is set to 0, no
+ traffic should be forwarded for this entry. If unspecified, weight
+ defaults to 1.
+
+ Support for this field varies based on the context where used.
+ format: int32
+ maximum: 1000000
+ minimum: 0
+ type: integer
+ required:
+ - name
+ type: object
+ x-kubernetes-validations:
+ - message: Must have port for Service reference
+ rule: '(size(self.group) == 0 && self.kind == ''Service'')
+ ? has(self.port) : true'
+ maxItems: 16
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ name:
+ description: |-
+ Name is the name of the route rule. This name MUST be unique within a Route if it is set.
+
+ Support: Extended
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - backendRefs
+ type: object
+ maxItems: 16
+ minItems: 1
+ type: array
+ x-kubernetes-list-type: atomic
+ x-kubernetes-validations:
+ - message: Rule name must be unique within the route
+ rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)
+ && l1.name == l2.name))
+ useDefaultGateways:
+ description: |-
+ UseDefaultGateways indicates the default Gateway scope to use for this
+ Route. If unset (the default) or set to None, the Route will not be
+ attached to any default Gateway; if set, it will be attached to any
+ default Gateway supporting the named scope, subject to the usual rules
+ about which Routes a Gateway is allowed to claim.
+
+ Think carefully before using this functionality! The set of default
+ Gateways supporting the requested scope can change over time without
+ any notice to the Route author, and in many situations it will not be
+ appropriate to request a default Gateway for a given Route -- for
+ example, a Route with specific security requirements should almost
+ certainly not use a default Gateway.
+ enum:
+ - All
+ - None
+ type: string
+ required:
+ - rules
+ type: object
+ status:
+ description: Status defines the current state of UDPRoute.
+ properties:
+ parents:
+ description: |-
+ Parents is a list of parent resources (usually Gateways) that are
+ associated with the route, and the status of the route with respect to
+ each parent. When this route attaches to a parent, the controller that
+ manages the parent must add an entry to this list when the controller
+ first sees the route and should update the entry as appropriate when the
+ route or gateway is modified.
+
+ Note that parent references that cannot be resolved by an implementation
+ of this API will not be added to this list. Implementations of this API
+ can only populate Route status for the Gateways/parent resources they are
+ responsible for.
+
+ A maximum of 32 Gateways will be represented in this list. An empty list
+ means the route has not been attached to any Gateway.
+ items:
+ description: |-
+ RouteParentStatus describes the status of a route with respect to an
+ associated Parent.
+ properties:
+ conditions:
+ description: |-
+ Conditions describes the status of the route with respect to the Gateway.
+ Note that the route's availability is also subject to the Gateway's own
+ status conditions and listener status.
+
+ If the Route's ParentRef specifies an existing Gateway that supports
+ Routes of this kind AND that Gateway's controller has sufficient access,
+ then that Gateway's controller MUST set the "Accepted" condition on the
+ Route, to indicate whether the route has been accepted or rejected by the
+ Gateway, and why.
+
+ A Route MUST be considered "Accepted" if at least one of the Route's
+ rules is implemented by the Gateway.
+
+ There are a number of cases where the "Accepted" condition may not be set
+ due to lack of controller visibility, that includes when:
+
+ * The Route refers to a nonexistent parent.
+ * The Route is of a type that the controller does not support.
+ * The Route is in a namespace the controller does not have access to.
+ items:
+ description: Condition contains details for one aspect of
+ the current state of this API Resource.
+ properties:
+ lastTransitionTime:
+ description: |-
+ lastTransitionTime is the last time the condition transitioned from one status to another.
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
+ format: date-time
+ type: string
+ message:
+ description: |-
+ message is a human readable message indicating details about the transition.
+ This may be an empty string.
+ maxLength: 32768
+ type: string
+ observedGeneration:
+ description: |-
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+ with respect to the current state of the instance.
+ format: int64
+ minimum: 0
+ type: integer
+ reason:
+ description: |-
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
+ Producers of specific condition types may define expected values and meanings for this field,
+ and whether the values are considered a guaranteed API.
+ The value should be a CamelCase string.
+ This field may not be empty.
+ maxLength: 1024
+ minLength: 1
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+ type: string
+ status:
+ description: status of the condition, one of True, False,
+ Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
+ type: string
+ type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ maxLength: 316
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+ type: string
+ required:
+ - lastTransitionTime
+ - message
+ - reason
+ - status
+ - type
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-map-keys:
+ - type
+ x-kubernetes-list-type: map
+ controllerName:
+ description: |-
+ ControllerName is a domain/path string that indicates the name of the
+ controller that wrote this status. This corresponds with the
+ controllerName field on GatewayClass.
+
+ Example: "example.net/gateway-controller".
+
+ The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are
+ valid Kubernetes names
+ (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).
+
+ Controllers MUST populate this field when writing status. Controllers should ensure that
+ entries to status populated with their ControllerName are cleaned up when they are no
+ longer necessary.
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$
+ type: string
+ parentRef:
+ description: |-
+ ParentRef corresponds with a ParentRef in the spec that this
+ RouteParentStatus struct describes the status of.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: |-
+ Group is the group of the referent.
+ When unspecified, "gateway.networking.k8s.io" is inferred.
+ To set the core API group (such as for a "Service" kind referent),
+ Group must be explicitly set to "" (empty string).
+
+ Support: Core
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Gateway
+ description: |-
+ Kind is kind of the referent.
+
+ There are two kinds of parent resources with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ Support for other resources is Implementation-Specific.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: |-
+ Name is the name of the referent.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent. When unspecified, this refers
+ to the local namespace of the Route.
+
+ Note that there are specific rules for ParentRefs which cross namespace
+ boundaries. Cross-namespace references are only valid if they are explicitly
+ allowed by something in the namespace they are referring to. For example:
+ Gateway has the AllowedRoutes field, and ReferenceGrant provides a
+ generic way to enable any other kind of cross-namespace reference.
+
+
+ ParentRefs from a Route to a Service in the same namespace are "producer"
+ routes, which apply default routing rules to inbound connections from
+ any namespace to the Service.
+
+ ParentRefs from a Route to a Service in a different namespace are
+ "consumer" routes, and these routing rules are only applied to outbound
+ connections originating from the same namespace as the Route, for which
+ the intended destination of the connections are a Service targeted as a
+ ParentRef of the Route.
+
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port is the network port this Route targets. It can be interpreted
+ differently based on the type of parent resource.
+
+ When the parent resource is a Gateway, this targets all listeners
+ listening on the specified port that also support this kind of Route(and
+ select this Route). It's not recommended to set `Port` unless the
+ networking behaviors specified in a Route must apply to a specific port
+ as opposed to a listener(s) whose port(s) may be changed. When both Port
+ and SectionName are specified, the name and port of the selected listener
+ must match both specified values.
+
+
+ When the parent resource is a Service, this targets a specific port in the
+ Service spec. When both Port (experimental) and SectionName are specified,
+ the name and port of the selected port must match both specified values.
+
+
+ Implementations MAY choose to support other parent resources.
+ Implementations supporting other types of parent resources MUST clearly
+ document how/if Port is interpreted.
+
+ For the purpose of status, an attachment is considered successful as
+ long as the parent resource accepts it partially. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
+ from the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route,
+ the Route MUST be considered detached from the Gateway.
+
+ Support: Extended
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ sectionName:
+ description: |-
+ SectionName is the name of a section within the target resource. In the
+ following resources, SectionName is interpreted as the following:
+
+ * Gateway: Listener name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+ * Service: Port name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+
+ Implementations MAY choose to support attaching Routes to other resources.
+ If that is the case, they MUST clearly document how SectionName is
+ interpreted.
+
+ When unspecified (empty string), this will reference the entire resource.
+ For the purpose of status, an attachment is considered successful if at
+ least one section in the parent resource accepts it. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
+ the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route, the
+ Route MUST be considered detached from the Gateway.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - name
+ type: object
+ required:
+ - conditions
+ - controllerName
+ - parentRef
+ type: object
+ maxItems: 32
+ type: array
+ x-kubernetes-list-type: atomic
+ required:
+ - parents
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
+status:
+ acceptedNames:
+ kind: ""
+ plural: ""
+ conditions: null
+ storedVersions: null
+---
+#
+# config/crd/experimental/gateway.networking.x-k8s.io_xbackendtrafficpolicies.yaml
+#
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
+ gateway.networking.k8s.io/bundle-version: v1.4.0
+ gateway.networking.k8s.io/channel: experimental
+ labels:
+ gateway.networking.k8s.io/policy: Direct
+ name: xbackendtrafficpolicies.gateway.networking.x-k8s.io
+spec:
+ group: gateway.networking.x-k8s.io
+ names:
+ categories:
+ - gateway-api
+ kind: XBackendTrafficPolicy
+ listKind: XBackendTrafficPolicyList
+ plural: xbackendtrafficpolicies
+ shortNames:
+ - xbtrafficpolicy
+ singular: xbackendtrafficpolicy
+ scope: Namespaced
+ versions:
+ - additionalPrinterColumns:
+ - jsonPath: .metadata.creationTimestamp
+ name: Age
+ type: date
+ name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: |-
+ XBackendTrafficPolicy defines the configuration for how traffic to a
+ target backend should be handled.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: Spec defines the desired state of BackendTrafficPolicy.
+ properties:
+ retryConstraint:
+ description: |-
+ RetryConstraint defines the configuration for when to allow or prevent
+ further retries to a target backend, by dynamically calculating a 'retry
+ budget'. This budget is calculated based on the percentage of incoming
+ traffic composed of retries over a given time interval. Once the budget
+ is exceeded, additional retries will be rejected.
+
+ For example, if the retry budget interval is 10 seconds, there have been
+ 1000 active requests in the past 10 seconds, and the allowed percentage
+ of requests that can be retried is 20% (the default), then 200 of those
+ requests may be composed of retries. Active requests will only be
+ considered for the duration of the interval when calculating the retry
+ budget. Retrying the same original request multiple times within the
+ retry budget interval will lead to each retry being counted towards
+ calculating the budget.
+
+ Configuring a RetryConstraint in BackendTrafficPolicy is compatible with
+ HTTPRoute Retry settings for each HTTPRouteRule that targets the same
+ backend. While the HTTPRouteRule Retry stanza can specify whether a
+ request will be retried, and the number of retry attempts each client
+ may perform, RetryConstraint helps prevent cascading failures such as
+ retry storms during periods of consistent failures.
+
+ After the retry budget has been exceeded, additional retries to the
+ backend MUST return a 503 response to the client.
+
+ Additional configurations for defining a constraint on retries MAY be
+ defined in the future.
+
+ Support: Extended
+ properties:
+ budget:
+ default:
+ interval: 10s
+ percent: 20
+ description: Budget holds the details of the retry budget configuration.
+ properties:
+ interval:
+ default: 10s
+ description: |-
+ Interval defines the duration in which requests will be considered
+ for calculating the budget for retries.
+
+ Support: Extended
+ pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
+ type: string
+ x-kubernetes-validations:
+ - message: interval can not be greater than one hour or less
+ than one second
+ rule: '!(duration(self) < duration(''1s'') || duration(self)
+ > duration(''1h''))'
+ percent:
+ default: 20
+ description: |-
+ Percent defines the maximum percentage of active requests that may
+ be made up of retries.
+
+ Support: Extended
+ maximum: 100
+ minimum: 0
+ type: integer
+ type: object
+ minRetryRate:
+ default:
+ count: 10
+ interval: 1s
+ description: |-
+ MinRetryRate defines the minimum rate of retries that will be allowable
+ over a specified duration of time.
+
+ The effective overall minimum rate of retries targeting the backend
+ service may be much higher, as there can be any number of clients which
+ are applying this setting locally.
+
+ This ensures that requests can still be retried during periods of low
+ traffic, where the budget for retries may be calculated as a very low
+ value.
+
+ Support: Extended
+ properties:
+ count:
+ description: |-
+ Count specifies the number of requests per time interval.
+
+ Support: Extended
+ maximum: 1000000
+ minimum: 1
+ type: integer
+ interval:
+ description: |-
+ Interval specifies the divisor of the rate of requests, the amount of
+ time during which the given count of requests occur.
+
+ Support: Extended
+ pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
+ type: string
+ x-kubernetes-validations:
+ - message: interval can not be greater than one hour
+ rule: '!(duration(self) == duration(''0s'') || duration(self)
+ > duration(''1h''))'
+ type: object
+ type: object
+ sessionPersistence:
+ description: |-
+ SessionPersistence defines and configures session persistence
+ for the backend.
+
+ Support: Extended
+ properties:
+ absoluteTimeout:
+ description: |-
+ AbsoluteTimeout defines the absolute timeout of the persistent
+ session. Once the AbsoluteTimeout duration has elapsed, the
+ session becomes invalid.
+
+ Support: Extended
+ pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
+ type: string
+ cookieConfig:
+ description: |-
+ CookieConfig provides configuration settings that are specific
+ to cookie-based session persistence.
+
+ Support: Core
+ properties:
+ lifetimeType:
+ default: Session
+ description: |-
+ LifetimeType specifies whether the cookie has a permanent or
+ session-based lifetime. A permanent cookie persists until its
+ specified expiry time, defined by the Expires or Max-Age cookie
+ attributes, while a session cookie is deleted when the current
+ session ends.
+
+ When set to "Permanent", AbsoluteTimeout indicates the
+ cookie's lifetime via the Expires or Max-Age cookie attributes
+ and is required.
+
+ When set to "Session", AbsoluteTimeout indicates the
+ absolute lifetime of the cookie tracked by the gateway and
+ is optional.
+
+ Defaults to "Session".
+
+ Support: Core for "Session" type
+
+ Support: Extended for "Permanent" type
+ enum:
+ - Permanent
+ - Session
+ type: string
+ type: object
+ idleTimeout:
+ description: |-
+ IdleTimeout defines the idle timeout of the persistent session.
+ Once the session has been idle for more than the specified
+ IdleTimeout duration, the session becomes invalid.
+
+ Support: Extended
+ pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
+ type: string
+ sessionName:
+ description: |-
+ SessionName defines the name of the persistent session token
+ which may be reflected in the cookie or the header. Users
+ should avoid reusing session names to prevent unintended
+ consequences, such as rejection or unpredictable behavior.
+
+ Support: Implementation-specific
+ maxLength: 128
+ type: string
+ type:
+ default: Cookie
+ description: |-
+ Type defines the type of session persistence such as through
+ the use a header or cookie. Defaults to cookie based session
+ persistence.
+
+ Support: Core for "Cookie" type
+
+ Support: Extended for "Header" type
+ enum:
+ - Cookie
+ - Header
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: AbsoluteTimeout must be specified when cookie lifetimeType
+ is Permanent
+ rule: '!has(self.cookieConfig) || !has(self.cookieConfig.lifetimeType)
+ || self.cookieConfig.lifetimeType != ''Permanent'' || has(self.absoluteTimeout)'
+ targetRefs:
+ description: |-
+ TargetRefs identifies API object(s) to apply this policy to.
+ Currently, Backends (A grouping of like endpoints such as Service,
+ ServiceImport, or any implementation-specific backendRef) are the only
+ valid API target references.
+
+ Currently, a TargetRef can not be scoped to a specific port on a
+ Service.
+ items:
+ description: |-
+ LocalPolicyTargetReference identifies an API object to apply a direct or
+ inherited policy to. This should be used as part of Policy resources
+ that can target Gateway API resources. For more information on how this
+ policy attachment model works, and a sample Policy resource, refer to
+ the policy attachment documentation for Gateway API.
+ properties:
+ group:
+ description: Group is the group of the target resource.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the target resource.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the target resource.
+ maxLength: 253
+ minLength: 1
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ maxItems: 16
+ minItems: 1
+ type: array
+ x-kubernetes-list-map-keys:
+ - group
+ - kind
+ - name
+ x-kubernetes-list-type: map
+ required:
+ - targetRefs
+ type: object
+ status:
+ description: Status defines the current state of BackendTrafficPolicy.
+ properties:
+ ancestors:
+ description: |-
+ Ancestors is a list of ancestor resources (usually Gateways) that are
+ associated with the policy, and the status of the policy with respect to
+ each ancestor. When this policy attaches to a parent, the controller that
+ manages the parent and the ancestors MUST add an entry to this list when
+ the controller first sees the policy and SHOULD update the entry as
+ appropriate when the relevant ancestor is modified.
+
+ Note that choosing the relevant ancestor is left to the Policy designers;
+ an important part of Policy design is designing the right object level at
+ which to namespace this status.
+
+ Note also that implementations MUST ONLY populate ancestor status for
+ the Ancestor resources they are responsible for. Implementations MUST
+ use the ControllerName field to uniquely identify the entries in this list
+ that they are responsible for.
+
+ Note that to achieve this, the list of PolicyAncestorStatus structs
+ MUST be treated as a map with a composite key, made up of the AncestorRef
+ and ControllerName fields combined.
+
+ A maximum of 16 ancestors will be represented in this list. An empty list
+ means the Policy is not relevant for any ancestors.
+
+ If this slice is full, implementations MUST NOT add further entries.
+ Instead they MUST consider the policy unimplementable and signal that
+ on any related resources such as the ancestor that would be referenced
+ here. For example, if this list was full on BackendTLSPolicy, no
+ additional Gateways would be able to reference the Service targeted by
+ the BackendTLSPolicy.
+ items:
+ description: |-
+ PolicyAncestorStatus describes the status of a route with respect to an
+ associated Ancestor.
+
+ Ancestors refer to objects that are either the Target of a policy or above it
+ in terms of object hierarchy. For example, if a policy targets a Service, the
+ Policy's Ancestors are, in order, the Service, the HTTPRoute, the Gateway, and
+ the GatewayClass. Almost always, in this hierarchy, the Gateway will be the most
+ useful object to place Policy status on, so we recommend that implementations
+ SHOULD use Gateway as the PolicyAncestorStatus object unless the designers
+ have a _very_ good reason otherwise.
+
+ In the context of policy attachment, the Ancestor is used to distinguish which
+ resource results in a distinct application of this policy. For example, if a policy
+ targets a Service, it may have a distinct result per attached Gateway.
+
+ Policies targeting the same resource may have different effects depending on the
+ ancestors of those resources. For example, different Gateways targeting the same
+ Service may have different capabilities, especially if they have different underlying
+ implementations.
+
+ For example, in BackendTLSPolicy, the Policy attaches to a Service that is
+ used as a backend in a HTTPRoute that is itself attached to a Gateway.
+ In this case, the relevant object for status is the Gateway, and that is the
+ ancestor object referred to in this status.
+
+ Note that a parent is also an ancestor, so for objects where the parent is the
+ relevant object for status, this struct SHOULD still be used.
+
+ This struct is intended to be used in a slice that's effectively a map,
+ with a composite key made up of the AncestorRef and the ControllerName.
+ properties:
+ ancestorRef:
+ description: |-
+ AncestorRef corresponds with a ParentRef in the spec that this
+ PolicyAncestorStatus struct describes the status of.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: |-
+ Group is the group of the referent.
+ When unspecified, "gateway.networking.k8s.io" is inferred.
+ To set the core API group (such as for a "Service" kind referent),
+ Group must be explicitly set to "" (empty string).
+
+ Support: Core
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Gateway
+ description: |-
+ Kind is kind of the referent.
+
+ There are two kinds of parent resources with "Core" support:
+
+ * Gateway (Gateway conformance profile)
+ * Service (Mesh conformance profile, ClusterIP Services only)
+
+ Support for other resources is Implementation-Specific.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: |-
+ Name is the name of the referent.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent. When unspecified, this refers
+ to the local namespace of the Route.
+
+ Note that there are specific rules for ParentRefs which cross namespace
+ boundaries. Cross-namespace references are only valid if they are explicitly
+ allowed by something in the namespace they are referring to. For example:
+ Gateway has the AllowedRoutes field, and ReferenceGrant provides a
+ generic way to enable any other kind of cross-namespace reference.
+
+
+ ParentRefs from a Route to a Service in the same namespace are "producer"
+ routes, which apply default routing rules to inbound connections from
+ any namespace to the Service.
+
+ ParentRefs from a Route to a Service in a different namespace are
+ "consumer" routes, and these routing rules are only applied to outbound
+ connections originating from the same namespace as the Route, for which
+ the intended destination of the connections are a Service targeted as a
+ ParentRef of the Route.
+
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ port:
+ description: |-
+ Port is the network port this Route targets. It can be interpreted
+ differently based on the type of parent resource.
+
+ When the parent resource is a Gateway, this targets all listeners
+ listening on the specified port that also support this kind of Route(and
+ select this Route). It's not recommended to set `Port` unless the
+ networking behaviors specified in a Route must apply to a specific port
+ as opposed to a listener(s) whose port(s) may be changed. When both Port
+ and SectionName are specified, the name and port of the selected listener
+ must match both specified values.
+
+
+ When the parent resource is a Service, this targets a specific port in the
+ Service spec. When both Port (experimental) and SectionName are specified,
+ the name and port of the selected port must match both specified values.
+
+
+ Implementations MAY choose to support other parent resources.
+ Implementations supporting other types of parent resources MUST clearly
+ document how/if Port is interpreted.
+
+ For the purpose of status, an attachment is considered successful as
+ long as the parent resource accepts it partially. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
+ from the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route,
+ the Route MUST be considered detached from the Gateway.
+
+ Support: Extended
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ sectionName:
+ description: |-
+ SectionName is the name of a section within the target resource. In the
+ following resources, SectionName is interpreted as the following:
+
+ * Gateway: Listener name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+ * Service: Port name. When both Port (experimental) and SectionName
+ are specified, the name and port of the selected listener must match
+ both specified values.
+
+ Implementations MAY choose to support attaching Routes to other resources.
+ If that is the case, they MUST clearly document how SectionName is
+ interpreted.
+
+ When unspecified (empty string), this will reference the entire resource.
+ For the purpose of status, an attachment is considered successful if at
+ least one section in the parent resource accepts it. For example, Gateway
+ listeners can restrict which Routes can attach to them by Route kind,
+ namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
+ the referencing Route, the Route MUST be considered successfully
+ attached. If no Gateway listeners accept attachment from this Route, the
+ Route MUST be considered detached from the Gateway.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ required:
+ - name
+ type: object
+ conditions:
+ description: Conditions describes the status of the Policy with
+ respect to the given Ancestor.
+ items:
+ description: Condition contains details for one aspect of
+ the current state of this API Resource.
+ properties:
+ lastTransitionTime:
+ description: |-
+ lastTransitionTime is the last time the condition transitioned from one status to another.
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
+ format: date-time
+ type: string
+ message:
+ description: |-
+ message is a human readable message indicating details about the transition.
+ This may be an empty string.
+ maxLength: 32768
+ type: string
+ observedGeneration:
+ description: |-
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+ with respect to the current state of the instance.
+ format: int64
+ minimum: 0
+ type: integer
+ reason:
+ description: |-
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
+ Producers of specific condition types may define expected values and meanings for this field,
+ and whether the values are considered a guaranteed API.
+ The value should be a CamelCase string.
+ This field may not be empty.
+ maxLength: 1024
+ minLength: 1
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+ type: string
+ status:
+ description: status of the condition, one of True, False,
+ Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
+ type: string
+ type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ maxLength: 316
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+ type: string
+ required:
+ - lastTransitionTime
+ - message
+ - reason
+ - status
+ - type
+ type: object
+ maxItems: 8
+ minItems: 1
+ type: array
+ x-kubernetes-list-map-keys:
+ - type
+ x-kubernetes-list-type: map
+ controllerName:
+ description: |-
+ ControllerName is a domain/path string that indicates the name of the
+ controller that wrote this status. This corresponds with the
+ controllerName field on GatewayClass.
+
+ Example: "example.net/gateway-controller".
+
+ The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are
+ valid Kubernetes names
+ (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).
+
+ Controllers MUST populate this field when writing status. Controllers should ensure that
+ entries to status populated with their ControllerName are cleaned up when they are no
+ longer necessary.
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$
+ type: string
+ required:
+ - ancestorRef
+ - conditions
+ - controllerName
+ type: object
+ maxItems: 16
+ type: array
+ x-kubernetes-list-type: atomic
+ required:
+ - ancestors
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
+status:
+ acceptedNames:
+ kind: ""
+ plural: ""
+ conditions: null
+ storedVersions: null
+---
+#
+# config/crd/experimental/gateway.networking.x-k8s.io_xlistenersets.yaml
+#
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
+ gateway.networking.k8s.io/bundle-version: v1.4.0
+ gateway.networking.k8s.io/channel: experimental
+ name: xlistenersets.gateway.networking.x-k8s.io
+spec:
+ group: gateway.networking.x-k8s.io
+ names:
+ categories:
+ - gateway-api
+ kind: XListenerSet
+ listKind: XListenerSetList
+ plural: xlistenersets
+ shortNames:
+ - lset
+ singular: xlistenerset
+ scope: Namespaced
+ versions:
+ - additionalPrinterColumns:
+ - jsonPath: .status.conditions[?(@.type=="Accepted")].status
+ name: Accepted
+ type: string
+ - jsonPath: .status.conditions[?(@.type=="Programmed")].status
+ name: Programmed
+ type: string
+ - jsonPath: .metadata.creationTimestamp
+ name: Age
+ type: date
+ name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: |-
+ XListenerSet defines a set of additional listeners to attach to an existing Gateway.
+ This resource provides a mechanism to merge multiple listeners into a single Gateway.
+
+ The parent Gateway must explicitly allow ListenerSet attachment through its
+ AllowedListeners configuration. By default, Gateways do not allow ListenerSet
+ attachment.
+
+ Routes can attach to a ListenerSet by specifying it as a parentRef, and can
+ optionally target specific listeners using the sectionName field.
+
+ Policy Attachment:
+ - Policies that attach to a ListenerSet apply to all listeners defined in that resource
+ - Policies do not impact listeners in the parent Gateway
+ - Different ListenerSets attached to the same Gateway can have different policies
+ - If an implementation cannot apply a policy to specific listeners, it should reject the policy
+
+ ReferenceGrant Semantics:
+ - ReferenceGrants applied to a Gateway are not inherited by child ListenerSets
+ - ReferenceGrants applied to a ListenerSet do not grant permission to the parent Gateway's listeners
+ - A ListenerSet can reference secrets/backends in its own namespace without a ReferenceGrant
+
+ Gateway Integration:
+ - The parent Gateway's status will include an "AttachedListenerSets" condition
+ - This condition will be:
+ - True: when AllowedListeners is set and at least one child ListenerSet is attached
+ - False: when AllowedListeners is set but no valid listeners are attached, or when AllowedListeners is not set or false
+ - Unknown: when no AllowedListeners config is present
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: Spec defines the desired state of ListenerSet.
+ properties:
+ listeners:
+ description: |-
+ Listeners associated with this ListenerSet. Listeners define
+ logical endpoints that are bound on this referenced parent Gateway's addresses.
+
+ Listeners in a `Gateway` and their attached `ListenerSets` are concatenated
+ as a list when programming the underlying infrastructure. Each listener
+ name does not need to be unique across the Gateway and ListenerSets.
+ See ListenerEntry.Name for more details.
+
+ Implementations MUST treat the parent Gateway as having the merged
+ list of all listeners from itself and attached ListenerSets using
+ the following precedence:
+
+ 1. "parent" Gateway
+ 2. ListenerSet ordered by creation time (oldest first)
+ 3. ListenerSet ordered alphabetically by "{namespace}/{name}".
+
+ An implementation MAY reject listeners by setting the ListenerEntryStatus
+ `Accepted` condition to False with the Reason `TooManyListeners`
+
+ If a listener has a conflict, this will be reported in the
+ Status.ListenerEntryStatus setting the `Conflicted` condition to True.
+
+ Implementations SHOULD be cautious about what information from the
+ parent or siblings are reported to avoid accidentally leaking
+ sensitive information that the child would not otherwise have access
+ to. This can include contents of secrets etc.
+ items:
+ properties:
+ allowedRoutes:
+ default:
+ namespaces:
+ from: Same
+ description: |-
+ AllowedRoutes defines the types of routes that MAY be attached to a
+ Listener and the trusted namespaces where those Route resources MAY be
+ present.
+
+ Although a client request may match multiple route rules, only one rule
+ may ultimately receive the request. Matching precedence MUST be
+ determined in order of the following criteria:
+
+ * The most specific match as defined by the Route type.
+ * The oldest Route based on creation timestamp. For example, a Route with
+ a creation timestamp of "2020-09-08 01:02:03" is given precedence over
+ a Route with a creation timestamp of "2020-09-08 01:02:04".
+ * If everything else is equivalent, the Route appearing first in
+ alphabetical order (namespace/name) should be given precedence. For
+ example, foo/bar is given precedence over foo/baz.
+
+ All valid rules within a Route attached to this Listener should be
+ implemented. Invalid Route rules can be ignored (sometimes that will mean
+ the full Route). If a Route rule transitions from valid to invalid,
+ support for that Route rule should be dropped to ensure consistency. For
+ example, even if a filter specified by a Route rule is invalid, the rest
+ of the rules within that Route should still be supported.
+ properties:
+ kinds:
+ description: |-
+ Kinds specifies the groups and kinds of Routes that are allowed to bind
+ to this Gateway Listener. When unspecified or empty, the kinds of Routes
+ selected are determined using the Listener protocol.
+
+ A RouteGroupKind MUST correspond to kinds of Routes that are compatible
+ with the application protocol specified in the Listener's Protocol field.
+ If an implementation does not support or recognize this resource type, it
+ MUST set the "ResolvedRefs" condition to False for this Listener with the
+ "InvalidRouteKinds" reason.
+
+ Support: Core
+ items:
+ description: RouteGroupKind indicates the group and kind
+ of a Route resource.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: Group is the group of the Route.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is the kind of the Route.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ required:
+ - kind
+ type: object
+ maxItems: 8
+ type: array
+ x-kubernetes-list-type: atomic
+ namespaces:
+ default:
+ from: Same
+ description: |-
+ Namespaces indicates namespaces from which Routes may be attached to this
+ Listener. This is restricted to the namespace of this Gateway by default.
+
+ Support: Core
+ properties:
+ from:
+ default: Same
+ description: |-
+ From indicates where Routes will be selected for this Gateway. Possible
+ values are:
+
+ * All: Routes in all namespaces may be used by this Gateway.
+ * Selector: Routes in namespaces selected by the selector may be used by
+ this Gateway.
+ * Same: Only Routes in the same namespace may be used by this Gateway.
+
+ Support: Core
+ enum:
+ - All
+ - Selector
+ - Same
+ type: string
+ selector:
+ description: |-
+ Selector must be specified when From is set to "Selector". In that case,
+ only Routes in Namespaces matching this Selector will be selected by this
+ Gateway. This field is ignored for other values of "From".
+
+ Support: Core
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are ANDed.
+ items:
+ description: |-
+ A label selector requirement is a selector that contains values, a key, and an operator that
+ relates the key and values.
+ properties:
+ key:
+ description: key is the label key that the
+ selector applies to.
+ type: string
+ operator:
+ description: |-
+ operator represents a key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: |-
+ values is an array of string values. If the operator is In or NotIn,
+ the values array must be non-empty. If the operator is Exists or DoesNotExist,
+ the values array must be empty. This array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ x-kubernetes-list-type: atomic
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: |-
+ matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
+ map is equivalent to an element of matchExpressions, whose key field is "key", the
+ operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ type: object
+ type: object
+ hostname:
+ description: |-
+ Hostname specifies the virtual hostname to match for protocol types that
+ define this concept. When unspecified, all hostnames are matched. This
+ field is ignored for protocols that don't require hostname based
+ matching.
+
+ Implementations MUST apply Hostname matching appropriately for each of
+ the following protocols:
+
+ * TLS: The Listener Hostname MUST match the SNI.
+ * HTTP: The Listener Hostname MUST match the Host header of the request.
+ * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP
+ protocol layers as described above. If an implementation does not
+ ensure that both the SNI and Host header match the Listener hostname,
+ it MUST clearly document that.
+
+ For HTTPRoute and TLSRoute resources, there is an interaction with the
+ `spec.hostnames` array. When both listener and route specify hostnames,
+ there MUST be an intersection between the values for a Route to be
+ accepted. For more information, refer to the Route specific Hostnames
+ documentation.
+
+ Hostnames that are prefixed with a wildcard label (`*.`) are interpreted
+ as a suffix match. That means that a match for `*.example.com` would match
+ both `test.example.com`, and `foo.test.example.com`, but not `example.com`.
+ maxLength: 253
+ minLength: 1
+ pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ name:
+ description: |-
+ Name is the name of the Listener. This name MUST be unique within a
+ ListenerSet.
+
+ Name is not required to be unique across a Gateway and ListenerSets.
+ Routes can attach to a Listener by having a ListenerSet as a parentRef
+ and setting the SectionName
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ port:
+ default: 0
+ description: |-
+ Port is the network port. Multiple listeners may use the
+ same port, subject to the Listener compatibility rules.
+
+ If the port is not set or specified as zero, the implementation will assign
+ a unique port. If the implementation does not support dynamic port
+ assignment, it MUST set `Accepted` condition to `False` with the
+ `UnsupportedPort` reason.
+ format: int32
+ maximum: 65535
+ minimum: 0
+ type: integer
+ protocol:
+ description: Protocol specifies the network protocol this listener
+ expects to receive.
+ maxLength: 255
+ minLength: 1
+ pattern: ^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?$|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9]+$
+ type: string
+ tls:
+ description: |-
+ TLS is the TLS configuration for the Listener. This field is required if
+ the Protocol field is "HTTPS" or "TLS". It is invalid to set this field
+ if the Protocol field is "HTTP", "TCP", or "UDP".
+
+ The association of SNIs to Certificate defined in ListenerTLSConfig is
+ defined based on the Hostname field for this listener.
+
+ The GatewayClass MUST use the longest matching SNI out of all
+ available certificates for any TLS handshake.
+ properties:
+ certificateRefs:
+ description: |-
+ CertificateRefs contains a series of references to Kubernetes objects that
+ contains TLS certificates and private keys. These certificates are used to
+ establish a TLS handshake for requests that match the hostname of the
+ associated listener.
+
+ A single CertificateRef to a Kubernetes Secret has "Core" support.
+ Implementations MAY choose to support attaching multiple certificates to
+ a Listener, but this behavior is implementation-specific.
+
+ References to a resource in different namespace are invalid UNLESS there
+ is a ReferenceGrant in the target namespace that allows the certificate
+ to be attached. If a ReferenceGrant does not allow this reference, the
+ "ResolvedRefs" condition MUST be set to False for this listener with the
+ "RefNotPermitted" reason.
+
+ This field is required to have at least one element when the mode is set
+ to "Terminate" (default) and is optional otherwise.
+
+ CertificateRefs can reference to standard Kubernetes resources, i.e.
+ Secret, or implementation-specific custom resources.
+
+ Support: Core - A single reference to a Kubernetes Secret of type kubernetes.io/tls
+
+ Support: Implementation-specific (More than one reference or other resource types)
+ items:
+ description: |-
+ SecretObjectReference identifies an API object including its namespace,
+ defaulting to Secret.
+
+ The API object must be valid in the cluster; the Group and Kind must
+ be registered in the cluster for this reference to be valid.
+
+ References to objects with invalid Group and Kind are not valid, and must
+ be rejected by the implementation, with appropriate Conditions set
+ on the containing object.
+ properties:
+ group:
+ default: ""
+ description: |-
+ Group is the group of the referent. For example, "gateway.networking.k8s.io".
+ When unspecified or empty string, core API group is inferred.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Secret
+ description: Kind is kind of the referent. For example
+ "Secret".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referenced object. When unspecified, the local
+ namespace is inferred.
+
+ Note that when a namespace different than the local namespace is specified,
+ a ReferenceGrant object is required in the referent namespace to allow that
+ namespace's owner to accept the reference. See the ReferenceGrant
+ documentation for details.
+
+ Support: Core
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - name
+ type: object
+ maxItems: 64
+ type: array
+ x-kubernetes-list-type: atomic
+ mode:
+ default: Terminate
+ description: |-
+ Mode defines the TLS behavior for the TLS session initiated by the client.
+ There are two possible modes:
+
+ - Terminate: The TLS session between the downstream client and the
+ Gateway is terminated at the Gateway. This mode requires certificates
+ to be specified in some way, such as populating the certificateRefs
+ field.
+ - Passthrough: The TLS session is NOT terminated by the Gateway. This
+ implies that the Gateway can't decipher the TLS stream except for
+ the ClientHello message of the TLS protocol. The certificateRefs field
+ is ignored in this mode.
+
+ Support: Core
+ enum:
+ - Terminate
+ - Passthrough
+ type: string
+ options:
+ additionalProperties:
+ description: |-
+ AnnotationValue is the value of an annotation in Gateway API. This is used
+ for validation of maps such as TLS options. This roughly matches Kubernetes
+ annotation validation, although the length validation in that case is based
+ on the entire size of the annotations struct.
+ maxLength: 4096
+ minLength: 0
+ type: string
+ description: |-
+ Options are a list of key/value pairs to enable extended TLS
+ configuration for each implementation. For example, configuring the
+ minimum TLS version or supported cipher suites.
+
+ A set of common keys MAY be defined by the API in the future. To avoid
+ any ambiguity, implementation-specific definitions MUST use
+ domain-prefixed names, such as `example.com/my-custom-option`.
+ Un-prefixed names are reserved for key names defined by Gateway API.
+
+ Support: Implementation-specific
+ maxProperties: 16
+ type: object
+ type: object
+ x-kubernetes-validations:
+ - message: certificateRefs or options must be specified when
+ mode is Terminate
+ rule: 'self.mode == ''Terminate'' ? size(self.certificateRefs)
+ > 0 || size(self.options) > 0 : true'
+ required:
+ - name
+ - protocol
+ type: object
+ maxItems: 64
+ minItems: 1
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ x-kubernetes-validations:
+ - message: tls must not be specified for protocols ['HTTP', 'TCP',
+ 'UDP']
+ rule: 'self.all(l, l.protocol in [''HTTP'', ''TCP'', ''UDP''] ?
+ !has(l.tls) : true)'
+ - message: tls mode must be Terminate for protocol HTTPS
+ rule: 'self.all(l, (l.protocol == ''HTTPS'' && has(l.tls)) ? (l.tls.mode
+ == '''' || l.tls.mode == ''Terminate'') : true)'
+ - message: hostname must not be specified for protocols ['TCP', 'UDP']
+ rule: 'self.all(l, l.protocol in [''TCP'', ''UDP''] ? (!has(l.hostname)
+ || l.hostname == '''') : true)'
+ - message: Listener name must be unique within the Gateway
+ rule: self.all(l1, self.exists_one(l2, l1.name == l2.name))
+ - message: Combination of port, protocol and hostname must be unique
+ for each listener
+ rule: 'self.all(l1, !has(l1.port) || self.exists_one(l2, has(l2.port)
+ && l1.port == l2.port && l1.protocol == l2.protocol && (has(l1.hostname)
+ && has(l2.hostname) ? l1.hostname == l2.hostname : !has(l1.hostname)
+ && !has(l2.hostname))))'
+ parentRef:
+ description: ParentRef references the Gateway that the listeners are
+ attached to.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: Group is the group of the referent.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ default: Gateway
+ description: Kind is kind of the referent. For example "Gateway".
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent. If not present,
+ the namespace of the referent is assumed to be the same as
+ the namespace of the referring object.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - name
+ type: object
+ required:
+ - listeners
+ - parentRef
+ type: object
+ status:
+ default:
+ conditions:
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Accepted
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Programmed
+ description: Status defines the current state of ListenerSet.
+ properties:
+ conditions:
+ default:
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Accepted
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Programmed
+ description: |-
+ Conditions describe the current conditions of the ListenerSet.
+
+ Implementations MUST express ListenerSet conditions using the
+ `ListenerSetConditionType` and `ListenerSetConditionReason`
+ constants so that operators and tools can converge on a common
+ vocabulary to describe ListenerSet state.
+
+ Known condition types are:
+
+ * "Accepted"
+ * "Programmed"
+ items:
+ description: Condition contains details for one aspect of the current
+ state of this API Resource.
+ properties:
+ lastTransitionTime:
+ description: |-
+ lastTransitionTime is the last time the condition transitioned from one status to another.
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
+ format: date-time
+ type: string
+ message:
+ description: |-
+ message is a human readable message indicating details about the transition.
+ This may be an empty string.
+ maxLength: 32768
+ type: string
+ observedGeneration:
+ description: |-
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+ with respect to the current state of the instance.
+ format: int64
+ minimum: 0
+ type: integer
+ reason:
+ description: |-
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
+ Producers of specific condition types may define expected values and meanings for this field,
+ and whether the values are considered a guaranteed API.
+ The value should be a CamelCase string.
+ This field may not be empty.
+ maxLength: 1024
+ minLength: 1
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+ type: string
+ status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
+ type: string
+ type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ maxLength: 316
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+ type: string
+ required:
+ - lastTransitionTime
+ - message
+ - reason
+ - status
+ - type
+ type: object
+ maxItems: 8
+ type: array
+ x-kubernetes-list-map-keys:
+ - type
+ x-kubernetes-list-type: map
+ listeners:
+ description: Listeners provide status for each unique listener port
+ defined in the Spec.
+ items:
+ description: ListenerStatus is the status associated with a Listener.
+ properties:
+ attachedRoutes:
+ description: |-
+ AttachedRoutes represents the total number of Routes that have been
+ successfully attached to this Listener.
+
+ Successful attachment of a Route to a Listener is based solely on the
+ combination of the AllowedRoutes field on the corresponding Listener
+ and the Route's ParentRefs field. A Route is successfully attached to
+ a Listener when it is selected by the Listener's AllowedRoutes field
+ AND the Route has a valid ParentRef selecting the whole Gateway
+ resource or a specific Listener as a parent resource (more detail on
+ attachment semantics can be found in the documentation on the various
+ Route kinds ParentRefs fields). Listener or Route status does not impact
+ successful attachment, i.e. the AttachedRoutes field count MUST be set
+ for Listeners with condition Accepted: false and MUST count successfully
+ attached Routes that may themselves have Accepted: false conditions.
+
+ Uses for this field include troubleshooting Route attachment and
+ measuring blast radius/impact of changes to a Listener.
+ format: int32
+ type: integer
+ conditions:
+ description: Conditions describe the current condition of this
+ listener.
+ items:
+ description: Condition contains details for one aspect of
+ the current state of this API Resource.
+ properties:
+ lastTransitionTime:
+ description: |-
+ lastTransitionTime is the last time the condition transitioned from one status to another.
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
+ format: date-time
+ type: string
+ message:
+ description: |-
+ message is a human readable message indicating details about the transition.
+ This may be an empty string.
+ maxLength: 32768
+ type: string
+ observedGeneration:
+ description: |-
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+ with respect to the current state of the instance.
+ format: int64
+ minimum: 0
+ type: integer
+ reason:
+ description: |-
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
+ Producers of specific condition types may define expected values and meanings for this field,
+ and whether the values are considered a guaranteed API.
+ The value should be a CamelCase string.
+ This field may not be empty.
+ maxLength: 1024
+ minLength: 1
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+ type: string
+ status:
+ description: status of the condition, one of True, False,
+ Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
+ type: string
+ type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ maxLength: 316
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+ type: string
+ required:
+ - lastTransitionTime
+ - message
+ - reason
+ - status
+ - type
+ type: object
+ maxItems: 8
+ type: array
+ x-kubernetes-list-map-keys:
+ - type
+ x-kubernetes-list-type: map
+ name:
+ description: Name is the name of the Listener that this status
+ corresponds to.
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ port:
+ description: Port is the network port the listener is configured
+ to listen on.
+ format: int32
+ maximum: 65535
+ minimum: 1
+ type: integer
+ supportedKinds:
+ description: |-
+ SupportedKinds is the list indicating the Kinds supported by this
+ listener. This MUST represent the kinds an implementation supports for
+ that Listener configuration.
+
+ If kinds are specified in Spec that are not supported, they MUST NOT
+ appear in this list and an implementation MUST set the "ResolvedRefs"
+ condition to "False" with the "InvalidRouteKinds" reason. If both valid
+ and invalid Route kinds are specified, the implementation MUST
+ reference the valid Route kinds that have been specified.
+ items:
+ description: RouteGroupKind indicates the group and kind of
+ a Route resource.
+ properties:
+ group:
+ default: gateway.networking.k8s.io
+ description: Group is the group of the Route.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is the kind of the Route.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ required:
+ - kind
+ type: object
+ maxItems: 8
+ type: array
+ x-kubernetes-list-type: atomic
+ required:
+ - attachedRoutes
+ - conditions
+ - name
+ - port
+ - supportedKinds
+ type: object
+ maxItems: 64
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
+status:
+ acceptedNames:
+ kind: ""
+ plural: ""
+ conditions: null
+ storedVersions: null
+---
+#
+# config/crd/experimental/gateway.networking.x-k8s.io_xmeshes.yaml
+#
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328
+ gateway.networking.k8s.io/bundle-version: v1.4.0
+ gateway.networking.k8s.io/channel: experimental
+ name: xmeshes.gateway.networking.x-k8s.io
+spec:
+ group: gateway.networking.x-k8s.io
+ names:
+ categories:
+ - gateway-api
+ kind: XMesh
+ listKind: XMeshList
+ plural: xmeshes
+ shortNames:
+ - mesh
+ singular: xmesh
+ scope: Cluster
+ versions:
+ - additionalPrinterColumns:
+ - jsonPath: .status.conditions[?(@.type=="Accepted")].status
+ name: Accepted
+ type: string
+ - jsonPath: .metadata.creationTimestamp
+ name: Age
+ type: date
+ name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: XMesh defines mesh-wide characteristics of a GAMMA-compliant
+ service mesh.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: Spec defines the desired state of XMesh.
+ properties:
+ controllerName:
+ description: |-
+ ControllerName is the name of a controller that is managing Gateway API
+ resources for mesh traffic management. The value of this field MUST be a
+ domain prefixed path.
+
+ Example: "example.com/awesome-mesh".
+
+ This field is not mutable and cannot be empty.
+
+ Support: Core
+ maxLength: 253
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$
+ type: string
+ x-kubernetes-validations:
+ - message: Value is immutable
+ rule: self == oldSelf
+ description:
+ description: Description optionally provides a human-readable description
+ of a Mesh.
+ maxLength: 64
+ type: string
+ parametersRef:
+ description: |-
+ ParametersRef is an optional reference to a resource that contains
+ implementation-specific configuration for this Mesh. If no
+ implementation-specific parameters are needed, this field MUST be
+ omitted.
+
+ ParametersRef can reference a standard Kubernetes resource, i.e.
+ ConfigMap, or an implementation-specific custom resource. The resource
+ can be cluster-scoped or namespace-scoped.
+
+ If the referent cannot be found, refers to an unsupported kind, or when
+ the data within that resource is malformed, the Mesh MUST be rejected
+ with the "Accepted" status condition set to "False" and an
+ "InvalidParameters" reason.
+
+ Support: Implementation-specific
+ properties:
+ group:
+ description: Group is the group of the referent.
+ maxLength: 253
+ pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+ type: string
+ kind:
+ description: Kind is kind of the referent.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referent.
+ maxLength: 253
+ minLength: 1
+ type: string
+ namespace:
+ description: |-
+ Namespace is the namespace of the referent.
+ This field is required when referring to a Namespace-scoped resource and
+ MUST be unset when referring to a Cluster-scoped resource.
+ maxLength: 63
+ minLength: 1
+ pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+ type: string
+ required:
+ - group
+ - kind
+ - name
+ type: object
+ required:
+ - controllerName
+ type: object
+ status:
+ default:
+ conditions:
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Accepted
+ description: Status defines the current state of XMesh.
+ properties:
+ conditions:
+ default:
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Accepted
+ - lastTransitionTime: "1970-01-01T00:00:00Z"
+ message: Waiting for controller
+ reason: Pending
+ status: Unknown
+ type: Programmed
+ description: |-
+ Conditions is the current status from the controller for
+ this Mesh.
+
+ Controllers should prefer to publish conditions using values
+ of MeshConditionType for the type of each Condition.
+ items:
+ description: Condition contains details for one aspect of the current
+ state of this API Resource.
+ properties:
+ lastTransitionTime:
+ description: |-
+ lastTransitionTime is the last time the condition transitioned from one status to another.
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
+ format: date-time
+ type: string
+ message:
+ description: |-
+ message is a human readable message indicating details about the transition.
+ This may be an empty string.
+ maxLength: 32768
+ type: string
+ observedGeneration:
+ description: |-
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+ with respect to the current state of the instance.
+ format: int64
+ minimum: 0
+ type: integer
+ reason:
+ description: |-
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
+ Producers of specific condition types may define expected values and meanings for this field,
+ and whether the values are considered a guaranteed API.
+ The value should be a CamelCase string.
+ This field may not be empty.
+ maxLength: 1024
+ minLength: 1
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+ type: string
+ status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
+ type: string
+ type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ maxLength: 316
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+ type: string
+ required:
+ - lastTransitionTime
+ - message
+ - reason
+ - status
+ - type
+ type: object
+ maxItems: 8
+ type: array
+ x-kubernetes-list-map-keys:
+ - type
+ x-kubernetes-list-type: map
+ supportedFeatures:
+ description: |-
+ SupportedFeatures is the set of features the Mesh support.
+ It MUST be sorted in ascending alphabetical order by the Name key.
+ items:
+ properties:
+ name:
+ description: |-
+ FeatureName is used to describe distinct features that are covered by
+ conformance tests.
+ type: string
+ required:
+ - name
+ type: object
+ maxItems: 64
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
+status:
+ acceptedNames:
+ kind: ""
+ plural: ""
+ conditions: null
+ storedVersions: null
diff --git a/integration/fixtures/k8s_gateway_conformance.toml b/integration/fixtures/k8s_gateway_conformance.toml
deleted file mode 100644
index 5114f2dfb..000000000
--- a/integration/fixtures/k8s_gateway_conformance.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-[global]
- checkNewVersion = false
- sendAnonymousUsage = false
-
-[log]
- level = "DEBUG"
- noColor = true
-
-[api]
- insecure = true
-
-[experimental]
- kubernetesGateway = true
-
-[entryPoints]
- [entryPoints.web]
- address = ":80"
- [entryPoints.websecure]
- address = ":443"
-
-[providers.kubernetesGateway]
diff --git a/integration/conformance-reports/v1.3.0/experimental-v3.5-default-report.yaml b/integration/gateway-api-conformance-reports/v1.4.0/experimental-v3.6-default-report.yaml
similarity index 93%
rename from integration/conformance-reports/v1.3.0/experimental-v3.5-default-report.yaml
rename to integration/gateway-api-conformance-reports/v1.4.0/experimental-v3.6-default-report.yaml
index 0facbd714..429592e4a 100644
--- a/integration/conformance-reports/v1.3.0/experimental-v3.5-default-report.yaml
+++ b/integration/gateway-api-conformance-reports/v1.4.0/experimental-v3.6-default-report.yaml
@@ -1,14 +1,14 @@
apiVersion: gateway.networking.k8s.io/v1
date: '-'
gatewayAPIChannel: experimental
-gatewayAPIVersion: v1.3.0
+gatewayAPIVersion: v1.4.0
implementation:
contact:
- '@traefik/maintainers'
organization: traefik
project: traefik
url: https://traefik.io/
- version: v3.5
+ version: v3.6
kind: ConformanceReport
mode: default
profiles:
@@ -16,7 +16,7 @@ profiles:
result: success
statistics:
Failed: 0
- Passed: 12
+ Passed: 13
Skipped: 0
name: GATEWAY-GRPC
summary: Core tests succeeded.
@@ -52,6 +52,8 @@ profiles:
- GatewayStaticAddresses
- HTTPRouteBackendRequestHeaderModification
- HTTPRouteBackendTimeout
+ - HTTPRouteCORS
+ - HTTPRouteNamedRouteRule
- HTTPRouteParentRefPort
- HTTPRouteRequestMirror
- HTTPRouteRequestMultipleMirrors
diff --git a/integration/k8s_conformance_test.go b/integration/gateway_api_conformance_test.go
similarity index 85%
rename from integration/k8s_conformance_test.go
rename to integration/gateway_api_conformance_test.go
index 22aae5b15..9a25125d6 100644
--- a/integration/k8s_conformance_test.go
+++ b/integration/gateway_api_conformance_test.go
@@ -1,3 +1,5 @@
+//go:build gatewayAPIConformance
+
package integration
import (
@@ -37,8 +39,8 @@ import (
"sigs.k8s.io/yaml"
)
-// K8sConformanceSuite tests suite.
-type K8sConformanceSuite struct {
+// GatewayAPIConformanceSuite tests suite.
+type GatewayAPIConformanceSuite struct {
BaseSuite
k3sContainer *k3s.K3sContainer
@@ -47,15 +49,11 @@ type K8sConformanceSuite struct {
clientSet *kclientset.Clientset
}
-func TestK8sConformanceSuite(t *testing.T) {
- suite.Run(t, new(K8sConformanceSuite))
+func TestGatewayAPIConformanceSuite(t *testing.T) {
+ suite.Run(t, new(GatewayAPIConformanceSuite))
}
-func (s *K8sConformanceSuite) SetupSuite() {
- if !*k8sConformance {
- s.T().Skip("Skip because it can take a long time to execute. To enable pass the `k8sConformance` flag.")
- }
-
+func (s *GatewayAPIConformanceSuite) SetupSuite() {
s.BaseSuite.SetupSuite()
// Avoid panic.
@@ -82,9 +80,9 @@ func (s *K8sConformanceSuite) SetupSuite() {
s.k3sContainer, err = k3s.Run(ctx,
k3sImage,
- k3s.WithManifest("./fixtures/k8s-conformance/00-experimental-v1.3.0.yml"),
- k3s.WithManifest("./fixtures/k8s-conformance/01-rbac.yml"),
- k3s.WithManifest("./fixtures/k8s-conformance/02-traefik.yml"),
+ k3s.WithManifest("./fixtures/gateway-api-conformance/00-experimental-v1.4.0.yml"),
+ k3s.WithManifest("./fixtures/gateway-api-conformance/01-rbac.yml"),
+ k3s.WithManifest("./fixtures/gateway-api-conformance/02-traefik.yml"),
network.WithNetwork(nil, s.network),
)
if err != nil {
@@ -137,7 +135,7 @@ func (s *K8sConformanceSuite) SetupSuite() {
}
}
-func (s *K8sConformanceSuite) TearDownSuite() {
+func (s *GatewayAPIConformanceSuite) TearDownSuite() {
ctx := s.T().Context()
if s.T().Failed() || *showLog {
@@ -163,7 +161,7 @@ func (s *K8sConformanceSuite) TearDownSuite() {
s.BaseSuite.TearDownSuite()
}
-func (s *K8sConformanceSuite) TestK8sGatewayAPIConformance() {
+func (s *GatewayAPIConformanceSuite) TestK8sGatewayAPIConformance() {
// Wait for traefik to start
k3sContainerIP, err := s.k3sContainer.ContainerIP(s.T().Context())
require.NoError(s.T(), err)
@@ -181,12 +179,12 @@ func (s *K8sConformanceSuite) TestK8sGatewayAPIConformance() {
TimeoutConfig: config.DefaultTimeoutConfig(),
ManifestFS: []fs.FS{&conformance.Manifests},
EnableAllSupportedFeatures: false,
- RunTest: *k8sConformanceRunTest,
+ RunTest: *gatewayAPIConformanceRunTest,
Implementation: v1.Implementation{
Organization: "traefik",
Project: "traefik",
URL: "https://traefik.io/",
- Version: *k8sConformanceTraefikVersion,
+ Version: *traefikVersion,
Contact: []string{"@traefik/maintainers"},
},
ConformanceProfiles: sets.New(
@@ -220,8 +218,8 @@ func (s *K8sConformanceSuite) TestK8sGatewayAPIConformance() {
require.NoError(s.T(), err)
s.T().Logf("Conformance report:\n%s", string(rawReport))
- require.NoError(s.T(), os.MkdirAll("./conformance-reports/"+report.GatewayAPIVersion, 0o755))
- outFile := filepath.Join("conformance-reports/"+report.GatewayAPIVersion, fmt.Sprintf("%s-%s-%s-report.yaml", report.GatewayAPIChannel, report.Version, report.Mode))
+ require.NoError(s.T(), os.MkdirAll("./gateway-api-conformance-reports/"+report.GatewayAPIVersion, 0o755))
+ outFile := filepath.Join("gateway-api-conformance-reports/"+report.GatewayAPIVersion, fmt.Sprintf("%s-%s-%s-report.yaml", report.GatewayAPIChannel, report.Version, report.Mode))
require.NoError(s.T(), os.WriteFile(outFile, rawReport, 0o600))
s.T().Logf("Report written to: %s", outFile)
}
diff --git a/integration/integration_test.go b/integration/integration_test.go
index e1b967c1a..815463498 100644
--- a/integration/integration_test.go
+++ b/integration/integration_test.go
@@ -37,9 +37,8 @@ import (
var (
showLog = flag.Bool("tlog", false, "always show Traefik logs")
- k8sConformance = flag.Bool("k8sConformance", false, "run K8s Gateway API conformance test")
- k8sConformanceRunTest = flag.String("k8sConformanceRunTest", "", "run a specific K8s Gateway API conformance test")
- k8sConformanceTraefikVersion = flag.String("k8sConformanceTraefikVersion", "dev", "specify the Traefik version for the K8s Gateway API conformance report")
+ gatewayAPIConformanceRunTest = flag.String("gatewayAPIConformanceRunTest", "", "runs a specific Gateway API conformance test")
+ traefikVersion = flag.String("traefikVersion", "dev", "defines the Traefik version")
)
const (
diff --git a/pkg/provider/kubernetes/gateway/client.go b/pkg/provider/kubernetes/gateway/client.go
index 109a0f9d7..50cf789d3 100644
--- a/pkg/provider/kubernetes/gateway/client.go
+++ b/pkg/provider/kubernetes/gateway/client.go
@@ -14,7 +14,6 @@ import (
"github.com/traefik/traefik/v3/pkg/types"
corev1 "k8s.io/api/core/v1"
discoveryv1 "k8s.io/api/discovery/v1"
- kerror "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
@@ -26,7 +25,6 @@ import (
"k8s.io/client-go/util/retry"
gatev1 "sigs.k8s.io/gateway-api/apis/v1"
gatev1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
- gatev1alpha3 "sigs.k8s.io/gateway-api/apis/v1alpha3"
gatev1beta1 "sigs.k8s.io/gateway-api/apis/v1beta1"
gateclientset "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned"
gateinformers "sigs.k8s.io/gateway-api/pkg/client/informers/externalversions"
@@ -187,6 +185,14 @@ func (c *clientWrapper) WatchAll(namespaces []string, stopCh <-chan struct{}) (<
if err != nil {
return nil, err
}
+ _, err = factoryGateway.Gateway().V1().BackendTLSPolicies().Informer().AddEventHandler(eventHandler)
+ if err != nil {
+ return nil, err
+ }
+ _, err = factoryKube.Core().V1().ConfigMaps().Informer().AddEventHandler(eventHandler)
+ if err != nil {
+ return nil, err
+ }
if c.experimentalChannel {
_, err = factoryGateway.Gateway().V1alpha2().TCPRoutes().Informer().AddEventHandler(eventHandler)
@@ -197,14 +203,6 @@ func (c *clientWrapper) WatchAll(namespaces []string, stopCh <-chan struct{}) (<
if err != nil {
return nil, err
}
- _, err = factoryGateway.Gateway().V1alpha3().BackendTLSPolicies().Informer().AddEventHandler(eventHandler)
- if err != nil {
- return nil, err
- }
- _, err = factoryKube.Core().V1().ConfigMaps().Informer().AddEventHandler(eventHandler)
- if err != nil {
- return nil, err
- }
}
factorySecret := kinformers.NewSharedInformerFactoryWithOptions(c.csKube, resyncPeriod, kinformers.WithNamespace(ns), kinformers.WithTweakListOptions(notOwnedByHelm))
@@ -367,6 +365,72 @@ func (c *clientWrapper) ListGatewayClasses() ([]*gatev1.GatewayClass, error) {
return c.factoryGatewayClass.Gateway().V1().GatewayClasses().Lister().List(labels.Everything())
}
+// ListEndpointSlicesForService returns the EndpointSlices for the given service name in the given namespace.
+func (c *clientWrapper) ListEndpointSlicesForService(namespace, serviceName string) ([]*discoveryv1.EndpointSlice, error) {
+ if !c.isWatchedNamespace(namespace) {
+ return nil, fmt.Errorf("failed to get endpointslices for service %s/%s: namespace is not within watched namespaces", namespace, serviceName)
+ }
+
+ serviceLabelRequirement, err := labels.NewRequirement(discoveryv1.LabelServiceName, selection.Equals, []string{serviceName})
+ if err != nil {
+ return nil, fmt.Errorf("failed to create service label selector requirement: %w", err)
+ }
+ serviceSelector := labels.NewSelector()
+ serviceSelector = serviceSelector.Add(*serviceLabelRequirement)
+
+ return c.factoriesKube[c.lookupNamespace(namespace)].Discovery().V1().EndpointSlices().Lister().EndpointSlices(namespace).List(serviceSelector)
+}
+
+// ListBackendTLSPoliciesForService returns the BackendTLSPolicy for the given service name in the given namespace.
+func (c *clientWrapper) ListBackendTLSPoliciesForService(namespace, serviceName string) ([]*gatev1.BackendTLSPolicy, error) {
+ if !c.isWatchedNamespace(namespace) {
+ return nil, fmt.Errorf("failed to get BackendTLSPolicies for service %s/%s: namespace is not within watched namespaces", namespace, serviceName)
+ }
+
+ policies, err := c.factoriesGateway[c.lookupNamespace(namespace)].Gateway().V1().BackendTLSPolicies().Lister().BackendTLSPolicies(namespace).List(labels.Everything())
+ if err != nil {
+ return nil, fmt.Errorf("failed to list BackendTLSPolicies in namespace %s", namespace)
+ }
+
+ var servicePolicies []*gatev1.BackendTLSPolicy
+ for _, policy := range policies {
+ for _, ref := range policy.Spec.TargetRefs {
+ // The policy does not target the service.
+ if (ref.Group != "" && ref.Group != groupCore) || ref.Kind != kindService || string(ref.Name) != serviceName {
+ continue
+ }
+
+ servicePolicies = append(servicePolicies, policy)
+ }
+ }
+
+ return servicePolicies, nil
+}
+
+// GetService returns the named service from the given namespace.
+func (c *clientWrapper) GetService(namespace, name string) (*corev1.Service, error) {
+ if !c.isWatchedNamespace(namespace) {
+ return nil, fmt.Errorf("failed to get service %s/%s: namespace is not within watched namespaces", namespace, name)
+ }
+ return c.factoriesKube[c.lookupNamespace(namespace)].Core().V1().Services().Lister().Services(namespace).Get(name)
+}
+
+// GetSecret returns the named secret from the given namespace.
+func (c *clientWrapper) GetSecret(namespace, name string) (*corev1.Secret, error) {
+ if !c.isWatchedNamespace(namespace) {
+ return nil, fmt.Errorf("failed to get secret %s/%s: namespace is not within watched namespaces", namespace, name)
+ }
+ return c.factoriesSecret[c.lookupNamespace(namespace)].Core().V1().Secrets().Lister().Secrets(namespace).Get(name)
+}
+
+// GetConfigMap returns the named configMap from the given namespace.
+func (c *clientWrapper) GetConfigMap(namespace, name string) (*corev1.ConfigMap, error) {
+ if !c.isWatchedNamespace(namespace) {
+ return nil, fmt.Errorf("failed to get configMap %s/%s: namespace is not within watched namespaces", namespace, name)
+ }
+ return c.factoriesKube[c.lookupNamespace(namespace)].Core().V1().ConfigMaps().Lister().ConfigMaps(namespace).Get(name)
+}
+
func (c *clientWrapper) UpdateGatewayClassStatus(ctx context.Context, name string, status gatev1.GatewayClassStatus) error {
err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
currentGatewayClass, err := c.factoryGatewayClass.Gateway().V1().GatewayClasses().Lister().Get(name)
@@ -637,20 +701,20 @@ func (c *clientWrapper) UpdateTLSRouteStatus(ctx context.Context, route ktypes.N
return nil
}
-func (c *clientWrapper) UpdateBackendTLSPolicyStatus(ctx context.Context, policy ktypes.NamespacedName, status gatev1alpha2.PolicyStatus) error {
+func (c *clientWrapper) UpdateBackendTLSPolicyStatus(ctx context.Context, policy ktypes.NamespacedName, status gatev1.PolicyStatus) error {
if !c.isWatchedNamespace(policy.Namespace) {
return fmt.Errorf("updating BackendTLSPolicy status %s/%s: namespace is not within watched namespaces", policy.Namespace, policy.Name)
}
err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
- currentPolicy, err := c.factoriesGateway[c.lookupNamespace(policy.Namespace)].Gateway().V1alpha3().BackendTLSPolicies().Lister().BackendTLSPolicies(policy.Namespace).Get(policy.Name)
+ currentPolicy, err := c.factoriesGateway[c.lookupNamespace(policy.Namespace)].Gateway().V1().BackendTLSPolicies().Lister().BackendTLSPolicies(policy.Namespace).Get(policy.Name)
if err != nil {
// We have to return err itself here (not wrapped inside another error)
// so that RetryOnConflict can identify it correctly.
return err
}
- ancestorStatuses := make([]gatev1alpha2.PolicyAncestorStatus, len(status.Ancestors))
+ ancestorStatuses := make([]gatev1.PolicyAncestorStatus, len(status.Ancestors))
copy(ancestorStatuses, status.Ancestors)
// keep statuses added by other gateway controllers,
@@ -660,14 +724,6 @@ func (c *clientWrapper) UpdateBackendTLSPolicyStatus(ctx context.Context, policy
ancestorStatuses = append(ancestorStatuses, ancestorStatus)
continue
}
-
- if slices.ContainsFunc(status.Ancestors, func(status gatev1alpha2.PolicyAncestorStatus) bool {
- return reflect.DeepEqual(ancestorStatus.AncestorRef, status.AncestorRef)
- }) {
- continue
- }
-
- ancestorStatuses = append(ancestorStatuses, ancestorStatus)
}
if len(ancestorStatuses) > 16 {
@@ -680,11 +736,11 @@ func (c *clientWrapper) UpdateBackendTLSPolicyStatus(ctx context.Context, policy
}
currentPolicy = currentPolicy.DeepCopy()
- currentPolicy.Status = gatev1alpha2.PolicyStatus{
+ currentPolicy.Status = gatev1.PolicyStatus{
Ancestors: ancestorStatuses,
}
- if _, err = c.csGateway.GatewayV1alpha3().BackendTLSPolicies(policy.Namespace).UpdateStatus(ctx, currentPolicy, metav1.UpdateOptions{}); err != nil {
+ if _, err = c.csGateway.GatewayV1().BackendTLSPolicies(policy.Namespace).UpdateStatus(ctx, currentPolicy, metav1.UpdateOptions{}); err != nil {
// We have to return err itself here (not wrapped inside another error)
// so that RetryOnConflict can identify it correctly.
return err
@@ -699,85 +755,7 @@ func (c *clientWrapper) UpdateBackendTLSPolicyStatus(ctx context.Context, policy
return nil
}
-// GetService returns the named service from the given namespace.
-func (c *clientWrapper) GetService(namespace, name string) (*corev1.Service, bool, error) {
- if !c.isWatchedNamespace(namespace) {
- return nil, false, fmt.Errorf("failed to get service %s/%s: namespace is not within watched namespaces", namespace, name)
- }
-
- service, err := c.factoriesKube[c.lookupNamespace(namespace)].Core().V1().Services().Lister().Services(namespace).Get(name)
- exist, err := translateNotFoundError(err)
-
- return service, exist, err
-}
-
-// ListEndpointSlicesForService returns the EndpointSlices for the given service name in the given namespace.
-func (c *clientWrapper) ListEndpointSlicesForService(namespace, serviceName string) ([]*discoveryv1.EndpointSlice, error) {
- if !c.isWatchedNamespace(namespace) {
- return nil, fmt.Errorf("failed to get endpointslices for service %s/%s: namespace is not within watched namespaces", namespace, serviceName)
- }
-
- serviceLabelRequirement, err := labels.NewRequirement(discoveryv1.LabelServiceName, selection.Equals, []string{serviceName})
- if err != nil {
- return nil, fmt.Errorf("failed to create service label selector requirement: %w", err)
- }
- serviceSelector := labels.NewSelector()
- serviceSelector = serviceSelector.Add(*serviceLabelRequirement)
-
- return c.factoriesKube[c.lookupNamespace(namespace)].Discovery().V1().EndpointSlices().Lister().EndpointSlices(namespace).List(serviceSelector)
-}
-
-// ListBackendTLSPoliciesForService returns the BackendTLSPolicy for the given service name in the given namespace.
-func (c *clientWrapper) ListBackendTLSPoliciesForService(namespace, serviceName string) ([]*gatev1alpha3.BackendTLSPolicy, error) {
- if !c.isWatchedNamespace(namespace) {
- return nil, fmt.Errorf("failed to get BackendTLSPolicies for service %s/%s: namespace is not within watched namespaces", namespace, serviceName)
- }
-
- policies, err := c.factoriesGateway[c.lookupNamespace(namespace)].Gateway().V1alpha3().BackendTLSPolicies().Lister().BackendTLSPolicies(namespace).List(labels.Everything())
- if err != nil {
- return nil, fmt.Errorf("failed to list BackendTLSPolicies in namespace %s", namespace)
- }
-
- var servicePolicies []*gatev1alpha3.BackendTLSPolicy
- for _, policy := range policies {
- for _, ref := range policy.Spec.TargetRefs {
- // The policy does not target the service.
- if (ref.Group != "" && ref.Group != groupCore) || ref.Kind != kindService || string(ref.Name) != serviceName {
- continue
- }
-
- servicePolicies = append(servicePolicies, policy)
- }
- }
-
- return servicePolicies, nil
-}
-
-// GetSecret returns the named secret from the given namespace.
-func (c *clientWrapper) GetSecret(namespace, name string) (*corev1.Secret, bool, error) {
- if !c.isWatchedNamespace(namespace) {
- return nil, false, fmt.Errorf("failed to get secret %s/%s: namespace is not within watched namespaces", namespace, name)
- }
-
- secret, err := c.factoriesSecret[c.lookupNamespace(namespace)].Core().V1().Secrets().Lister().Secrets(namespace).Get(name)
- exist, err := translateNotFoundError(err)
-
- return secret, exist, err
-}
-
-// GetConfigMap returns the named configMap from the given namespace.
-func (c *clientWrapper) GetConfigMap(namespace, name string) (*corev1.ConfigMap, bool, error) {
- if !c.isWatchedNamespace(namespace) {
- return nil, false, fmt.Errorf("failed to get configMap %s/%s: namespace is not within watched namespaces", namespace, name)
- }
-
- configMap, err := c.factoriesKube[c.lookupNamespace(namespace)].Core().V1().ConfigMaps().Lister().ConfigMaps(namespace).Get(name)
- exist, err := translateNotFoundError(err)
-
- return configMap, exist, err
-}
-
-// lookupNamespace returns the lookup namespace key for the given namespace.
+// lookupNamespace returns the lookup namespace listenerKey for the given namespace.
// When listening on all namespaces, it returns the client-go identifier ("")
// for all-namespaces. Otherwise, it returns the given namespace.
// The distinction is necessary because we index all informers on the special
@@ -800,28 +778,19 @@ func (c *clientWrapper) isWatchedNamespace(namespace string) bool {
return slices.Contains(c.watchedNamespaces, namespace)
}
-// translateNotFoundError will translate a "not found" error to a boolean return
-// value which indicates if the resource exists and a nil error.
-func translateNotFoundError(err error) (bool, error) {
- if kerror.IsNotFound(err) {
- return false, nil
- }
- return err == nil, err
-}
-
func gatewayStatusEqual(statusA, statusB gatev1.GatewayStatus) bool {
return reflect.DeepEqual(statusA.Addresses, statusB.Addresses) &&
listenersStatusEqual(statusA.Listeners, statusB.Listeners) &&
conditionsEqual(statusA.Conditions, statusB.Conditions)
}
-func policyAncestorStatusesEqual(policyAncestorStatusesA, policyAncestorStatusesB []gatev1alpha2.PolicyAncestorStatus) bool {
+func policyAncestorStatusesEqual(policyAncestorStatusesA, policyAncestorStatusesB []gatev1.PolicyAncestorStatus) bool {
if len(policyAncestorStatusesA) != len(policyAncestorStatusesB) {
return false
}
for _, sA := range policyAncestorStatusesA {
- if !slices.ContainsFunc(policyAncestorStatusesB, func(sB gatev1alpha2.PolicyAncestorStatus) bool {
+ if !slices.ContainsFunc(policyAncestorStatusesB, func(sB gatev1.PolicyAncestorStatus) bool {
return policyAncestorStatusEqual(sB, sA)
}) {
return false
@@ -829,7 +798,7 @@ func policyAncestorStatusesEqual(policyAncestorStatusesA, policyAncestorStatuses
}
for _, sB := range policyAncestorStatusesB {
- if !slices.ContainsFunc(policyAncestorStatusesA, func(sA gatev1alpha2.PolicyAncestorStatus) bool {
+ if !slices.ContainsFunc(policyAncestorStatusesA, func(sA gatev1.PolicyAncestorStatus) bool {
return policyAncestorStatusEqual(sA, sB)
}) {
return false
@@ -839,7 +808,7 @@ func policyAncestorStatusesEqual(policyAncestorStatusesA, policyAncestorStatuses
return true
}
-func policyAncestorStatusEqual(sA, sB gatev1alpha2.PolicyAncestorStatus) bool {
+func policyAncestorStatusEqual(sA, sB gatev1.PolicyAncestorStatus) bool {
return sA.ControllerName == sB.ControllerName &&
reflect.DeepEqual(sA.AncestorRef, sB.AncestorRef) &&
conditionsEqual(sA.Conditions, sB.Conditions)
diff --git a/pkg/provider/kubernetes/gateway/features.go b/pkg/provider/kubernetes/gateway/features.go
index eb3a433d8..88dedd573 100644
--- a/pkg/provider/kubernetes/gateway/features.go
+++ b/pkg/provider/kubernetes/gateway/features.go
@@ -1,24 +1,48 @@
package gateway
-import "sigs.k8s.io/gateway-api/pkg/features"
+import (
+ "sync"
-func SupportedFeatures() []features.FeatureName {
- return []features.FeatureName{
- features.GatewayFeature.Name,
- features.GatewayPort8080Feature.Name,
- features.GRPCRouteFeature.Name,
- features.HTTPRouteFeature.Name,
- features.HTTPRouteQueryParamMatchingFeature.Name,
- features.HTTPRouteMethodMatchingFeature.Name,
- features.HTTPRoutePortRedirectFeature.Name,
- features.HTTPRouteSchemeRedirectFeature.Name,
- features.HTTPRouteHostRewriteFeature.Name,
- features.HTTPRoutePathRewriteFeature.Name,
- features.HTTPRoutePathRedirectFeature.Name,
- features.HTTPRouteResponseHeaderModificationFeature.Name,
- features.HTTPRouteBackendProtocolH2CFeature.Name,
- features.HTTPRouteBackendProtocolWebSocketFeature.Name,
- features.HTTPRouteDestinationPortMatchingFeature.Name,
- features.TLSRouteFeature.Name,
+ "k8s.io/apimachinery/pkg/util/sets"
+ "sigs.k8s.io/gateway-api/pkg/features"
+)
+
+var SupportedFeatures = sync.OnceValue(func() []features.FeatureName {
+ featureSet := sets.New[features.Feature]().
+ Insert(features.GatewayCoreFeatures.UnsortedList()...).
+ Insert(features.GatewayExtendedFeatures.Intersection(extendedGatewayFeatures()).UnsortedList()...).
+ Insert(features.HTTPRouteCoreFeatures.UnsortedList()...).
+ Insert(features.HTTPRouteExtendedFeatures.Intersection(extendedHTTPRouteFeatures()).UnsortedList()...).
+ Insert(features.ReferenceGrantCoreFeatures.UnsortedList()...).
+ Insert(features.BackendTLSPolicyCoreFeatures.UnsortedList()...).
+ Insert(features.GRPCRouteCoreFeatures.UnsortedList()...).
+ Insert(features.TLSRouteCoreFeatures.UnsortedList()...)
+
+ featureNames := make([]features.FeatureName, 0, featureSet.Len())
+ for f := range featureSet {
+ featureNames = append(featureNames, f.Name)
}
+ return featureNames
+})
+
+// extendedGatewayFeatures returns the supported extended Gateway features.
+func extendedGatewayFeatures() sets.Set[features.Feature] {
+ return sets.New(features.GatewayPort8080Feature)
+}
+
+// extendedHTTPRouteFeatures returns the supported extended HTTP Route features.
+func extendedHTTPRouteFeatures() sets.Set[features.Feature] {
+ return sets.New(
+ features.HTTPRouteQueryParamMatchingFeature,
+ features.HTTPRouteMethodMatchingFeature,
+ features.HTTPRoutePortRedirectFeature,
+ features.HTTPRouteSchemeRedirectFeature,
+ features.HTTPRouteHostRewriteFeature,
+ features.HTTPRoutePathRewriteFeature,
+ features.HTTPRoutePathRedirectFeature,
+ features.HTTPRouteResponseHeaderModificationFeature,
+ features.HTTPRouteBackendProtocolH2CFeature,
+ features.HTTPRouteBackendProtocolWebSocketFeature,
+ features.HTTPRouteDestinationPortMatchingFeature,
+ )
}
diff --git a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_backend_tls_policy.yml b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_backend_tls_policy.yml
index 7748aee47..f183c92d8 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_backend_tls_policy.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_backend_tls_policy.yml
@@ -52,7 +52,7 @@ spec:
---
kind: BackendTLSPolicy
-apiVersion: gateway.networking.k8s.io/v1alpha3
+apiVersion: gateway.networking.k8s.io/v1
metadata:
name: policy-1
namespace: default
@@ -78,7 +78,7 @@ metadata:
name: ca-file
namespace: default
data:
- ca.crt: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0="
+ ca.crt: "CA1"
---
apiVersion: v1
@@ -87,4 +87,4 @@ metadata:
name: ca-file-2
namespace: default
data:
- ca.crt: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0="
+ ca.crt: "CA2"
diff --git a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_backend_tls_policy_system.yml b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_backend_tls_policy_system.yml
index cc36c0468..05b28bd9c 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_backend_tls_policy_system.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_backend_tls_policy_system.yml
@@ -52,7 +52,7 @@ spec:
---
kind: BackendTLSPolicy
-apiVersion: gateway.networking.k8s.io/v1alpha3
+apiVersion: gateway.networking.k8s.io/v1
metadata:
name: policy-1
namespace: default
diff --git a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_https.yml b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_https.yml
index cd4abdec1..bb160e469 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_https.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_https.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_https_with_tls_passthrough.yml b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_https_with_tls_passthrough.yml
index 9804bc80d..73cbc8e82 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_https_with_tls_passthrough.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_https_with_tls_passthrough.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_tls.yml b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_tls.yml
index bace669a0..552e32c95 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_tls.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_protocol_tls.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_two_gateways_one_httproute.yml b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_two_gateways_one_httproute.yml
index 934b67f82..b5c5c832f 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_two_gateways_one_httproute.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_two_gateways_one_httproute.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_two_listeners_one_httproute.yml b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_two_listeners_one_httproute.yml
index ca1c1a90e..f86f94346 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/httproute/with_two_listeners_one_httproute.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/httproute/with_two_listeners_one_httproute.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/mixed/simple.yml b/pkg/provider/kubernetes/gateway/fixtures/mixed/simple.yml
index 0fd6ee36e..35bd833e4 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/mixed/simple.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/mixed/simple.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_core_group.yml b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_core_group.yml
index dcef7966d..3294e3a73 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_core_group.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_core_group.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_multiple_listeners_using_same_hostname_port_protocol.yml b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_multiple_listeners_using_same_hostname_port_protocol.yml
index 272e363d7..cb0e19a60 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_multiple_listeners_using_same_hostname_port_protocol.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_multiple_listeners_using_same_hostname_port_protocol.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_all.yml b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_all.yml
index c2b525044..263302204 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_all.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_all.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_same.yml b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_same.yml
index 8d470e749..6bf1df73b 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_same.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_same.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_selector.yml b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_selector.yml
index a46e3dab6..7fa26a504 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_selector.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/mixed/with_namespace_selector.yml
@@ -14,8 +14,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret.yml b/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret.yml
index ba5f1a9fb..d76fb2065 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret.yml
@@ -20,8 +20,8 @@ metadata:
namespace: secret-namespace
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_missing.yml b/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_missing.yml
index 660ff18b6..e73e55a24 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_missing.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_missing.yml
@@ -6,8 +6,8 @@ metadata:
namespace: secret-namespace
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_not_matching_from.yml b/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_not_matching_from.yml
index 47aba19d8..e3662e9f2 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_not_matching_from.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_not_matching_from.yml
@@ -20,8 +20,8 @@ metadata:
namespace: secret-namespace
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_not_matching_to.yml b/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_not_matching_to.yml
index e08fa7a42..2b336f6ea 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_not_matching_to.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/referencegrant/for_secret_not_matching_to.yml
@@ -21,8 +21,8 @@ metadata:
namespace: secret-namespace
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tcproute/with_protocol_https.yml b/pkg/provider/kubernetes/gateway/fixtures/tcproute/with_protocol_https.yml
index ceb2f0bb0..5bbebbfca 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tcproute/with_protocol_https.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tcproute/with_protocol_https.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tcproute/with_protocol_tls.yml b/pkg/provider/kubernetes/gateway/fixtures/tcproute/with_protocol_tls.yml
index 05e3fc5ae..ac6b60bee 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tcproute/with_protocol_tls.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tcproute/with_protocol_tls.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tcproute/without_tcproute_tls_protocol.yml b/pkg/provider/kubernetes/gateway/fixtures/tcproute/without_tcproute_tls_protocol.yml
index 67e8f584d..23a1860b4 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tcproute/without_tcproute_tls_protocol.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tcproute/without_tcproute_tls_protocol.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/gatewayclass_with_unknown_controller.yml b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/gatewayclass_with_unknown_controller.yml
index 0e9c8f448..b5ce33ede 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/gatewayclass_with_unknown_controller.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/gatewayclass_with_unknown_controller.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_TLS_to_TCPRoute.yml b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_TLS_to_TCPRoute.yml
index 4a2dc107f..7f30bf92d 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_TLS_to_TCPRoute.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_TLS_to_TCPRoute.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_TLS_to_TLSRoute.yml b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_TLS_to_TLSRoute.yml
index e41a60aa7..b908be3f0 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_TLS_to_TLSRoute.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_TLS_to_TLSRoute.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_cross_provider.yml b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_cross_provider.yml
index 46c588590..636673c68 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_cross_provider.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_cross_provider.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_nativelb.yml b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_nativelb.yml
index 253e59b9b..fde70d51e 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_nativelb.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/simple_nativelb.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_multiple_routes_kind.yml b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_multiple_routes_kind.yml
index c88672329..3c6afe86e 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_multiple_routes_kind.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_multiple_routes_kind.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_passthrough_tls.yml b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_passthrough_tls.yml
index e04d4e362..9ffc3a200 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_passthrough_tls.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_passthrough_tls.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_protocol_https.yml b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_protocol_https.yml
index c5d904baa..2b424d065 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_protocol_https.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_protocol_https.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_wrong_service_port.yml b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_wrong_service_port.yml
index 5d296c248..37fafa2ad 100644
--- a/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_wrong_service_port.yml
+++ b/pkg/provider/kubernetes/gateway/fixtures/tlsroute/with_wrong_service_port.yml
@@ -6,8 +6,8 @@ metadata:
namespace: default
data:
- tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
- tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=
+ tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJxRENDQVU2Z0F3SUJBZ0lVWU9zcjBRZ0hPQnE0a1lSQ0w1K1REZFZ0NmJRd0NnWUlLb1pJemowRUF3SXcKRmpFVU1CSUdBMVVFQXd3TFpYaGhiWEJzWlM1amIyMHdIaGNOTWpVeE1ERXdNRGN4TnpNd1doY05NelV4TURBNApNRGN4TnpNd1dqQVdNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRCWk1CTUdCeXFHU000OUFnRUdDQ3FHClNNNDlBd0VIQTBJQUJET3JpdzNaUTd3SWhXcmJQUzZKRlFUM2JUb05DRjAwdlNWNWZhYjZUYlh5TDh0bHNHcmUKVFJJRjJFd2dzdGVNT2t4R0tLU2xEdnVhRHdxOHAvcVYrMHVqZWpCNE1CMEdBMVVkRGdRV0JCUk1Fa3VleFhRaApVdERnUmcxS0J2NzJDRHErRXpBZkJnTlZIU01FR0RBV2dCUk1Fa3VleFhRaFV0RGdSZzFLQnY3MkNEcStFekFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUNVR0ExVWRFUVFlTUJ5Q0MyVjRZVzF3YkdVdVkyOXRnZzBxTG1WNFlXMXcKYkdVdVkyOXRNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURzODdWazBzd0E2SGdPSmpST3llMW14RDgzcWNHeQpwZUZnb3hWOTNEeStjd0lnVjBNTUVKSmJWc1R5WkszRVErK1hjNXJFTDc4bnJKK1lJRVYrckNVV2o1VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
+ tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ253Z0w1RFk0VUIxNHNNNmYKRGlrUWR0cWgyUVcxQXJmRjRmYzFVRnppZmRHaFJBTkNBQVF6cTRzTjJVTzhDSVZxMnowdWlSVUU5MjA2RFFoZApOTDBsZVgybStrMjE4aS9MWmJCcTNrMFNCZGhNSUxMWGpEcE1SaWlrcFE3N21nOEt2S2Y2bGZ0TAotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t
---
kind: GatewayClass
diff --git a/pkg/provider/kubernetes/gateway/httproute.go b/pkg/provider/kubernetes/gateway/httproute.go
index ebee5fd1f..863c2f093 100644
--- a/pkg/provider/kubernetes/gateway/httproute.go
+++ b/pkg/provider/kubernetes/gateway/httproute.go
@@ -7,6 +7,7 @@ import (
"net"
"net/http"
"regexp"
+ "slices"
"strconv"
"strings"
@@ -19,8 +20,6 @@ import (
ktypes "k8s.io/apimachinery/pkg/types"
"k8s.io/utils/ptr"
gatev1 "sigs.k8s.io/gateway-api/apis/v1"
- gatev1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
- gatev1alpha3 "sigs.k8s.io/gateway-api/apis/v1alpha3"
)
func (p *Provider) loadHTTPRoutes(ctx context.Context, gatewayListeners []gatewayListener, conf *dynamic.Configuration) {
@@ -412,85 +411,125 @@ func (p *Provider) loadHTTPServers(ctx context.Context, namespace string, route
}
}
- var st *dynamic.ServersTransport
- var protocol string
- if p.ExperimentalChannel {
- servicePolicies, err := p.client.ListBackendTLSPoliciesForService(namespace, string(backendRef.Name))
- if err != nil {
- return nil, nil, &metav1.Condition{
- Type: string(gatev1.RouteConditionResolvedRefs),
- Status: metav1.ConditionFalse,
- ObservedGeneration: route.Generation,
- LastTransitionTime: metav1.Now(),
- Reason: string(gatev1.RouteReasonRefNotPermitted),
- Message: fmt.Sprintf("Cannot list BackendTLSPolicies for Service %s/%s: %s", namespace, string(backendRef.Name), err),
- }
+ backendTLSPolicies, err := p.client.ListBackendTLSPoliciesForService(namespace, string(backendRef.Name))
+ if err != nil {
+ return nil, nil, &metav1.Condition{
+ Type: string(gatev1.RouteConditionResolvedRefs),
+ Status: metav1.ConditionFalse,
+ ObservedGeneration: route.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.RouteReasonRefNotPermitted),
+ Message: fmt.Sprintf("Cannot list BackendTLSPolicies for Service %s/%s: %s", namespace, string(backendRef.Name), err),
}
+ }
- var matchedPolicy *gatev1alpha3.BackendTLSPolicy
- for _, policy := range servicePolicies {
- matched := false
- for _, targetRef := range policy.Spec.TargetRefs {
- if targetRef.SectionName == nil || svcPort.Name == string(*targetRef.SectionName) {
- matchedPolicy = policy
- matched = true
- break
- }
+ // Sort BackendTLSPolicies by creation timestamp, then by name to match the BackendTLSPolicy requirements.
+ slices.SortStableFunc(backendTLSPolicies, func(a, b *gatev1.BackendTLSPolicy) int {
+ cmpTime := a.CreationTimestamp.Time.Compare(b.CreationTimestamp.Time)
+ if cmpTime == 0 {
+ return strings.Compare(a.Name, b.Name)
+ }
+ return cmpTime
+ })
+
+ var serversTransport *dynamic.ServersTransport
+ for _, policy := range backendTLSPolicies {
+ for _, targetRef := range policy.Spec.TargetRefs {
+ if targetRef.SectionName != nil && svcPort.Name != string(*targetRef.SectionName) {
+ continue
}
- // If the policy targets the service, but doesn't match any port.
- if !matched {
- // update policy status
- status := gatev1alpha2.PolicyStatus{
- Ancestors: []gatev1alpha2.PolicyAncestorStatus{{
- AncestorRef: gatev1alpha2.ParentReference{
- Group: ptr.To(gatev1.Group(groupGateway)),
- Kind: ptr.To(gatev1.Kind(kindGateway)),
- Namespace: ptr.To(gatev1.Namespace(namespace)),
- Name: gatev1.ObjectName(listener.GWName),
- SectionName: ptr.To(gatev1.SectionName(listener.Name)),
- },
- ControllerName: controllerName,
- Conditions: []metav1.Condition{{
- Type: string(gatev1.RouteConditionResolvedRefs),
- Status: metav1.ConditionFalse,
- ObservedGeneration: route.Generation,
- LastTransitionTime: metav1.Now(),
- Reason: string(gatev1.RouteReasonBackendNotFound),
- Message: fmt.Sprintf("BackendTLSPolicy has no valid TargetRef for Service %s/%s", namespace, string(backendRef.Name)),
- }},
- }},
- }
+ policyAncestorStatus := gatev1.PolicyAncestorStatus{
+ AncestorRef: gatev1.ParentReference{
+ Group: ptr.To(gatev1.Group(groupGateway)),
+ Kind: ptr.To(gatev1.Kind(kindGateway)),
+ Namespace: ptr.To(gatev1.Namespace(namespace)),
+ Name: gatev1.ObjectName(listener.GWName),
+ SectionName: ptr.To(gatev1.SectionName(listener.Name)),
+ },
+ ControllerName: controllerName,
+ }
+ // Multiple BackendTLSPolicies can match the same service port, meaning that there is a conflict.
+ if serversTransport != nil {
+ policyAncestorStatus.Conditions = append(policyAncestorStatus.Conditions,
+ metav1.Condition{
+ Type: string(gatev1.BackendTLSPolicyConditionResolvedRefs),
+ Status: metav1.ConditionFalse,
+ ObservedGeneration: policy.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.BackendTLSPolicyReasonResolvedRefs),
+ },
+ metav1.Condition{
+ Type: string(gatev1.PolicyConditionAccepted),
+ Status: metav1.ConditionFalse,
+ ObservedGeneration: policy.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.PolicyReasonConflicted),
+ },
+ )
+
+ status := gatev1.PolicyStatus{
+ Ancestors: []gatev1.PolicyAncestorStatus{policyAncestorStatus},
+ }
if err := p.client.UpdateBackendTLSPolicyStatus(ctx, ktypes.NamespacedName{Namespace: policy.Namespace, Name: policy.Name}, status); err != nil {
- log.Ctx(ctx).Warn().Err(err).
- Msg("Unable to update BackendTLSPolicy status")
+ log.Ctx(ctx).Warn().Err(err).Msg("Unable to update conflicting BackendTLSPolicy status")
}
- }
- }
- if matchedPolicy != nil {
- st, err = p.loadServersTransport(namespace, *matchedPolicy)
- if err != nil {
+ continue
+ }
+
+ var resolvedRefCondition metav1.Condition
+ serversTransport, resolvedRefCondition = p.loadServersTransport(namespace, policy)
+
+ policyAncestorStatus.Conditions = append(policyAncestorStatus.Conditions, resolvedRefCondition)
+ if resolvedRefCondition.Status == metav1.ConditionFalse {
+ policyAncestorStatus.Conditions = append(policyAncestorStatus.Conditions, metav1.Condition{
+ Type: string(gatev1.PolicyConditionAccepted),
+ Status: metav1.ConditionFalse,
+ ObservedGeneration: policy.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.BackendTLSPolicyReasonNoValidCACertificate),
+ })
+ } else {
+ policyAncestorStatus.Conditions = append(policyAncestorStatus.Conditions, metav1.Condition{
+ Type: string(gatev1.PolicyConditionAccepted),
+ Status: metav1.ConditionTrue,
+ ObservedGeneration: policy.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.PolicyReasonAccepted),
+ })
+ }
+
+ status := gatev1.PolicyStatus{
+ Ancestors: []gatev1.PolicyAncestorStatus{policyAncestorStatus},
+ }
+ if err := p.client.UpdateBackendTLSPolicyStatus(ctx, ktypes.NamespacedName{Namespace: policy.Namespace, Name: policy.Name}, status); err != nil {
+ log.Ctx(ctx).Warn().Err(err).Msg("Unable to update BackendTLSPolicy status")
+ }
+
+ // When something wen wrong during the loading of a ServersTransport,
+ // we stop here and return a route condition error.
+ if resolvedRefCondition.Status == metav1.ConditionFalse {
return nil, nil, &metav1.Condition{
Type: string(gatev1.RouteConditionResolvedRefs),
Status: metav1.ConditionFalse,
ObservedGeneration: route.Generation,
LastTransitionTime: metav1.Now(),
Reason: string(gatev1.RouteReasonRefNotPermitted),
- Message: fmt.Sprintf("Cannot apply BackendTLSPolicy for Service %s/%s: %s", namespace, string(backendRef.Name), err),
+ Message: fmt.Sprintf("Cannot apply BackendTLSPolicy for Service %s/%s: %s", namespace, string(backendRef.Name), resolvedRefCondition.Message),
}
}
- // A backend TLS policy has been found for the service, a serversTransport configuration has been created, use/force HTTPS.
- protocol = "https"
}
}
lb := &dynamic.ServersLoadBalancer{}
lb.SetDefaults()
- // Guess the protocol from the service port if not set by the backend TLS policy
- if protocol == "" {
+ // If a ServersTransport is set, it means a BackendTLSPolicy matched the service port, and we can safely assume the protocol is HTTPS.
+ // When no ServersTransport is set, we need to determine the protocol based on the service port.
+ protocol := "https"
+ if serversTransport == nil {
protocol, err = getHTTPServiceProtocol(svcPort)
if err != nil {
return nil, nil, &metav1.Condition{
@@ -509,40 +548,70 @@ func (p *Provider) loadHTTPServers(ctx context.Context, namespace string, route
URL: fmt.Sprintf("%s://%s", protocol, net.JoinHostPort(ba.IP, strconv.Itoa(int(ba.Port)))),
})
}
- return lb, st, nil
+ return lb, serversTransport, nil
}
-func (p *Provider) loadServersTransport(namespace string, policy gatev1alpha3.BackendTLSPolicy) (*dynamic.ServersTransport, error) {
+func (p *Provider) loadServersTransport(namespace string, policy *gatev1.BackendTLSPolicy) (*dynamic.ServersTransport, metav1.Condition) {
st := &dynamic.ServersTransport{
ServerName: string(policy.Spec.Validation.Hostname),
}
if policy.Spec.Validation.WellKnownCACertificates != nil {
- return st, nil
+ return st, metav1.Condition{
+ Type: string(gatev1.BackendTLSPolicyConditionResolvedRefs),
+ Status: metav1.ConditionTrue,
+ ObservedGeneration: policy.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.BackendTLSPolicyReasonResolvedRefs),
+ }
}
for _, caCertRef := range policy.Spec.Validation.CACertificateRefs {
if (caCertRef.Group != "" && caCertRef.Group != groupCore) || caCertRef.Kind != "ConfigMap" {
- continue
+ return nil, metav1.Condition{
+ Type: string(gatev1.BackendTLSPolicyConditionResolvedRefs),
+ Status: metav1.ConditionFalse,
+ ObservedGeneration: policy.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.BackendTLSPolicyReasonInvalidKind),
+ Message: "Only ConfigMaps are supported",
+ }
}
- configMap, exists, err := p.client.GetConfigMap(namespace, string(caCertRef.Name))
+ configMap, err := p.client.GetConfigMap(namespace, string(caCertRef.Name))
if err != nil {
- return nil, fmt.Errorf("getting configmap: %w", err)
- }
- if !exists {
- return nil, fmt.Errorf("configmap %s/%s not found", namespace, string(caCertRef.Name))
+ return nil, metav1.Condition{
+ Type: string(gatev1.BackendTLSPolicyConditionResolvedRefs),
+ Status: metav1.ConditionFalse,
+ ObservedGeneration: policy.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.BackendTLSPolicyReasonInvalidCACertificateRef),
+ Message: fmt.Sprintf("getting configmap %s/%s: %s", namespace, string(caCertRef.Name), err),
+ }
}
caCRT, ok := configMap.Data["ca.crt"]
if !ok {
- return nil, fmt.Errorf("configmap %s/%s does not have ca.crt", namespace, string(caCertRef.Name))
+ return nil, metav1.Condition{
+ Type: string(gatev1.BackendTLSPolicyConditionResolvedRefs),
+ Status: metav1.ConditionFalse,
+ ObservedGeneration: policy.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.BackendTLSPolicyReasonInvalidCACertificateRef),
+ Message: fmt.Sprintf("configmap %s/%s does not have a ca.crt", namespace, string(caCertRef.Name)),
+ }
}
st.RootCAs = append(st.RootCAs, types.FileOrContent(caCRT))
}
- return st, nil
+ return st, metav1.Condition{
+ Type: string(gatev1.BackendTLSPolicyConditionResolvedRefs),
+ Status: metav1.ConditionTrue,
+ ObservedGeneration: policy.Generation,
+ LastTransitionTime: metav1.Now(),
+ Reason: string(gatev1.BackendTLSPolicyReasonResolvedRefs),
+ }
}
func buildHostRule(hostnames []gatev1.Hostname) (string, int) {
@@ -746,7 +815,7 @@ func createRequestRedirect(filter *gatev1.HTTPRequestRedirectFilter, pathMatch g
port = ptr.To("")
}
if filter.Port != nil {
- port = ptr.To(fmt.Sprintf("%d", *filter.Port))
+ port = ptr.To(strconv.Itoa(int(*filter.Port)))
}
var path *string
diff --git a/pkg/provider/kubernetes/gateway/kubernetes.go b/pkg/provider/kubernetes/gateway/kubernetes.go
index 3010f6bc0..0c50b76a8 100644
--- a/pkg/provider/kubernetes/gateway/kubernetes.go
+++ b/pkg/provider/kubernetes/gateway/kubernetes.go
@@ -121,7 +121,7 @@ type gatewayListener struct {
Port gatev1.PortNumber
Protocol gatev1.ProtocolType
- TLS *gatev1.GatewayTLSConfig
+ TLS *gatev1.ListenerTLSConfig
Hostname *gatev1.Hostname
Status *gatev1.ListenerStatus
AllowedNamespaces []string
@@ -325,14 +325,12 @@ func (p *Provider) loadConfigurationFromGateways(ctx context.Context) *dynamic.C
}
var supportedFeatures []gatev1.SupportedFeature
- if p.ExperimentalChannel {
- for _, feature := range SupportedFeatures() {
- supportedFeatures = append(supportedFeatures, gatev1.SupportedFeature{Name: gatev1.FeatureName(feature)})
- }
- slices.SortFunc(supportedFeatures, func(a, b gatev1.SupportedFeature) int {
- return strings.Compare(string(a.Name), string(b.Name))
- })
+ for _, feature := range SupportedFeatures() {
+ supportedFeatures = append(supportedFeatures, gatev1.SupportedFeature{Name: gatev1.FeatureName(feature)})
}
+ slices.SortFunc(supportedFeatures, func(a, b gatev1.SupportedFeature) int {
+ return strings.Compare(string(a.Name), string(b.Name))
+ })
gatewayClassNames := map[string]struct{}{}
for _, gatewayClass := range gatewayClasses {
@@ -768,12 +766,9 @@ func (p *Provider) gatewayAddresses() ([]gatev1.GatewayStatusAddress, error) {
svcRef := p.StatusAddress.Service
if svcRef.Name != "" && svcRef.Namespace != "" {
- svc, exists, err := p.client.GetService(svcRef.Namespace, svcRef.Name)
+ svc, err := p.client.GetService(svcRef.Namespace, svcRef.Name)
if err != nil {
- return nil, fmt.Errorf("unable to get service: %w", err)
- }
- if !exists {
- return nil, fmt.Errorf("could not find a service with name %s in namespace %s", svcRef.Name, svcRef.Namespace)
+ return nil, fmt.Errorf("getting service: %w", err)
}
var addresses []gatev1.GatewayStatusAddress
@@ -836,25 +831,27 @@ func (p *Provider) isReferenceGranted(fromKind, fromNamespace, toGroup, toKind,
}
func (p *Provider) getTLS(secretName gatev1.ObjectName, namespace string) (*tls.CertAndStores, error) {
- secret, exists, err := p.client.GetSecret(namespace, string(secretName))
+ secret, err := p.client.GetSecret(namespace, string(secretName))
if err != nil {
- return nil, fmt.Errorf("failed to fetch secret %s/%s: %w", namespace, secretName, err)
- }
- if !exists {
- return nil, fmt.Errorf("secret %s/%s does not exist", namespace, secretName)
+ return nil, fmt.Errorf("getting secret: %w", err)
}
cert, key, err := getCertificateBlocks(secret, namespace, string(secretName))
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("getting certificate blocks: %w", err)
}
- return &tls.CertAndStores{
+ certAndStore := &tls.CertAndStores{
Certificate: tls.Certificate{
CertFile: types.FileOrContent(cert),
KeyFile: types.FileOrContent(key),
},
- }, nil
+ }
+ if _, err := certAndStore.GetCertificate(); err != nil {
+ return nil, fmt.Errorf("validating certificate: %w", err)
+ }
+
+ return certAndStore, nil
}
func (p *Provider) allowedNamespaces(gatewayNamespace string, routeNamespaces *gatev1.RouteNamespaces) ([]string, error) {
@@ -891,20 +888,17 @@ func (p *Provider) getBackendAddresses(namespace string, ref gatev1.BackendRef)
return nil, corev1.ServicePort{}, errors.New("port is required for Kubernetes Service reference")
}
- service, exists, err := p.client.GetService(namespace, string(ref.Name))
+ service, err := p.client.GetService(namespace, string(ref.Name))
if err != nil {
return nil, corev1.ServicePort{}, fmt.Errorf("getting service: %w", err)
}
- if !exists {
- return nil, corev1.ServicePort{}, errors.New("service not found")
- }
if service.Spec.Type == corev1.ServiceTypeExternalName {
return nil, corev1.ServicePort{}, errors.New("type ExternalName is not supported for Kubernetes Service reference")
}
var svcPort *corev1.ServicePort
for _, p := range service.Spec.Ports {
- if p.Port == int32(*ref.Port) {
+ if p.Port == *ref.Port {
svcPort = &p
break
}
diff --git a/pkg/provider/kubernetes/gateway/kubernetes_test.go b/pkg/provider/kubernetes/gateway/kubernetes_test.go
index 90e93f64f..f08a58fc3 100644
--- a/pkg/provider/kubernetes/gateway/kubernetes_test.go
+++ b/pkg/provider/kubernetes/gateway/kubernetes_test.go
@@ -49,6 +49,25 @@ func init() {
}
}
+const (
+ listenerCert string = `-----BEGIN CERTIFICATE-----
+MIIBqDCCAU6gAwIBAgIUYOsr0QgHOBq4kYRCL5+TDdVt6bQwCgYIKoZIzj0EAwIw
+FjEUMBIGA1UEAwwLZXhhbXBsZS5jb20wHhcNMjUxMDEwMDcxNzMwWhcNMzUxMDA4
+MDcxNzMwWjAWMRQwEgYDVQQDDAtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
+SM49AwEHA0IABDOriw3ZQ7wIhWrbPS6JFQT3bToNCF00vSV5fab6TbXyL8tlsGre
+TRIF2EwgsteMOkxGKKSlDvuaDwq8p/qV+0ujejB4MB0GA1UdDgQWBBRMEkuexXQh
+UtDgRg1KBv72CDq+EzAfBgNVHSMEGDAWgBRMEkuexXQhUtDgRg1KBv72CDq+EzAP
+BgNVHRMBAf8EBTADAQH/MCUGA1UdEQQeMByCC2V4YW1wbGUuY29tgg0qLmV4YW1w
+bGUuY29tMAoGCCqGSM49BAMCA0gAMEUCIQDs87Vk0swA6HgOJjROye1mxD83qcGy
+peFgoxV93Dy+cwIgV0MMEJJbVsTyZK3EQ++Xc5rEL78nrJ+YIEV+rCUWj5U=
+-----END CERTIFICATE-----`
+ listenerKey string = `-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgnwgL5DY4UB14sM6f
+DikQdtqh2QW1ArfF4fc1UFzifdGhRANCAAQzq4sN2UO8CIVq2z0uiRUE9206DQhd
+NL0leX2m+k218i/LZbBq3k0SBdhMILLXjDpMRiikpQ77mg8KvKf6lftL
+-----END PRIVATE KEY-----`
+)
+
func TestGatewayClassLabelSelector(t *testing.T) {
k8sObjects, gwObjects := readResources(t, []string{"gatewayclass_labelselector.yaml"})
@@ -561,8 +580,8 @@ func TestLoadHTTPRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -755,8 +774,8 @@ func TestLoadHTTPRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -1214,8 +1233,8 @@ func TestLoadHTTPRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -1308,8 +1327,8 @@ func TestLoadHTTPRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -2202,74 +2221,11 @@ func TestLoadHTTPRoutes(t *testing.T) {
},
},
{
- desc: "Simple HTTPRoute and BackendTLSPolicy, experimental channel disabled",
+ desc: "Simple HTTPRoute and BackendTLSPolicy with CA certificate",
paths: []string{"services.yml", "httproute/with_backend_tls_policy.yml"},
entryPoints: map[string]Entrypoint{"web": {
Address: ":80",
}},
- expected: &dynamic.Configuration{
- UDP: &dynamic.UDPConfiguration{
- Routers: map[string]*dynamic.UDPRouter{},
- Services: map[string]*dynamic.UDPService{},
- },
- TCP: &dynamic.TCPConfiguration{
- Routers: map[string]*dynamic.TCPRouter{},
- Middlewares: map[string]*dynamic.TCPMiddleware{},
- Services: map[string]*dynamic.TCPService{},
- ServersTransports: map[string]*dynamic.TCPServersTransport{},
- },
- HTTP: &dynamic.HTTPConfiguration{
- Routers: map[string]*dynamic.Router{
- "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": {
- EntryPoints: []string{"web"},
- Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr",
- Rule: "Host(`foo.com`) && Path(`/bar`)",
- Priority: 100008,
- RuleSyntax: "default",
- },
- },
- Middlewares: map[string]*dynamic.Middleware{},
- Services: map[string]*dynamic.Service{
- "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": {
- Weighted: &dynamic.WeightedRoundRobin{
- Services: []dynamic.WRRService{
- {
- Name: "default-whoami-http-80",
- Weight: ptr.To(1),
- },
- },
- },
- },
- "default-whoami-http-80": {
- LoadBalancer: &dynamic.ServersLoadBalancer{
- Strategy: dynamic.BalancerStrategyWRR,
- Servers: []dynamic.Server{
- {
- URL: "http://10.10.0.1:80",
- },
- {
- URL: "http://10.10.0.2:80",
- },
- },
- PassHostHeader: ptr.To(true),
- ResponseForwarding: &dynamic.ResponseForwarding{
- FlushInterval: ptypes.Duration(100 * time.Millisecond),
- },
- },
- },
- },
- ServersTransports: map[string]*dynamic.ServersTransport{},
- },
- TLS: &dynamic.TLSConfiguration{},
- },
- },
- {
- desc: "Simple HTTPRoute and BackendTLSPolicy with CA certificate, experimental channel enabled",
- paths: []string{"services.yml", "httproute/with_backend_tls_policy.yml"},
- entryPoints: map[string]Entrypoint{"web": {
- Address: ":80",
- }},
- experimentalChannel: true,
expected: &dynamic.Configuration{
UDP: &dynamic.UDPConfiguration{
Routers: map[string]*dynamic.UDPRouter{},
@@ -2326,8 +2282,8 @@ func TestLoadHTTPRoutes(t *testing.T) {
"default-whoami-http-80": {
ServerName: "whoami",
RootCAs: []types.FileOrContent{
- "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=",
- "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=",
+ "CA1",
+ "CA2",
},
},
},
@@ -2336,12 +2292,11 @@ func TestLoadHTTPRoutes(t *testing.T) {
},
},
{
- desc: "Simple HTTPRoute and BackendTLSPolicy with System CA, experimental channel enabled",
+ desc: "Simple HTTPRoute and BackendTLSPolicy with System CA",
paths: []string{"services.yml", "httproute/with_backend_tls_policy_system.yml"},
entryPoints: map[string]Entrypoint{"web": {
Address: ":80",
}},
- experimentalChannel: true,
expected: &dynamic.Configuration{
UDP: &dynamic.UDPConfiguration{
Routers: map[string]*dynamic.UDPRouter{},
@@ -4217,8 +4172,8 @@ func TestLoadTCPRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -4809,8 +4764,8 @@ func TestLoadTLSRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -4909,8 +4864,8 @@ func TestLoadTLSRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -5127,8 +5082,8 @@ func TestLoadTLSRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -5197,8 +5152,8 @@ func TestLoadTLSRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -6165,8 +6120,8 @@ func TestLoadMixedRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -6354,8 +6309,8 @@ func TestLoadMixedRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -6612,8 +6567,8 @@ func TestLoadMixedRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -6773,8 +6728,8 @@ func TestLoadMixedRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -6913,8 +6868,8 @@ func TestLoadMixedRoutes(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},
@@ -7125,8 +7080,8 @@ func TestLoadRoutesWithReferenceGrants(t *testing.T) {
Certificates: []*tls.CertAndStores{
{
Certificate: tls.Certificate{
- CertFile: types.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
- KeyFile: types.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
+ CertFile: types.FileOrContent(listenerCert),
+ KeyFile: types.FileOrContent(listenerKey),
},
},
},