Files
versitygw/chart/values.yaml
T
niksis02 658c37907d feat: add OIDC endpoint relaxations for private/isolated networks
Closes #2364

`AssumeRoleWithWebIdentity` only ever trusted an `OIDC` provider reachable over verified `https`, at a publicly routable address, on the implicit `:443`. That posture is right for an internet-facing IdP but rejects every address an internal one can have, so a `SPIFFE/SPIRE` OIDC discovery provider in the same cluster — or as a sidecar in the same pod — could never be registered, let alone verified against, and no setting could express "this private address is the IdP".

Two opt-in flags on `versitygw iam`, both off by default:

`--oidc-allow-private-endpoints`
Permit a provider `Url` resolving to a loopback/private/link-local address, and an explicit port. Transport is unchanged: still `https`, still fully verified (a self-signed in-cluster cert is trusted the way AWS documents, through `ThumbprintList`).

`--oidc-allow-insecure-transport`
Additionally permit plaintext `http` provider URLs, discovery/JWKS endpoints and redirects, and drop TLS verification (`thumbprint` pinning included) for `https` ones.

Both apply uniformly to the thumbprint auto-fetch at `CreateOpenIDConnectProvider` time and to the discovery-document plus `JWKS` fetch at `AssumeRoleWithWebIdentity` time. Neither weakens anything past the endpoint: signature verification, issuer matching, audience and trust policy evaluation are untouched, and the DNS-resolve-once/dial-the-resolved-IP shape stays in place so a rebind still cannot redirect a connection.

An `http` provider keeps its scheme in its stored `Url`, `ARN` and `iss` matching, rather than being stripped like an `https` one — otherwise `"http://host"` and `"https://host"` would collapse onto a single ARN and storage key and each could satisfy the other's trust policy. It also stores an empty `ThumbprintList` rather than failing: a plaintext provider presents no certificate to thumbprint.

Helm: `iamServer.oidc.{allowPrivateEndpoints,allowInsecureTransport}`, alongside `disableThumbprintAutofetch` moved into the same block (the flat `iamServer.disableOidcThumbprintAutofetch` stays honored). Chart `0.4.1 -> 0.4.2`.

The WebUI's create-provider form no longer rejects `http` URLs and ports client-side; it cannot see the service's settings, so those two rules are left to the server, whose error surfaces as a toast like any other.
2026-09-08 16:30:37 +04:00

625 lines
25 KiB
YAML

# Default values for versitygw.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
# Standard Helm chart settings
nameOverride: ""
fullnameOverride: ""
# Number of pod replicas for the deployment
# Note that when using the "posix" backend with a PVC,
# you can only increase the number of replicas if you have a "ReadWriteMany" volume!
replicaCount: 1
# Specifies the strategy used to replace old Pods by new ones. strategy.type can be
# "Recreate" or "RollingUpdate". "RollingUpdate" is the default value.
# Using "Recreate" is often useful when using a "ReadWriteOnce" volume.
strategy: {}
# This section defines which image to use and how to pull it.
# Find all available tags / releases at: https://github.com/versity/versitygw/pkgs/container/versitygw
image:
repository: ghcr.io/versity/versitygw
tag: "latest"
pullPolicy: IfNotPresent
pullSecrets: []
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account (e.g. for IRSA / Workload Identity)
annotations: {}
# Name of the service account to use. If empty, a name is generated using the fullname template.
name: ""
# Additional annotations for the pod
podAnnotations: {}
# Additional annotations for the Deployment object (for example, a Secret
# reloader controller that restarts pods after credential/certificate rotation).
deploymentAnnotations: {}
# Additional labels for the pod
podLabels: {}
# Security settings for the Deployment Pod and its containers.
# The settings below are the recommended, least-privilege values.
# For more details refer to https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
podSecurityContext:
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
# The Kubernetes Service that exposes the versitygw server.
# To make the server available outside the cluster, the type should be changed to `NodePort` or `LoadBalancer`.
service:
type: ClusterIP
# --- Ingress ---
# Expose the S3 API via a Kubernetes Ingress resource.
# Requires an ingress controller (e.g. nginx, traefik) to be installed in the cluster.
ingress:
enabled: false
# IngressClass to use (maps to spec.ingressClassName).
# Leave empty to use the cluster default.
className: ""
# Annotations applied to the Ingress resource.
# Use these to configure controller-specific behaviour, e.g.:
# nginx.ingress.kubernetes.io/proxy-body-size: "0"
# nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
# nginx.ingress.kubernetes.io/ssl-redirect: "true"
annotations: {}
# List of host rules. Each host can expose one or more paths.
# The `servicePort` field on each path selects which named Service port to route to.
# Supported values: s3-api (default), admin, webui.
hosts:
- host: s3.example.com
paths:
- path: /
pathType: Prefix
# servicePort: s3-api # default — routes to the S3 API port
# TLS configuration. Each entry maps a secret name to one or more hosts.
# The secret must contain tls.crt and tls.key.
# Example:
# tls:
# - secretName: versitygw-tls
# hosts:
# - s3.example.com
tls: []
# --- HTTPRoute ---
# Expose the S3 API via a Gateway API HTTPRoute resource.
# Requires Gateway API CRDs and a Gateway API implementation (Envoy Gateway, Istio, Kgateway, etc.) in the cluster.
httpRoute:
enabled: false
annotations: {}
# The parent Gateway(s) this route attaches to.
parentRefs:
- name: my-gateway
# namespace: gateway-system
# sectionName: https
# Hostnames for the route.
hostnames:
- s3.example.com
# Rules that define how requests are matched and routed to the service.
# See https://gateway-api.sigs.k8s.io/api-types/httproute/#rules
rules:
- matches:
- path:
type: PathPrefix
value: /
# --- Root credentials ---
# The root S3 access credentials. These are required for the gateway to start.
# IMPORTANT: For production use, set auth.existingSecret instead of storing
# credentials in this values file.
auth:
# If set, use this existing Kubernetes Secret for credentials instead of creating one.
# The secret must contain the keys: rootAccessKeyId and rootSecretAccessKey
existingSecret: ""
# Root access key ID (used when existingSecret is empty)
accessKey: ""
# Root secret access key (used when existingSecret is empty)
secretKey: ""
# --- Versity Gateway server configuration ---
gateway:
# -- Backend configuration --
backend:
# The storage backend to use. Supported values: posix, scoutfs, s3, azure, plugin
# This maps to the VGW_BACKEND environment variable used by the container entrypoint.
type: posix
# Additional arguments passed to the backend
args: "/mnt/data"
# Optional directory for POSIX sidecar metadata storage. When set, the chart
# mounts this path from persistent storage and exports VGW_META_SIDECAR.
sidecarDir: ""
# Optional directory for POSIX or ScoutFS object version storage. When set,
# the chart mounts this path from persistent storage and exports VGW_VERSIONING_DIR.
versioningDir: ""
# for s3 backend:
# args: "--access 0123456 --secret 0xdeadbeef --endpoint http://s3.example.com"
# for azure backend:
# args: ""--account 0123456 --access-key 0xdeadbeef"
# for posix backend with sidecar metadata:
# sidecarDir: "/mnt/metadata"
# for posix or scoutfs backend with object versioning:
# versioningDir: "/mnt/versioning"
# The port versitygw listens on for S3 API requests.
port: 7070
# The AWS region string returned to clients.
region: us-east-1
# Enable virtual-host-style bucket addressing (e.g. bucket.example.com).
# Set to your domain (e.g. "example.com") to enable.
virtualDomain: ""
# Allow only read (GET/HEAD) operations. Prevents any writes.
readOnly: false
# Silence stdout request logging (useful when using a dedicated access log).
quiet: false
# Debug logger verbosity: "silent" (default, no debug output), "debug" (full
# request/response logging with secrets and tokens masked), or "unsafe"
# (full logging with NO masking -- prints access keys, secrets, session
# tokens, and signatures in the clear; only use for local troubleshooting,
# never in production).
logLevel: silent
# Deprecated: use logLevel: debug instead. Kept for backwards compatibility;
# only takes effect when logLevel is left at "silent".
debug: false
# Access log file path for S3 requests (AWS log format). Empty = disabled.
accessLog: ""
# Default CORS allowed origin. Empty = CORS disabled.
# Must include the scheme prefix, e.g. "https://example.com" or "http://example.com".
corsAllowOrigin: ""
# Disable strict S3 bucket naming validation.
disableStrictBucketNames: false
# --- Admin API server ---
admin:
# Enable a separate admin API server on a dedicated port.
enabled: false
# The port for the admin API server. Must differ from gateway.port.
port: 7071
# Maximum concurrent connections for the admin server.
maxConnections: 250000
# Maximum in-flight requests for the admin server.
maxRequests: 100000
# --- Ingress ---
# Expose the Admin API via a Kubernetes Ingress resource.
# Requires an ingress controller (e.g. nginx, traefik) to be installed in the cluster.
ingress:
enabled: false
# IngressClass to use (maps to spec.ingressClassName).
className: ""
annotations: {}
hosts:
- host: s3-admin.example.com
paths:
- path: /
pathType: Prefix
tls: []
# --- HTTPRoute ---
# Expose the Admin API via a Gateway API HTTPRoute resource.
# Requires Gateway API CRDs and a Gateway API implementation (Envoy Gateway, Istio, Kgateway, etc.) in the cluster.
httpRoute:
enabled: false
annotations: {}
# The parent Gateway(s) this route attaches to.
parentRefs:
- name: my-gateway
# namespace: gateway-system
# sectionName: https
# Hostnames for the route.
hostnames:
- s3-admin.example.com
# Rules that define how requests are matched and routed to the service.
# See https://gateway-api.sigs.k8s.io/api-types/httproute/#rules
rules:
- matches:
- path:
type: PathPrefix
value: /
# --- WebUI ---
webui:
# Enable the built-in browser-based management WebUI.
enabled: false
# The port the WebUI listens on.
port: 8080
# Disable TLS for the WebUI even when gateway TLS is enabled.
noTls: false
# List of S3 endpoints used by the Versity Web UI
# The list that is auto-generated by Versity GW is wrong in the case of
# Kubernetes because it uses the internal pod IP addresses.
apiGateways: []
# - s3.example.com
# List of Versity Admin endpoints used by the Versity Web UI
# The list that is auto-generated by Versity GW is wrong in the case of
# Kubernetes because it uses the internal pod IP addresses.
adminGateways: []
# - s3-admin.example.com
# List of standalone IAM service endpoints offered on the WebUI login page.
# Unlike the two lists above there is nothing to auto-generate: the IAM
# service is a separate process, so the gateway cannot discover its address.
# Setting this also tells the WebUI that the standalone IAM service, not the
# admin API, manages this deployment: the admin endpoint is ignored entirely
# (hidden from the login page along with the Users tab and every other
# admin-API surface), and bucket management runs over the S3 API instead.
# Point it at iamServer.service (see the iamServer section) or its ingress.
iamGateways: []
# - https://iam.example.com
# --- Ingress ---
# Expose the WebUI via a Kubernetes Ingress resource.
# Requires an ingress controller (e.g. nginx, traefik) to be installed in the cluster.
ingress:
enabled: false
# IngressClass to use (maps to spec.ingressClassName).
className: ""
annotations: {}
hosts:
- host: versitygw.example.com
paths:
- path: /
pathType: Prefix
tls: []
# --- HTTPRoute ---
# Expose the WebUI via a Gateway API HTTPRoute resource.
# Requires Gateway API CRDs and a Gateway API implementation (Envoy Gateway, Istio, Kgateway, etc.) in the cluster.
httpRoute:
enabled: false
annotations: {}
# The parent Gateway(s) this route attaches to.
parentRefs:
- name: my-gateway
# namespace: gateway-system
# sectionName: https
# Hostnames for the route.
hostnames:
- versitygw.example.com
# Rules that define how requests are matched and routed to the service.
# See https://gateway-api.sigs.k8s.io/api-types/httproute/#rules
rules:
- matches:
- path:
type: PathPrefix
value: /
# --- Website Hosting ---
website:
# Enable the static website hosting endpoint.
# Serves S3 buckets as static websites with index documents, custom error
# pages, and routing rules via a separate HTTP endpoint.
enabled: false
# The port the website endpoint listens on.
port: 8090
# Base domain for virtual-host routing. Optional.
# Host "blog.<domain>" serves bucket "blog"; host "<domain>" serves
# bucket "<domain>" (apex domain support).
# When empty, catch-all mode is used: the full hostname is the bucket
# name (name buckets as FQDNs, e.g. "blog.example.com").
domain: ""
# - example: domain: "example.com"
# Disable TLS for the website endpoint even when gateway TLS is enabled.
noTls: false
# --- IAM (Identity and Access Management) client, consumed by the S3 gateway ---
iam:
enabled: false
# TODO: implement other IAM backend (LDAP, Vault-direct, FreeIPA)
# - internal: flat-file IAM stored alongside backend data, inside the gateway pod.
# - standalone: delegate to a separate standalone IAM API service (an
# AWS-compatible IAM Query API server), reached over its private mTLS
# endpoint. See `iamServer` below to optionally deploy that service from
# this same chart, or point `iam.standalone.endpoint` at an externally
# managed one.
# Other values remain available for IAM backends configured through extraEnv.
type: internal
# Disable IAM result caching.
cacheDisable: false
# IAM cache entry TTL in seconds.
cacheTtl: 120
# IAM cache cleanup interval in seconds.
cachePrune: 3600
# Enable IAM-specific debug output (independent of gateway.logLevel).
debug: false
# --- standalone (iam.type: standalone) ---
standalone:
# Private endpoint of the standalone IAM service: a "host:port" TCP
# address (mTLS required -- see `certificate` below). Leave empty to
# auto-target the in-chart private `iamServer` Service
# (requires iamServer.enabled=true and iamServer.private.enabled=true).
endpoint: ""
# Identity this gateway signs its private-endpoint calls with. Both
# default to auth.accessKey/secretKey (root) when left empty. Literal
# values are retained for compatibility but are stored in Helm release
# history; prefer credentials.existingSecret for production.
access: ""
secret: ""
credentials:
# Optional Secret containing a distinct IAM client identity. Point this
# at iamServer.auth.existingSecret to use that server's root identity.
existingSecret: ""
accessKeyKey: rootAccessKeyId
secretKeyKey: rootSecretAccessKey
# POSIX uid/gid/project-id assigned to every account resolved through
# this backend (the standalone IAM service has no per-user POSIX
# identity concept of its own).
defaultUid: 0
defaultGid: 0
defaultProjectId: 0
# mTLS client identity presented to the standalone IAM service's private
# endpoint. Required together with the peer trusting this certificate.
certificate:
# Auto-provision this client certificate via cert-manager. issuerRef
# must be a CA-type issuer (Issuer/ClusterIssuer of kind CA, or Vault) --
# one that populates ca.crt in the resulting Secret -- and MUST be the
# same issuer used for iamServer.private.certificate, so each side's
# ca.crt can verify the other's certificate.
create: false
# Use an existing Secret instead (or as well as -- existingSecret wins
# when both are set). Must contain tls.crt, tls.key, and ca.crt (the CA
# that signed iamServer's private-listener server certificate).
existingSecret: ""
issuerRef: {}
# group: cert-manager.io
# kind: ClusterIssuer
# name: internal-ca
# --- Standalone IAM API Server ---
# Deploys a separate `versitygw iam` server as its own Deployment and public/
# private Services --
# an AWS-compatible IAM Query API, independently scalable and centralized
# (unlike iam.type: internal, which runs file-backed IAM inside each gateway
# pod). Manage users/roles/policies against its public control-plane API
# (reusing the gateway root Secret by default, or `iamServer.auth`); point
# gateways at it via iam.type: standalone.
iamServer:
enabled: false
replicaCount: 1
# Deployment strategy override for Vault storage. Internal file storage
# always uses Recreate to prevent concurrent writers and ReadWriteOnce
# multi-attach failures. Empty uses Kubernetes' default RollingUpdate for Vault.
strategy: {}
auth:
# Optional Secret containing rootAccessKeyId and rootSecretAccessKey.
# Empty reuses the top-level auth Secret for backward compatibility.
existingSecret: ""
# Optional image override; defaults to the top-level `image` values when unset.
image:
repository: ""
tag: ""
pullPolicy: ""
# Public control-plane API port (aws iam create-user, list-roles, etc.).
port: 7070
maxConnections: 250000
maxRequests: 100000
# Silence stdout request logging.
quiet: false
# Debug logger verbosity: "silent" (default), "debug", or "unsafe" -- see
# gateway.logLevel for details.
logLevel: silent
# Deprecated alias for oidc.disableThumbprintAutofetch below; still honored.
disableOidcThumbprintAutofetch: false
# -- OIDC identity providers (AssumeRoleWithWebIdentity) --
oidc:
# Reject CreateOpenIDConnectProvider requests that omit ThumbprintList
# instead of auto-fetching it over an outbound TLS connection to the
# caller-supplied URL. Recommended for restricted/air-gapped clusters.
disableThumbprintAutofetch: false
# Allow OIDC provider URLs that resolve to loopback/private/link-local
# addresses and that carry an explicit port. Both are refused by default,
# which makes an in-cluster identity provider -- a SPIFFE/SPIRE OIDC
# discovery provider on a ClusterIP Service, say -- impossible to register
# or to verify tokens against. Transport is unaffected: still https, still
# fully verified.
#
# This also re-permits cloud metadata endpoints (169.254.169.254) as fetch
# targets, so enable it only where CreateOpenIDConnectProvider is already
# an administrator-only operation.
allowPrivateEndpoints: false
# Allow plaintext http OIDC provider URLs and skip TLS certificate
# verification (thumbprint pinning included) for https ones, leaving the
# network path as the only thing authenticating the identity provider.
# Intended for a provider reached over an already-trusted path -- a
# discovery provider bound to 127.0.0.1 as a sidecar in the IAM server's
# own pod. Needs allowPrivateEndpoints as well for a loopback or
# cluster-internal address.
allowInsecureTransport: false
# Access-Control-Allow-Origin for the control-plane API. Required before a
# browser can reach this service: the WebUI is served from another origin, so
# every call it makes is cross-origin and is blocked without this. Set it to
# the WebUI's own origin (see webui.ingress) when webui.iamGateways points
# here. Empty leaves the API usable by CLI and SDK clients only.
corsAllowOrigin: ""
# Optional TLS for the public control-plane API. No cert-manager automation
# here -- bring your own Secret (must contain tls.crt / tls.key).
tls:
enabled: false
secretName: ""
# -- Storage backend --
storage:
# internal (file-backed, requires persistence below) | vault
type: internal
vault:
endpointUrl: ""
namespace: ""
secretStoragePath: ""
secretStorageNamespace: ""
authMethod: ""
authNamespace: ""
mountPath: ""
roleId: ""
# Secret containing sensitive Vault auth material. Recognized keys
# (provide whichever your vault-auth-method needs):
# roleSecret -- AppRole secret ID (VGW_IAM_VAULT_ROLE_SECRET)
# rootToken -- Vault root token (VGW_IAM_VAULT_ROOT_TOKEN)
existingSecret: ""
# Separate Secret for Vault's TLS material -- kept distinct from
# `existingSecret` above (auth credentials) since these are a different
# security concern (transport trust vs. identity). Recognized keys
# (provide whichever your vault-endpoint-url/mTLS setup needs):
# serverCert -- CA cert verifying Vault's server certificate (VGW_IAM_VAULT_SERVER_CERT)
# clientCert -- client cert for mTLS to Vault (VGW_IAM_VAULT_CLIENT_CERT)
# clientCertKey -- private key for clientCert (VGW_IAM_VAULT_CLIENT_CERT_KEY)
# Ignored for any of the three that has a literal value below.
tlsExistingSecret: ""
# PEM-encoded certificate content (literal text, not a file path).
# Prefer tlsExistingSecret above for production; these are stored in
# Helm release history in plaintext.
serverCert: ""
clientCert: ""
clientCertKey: ""
# -- Private mTLS endpoint --
# Serves the derive-signing-key/evaluate-policy/resolve-identity calls that
# gateways configured with iam.type: standalone use internally. Required
# for any such gateway to reach this service over TCP.
private:
enabled: true
port: 7443
certificate:
# Auto-provision the server certificate for this listener via
# cert-manager. issuerRef must be a CA-type issuer -- see
# iam.standalone.certificate for the matching client-side requirement.
create: false
# Use an existing Secret instead (or as well as -- existingSecret wins
# when both are set). Must contain tls.crt, tls.key, and ca.crt (the CA
# that signs gateway client certificates).
existingSecret: ""
issuerRef: {}
# group: cert-manager.io
# kind: ClusterIssuer
# name: internal-ca
# DNS names for the certificate. Defaults to the in-chart Service's
# names when left empty.
dnsNames: []
service:
# Type of the public control-plane Service. The private Service is always
# ClusterIP and is not exposed when this is NodePort or LoadBalancer.
type: ClusterIP
# Storage for the standalone IAM service's own file-backed data (storage.type: internal).
persistence:
enabled: true
create: true
claimName: ""
size: 1Gi
storageClassName: ""
accessMode: ReadWriteOnce
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}
deploymentAnnotations: {}
podAnnotations: {}
podLabels: {}
# Extra environment variables to pass to the container.
# Use this to configure advanced options not covered above (e.g. event notifications,
# LDAP IAM, S3 proxy backend credentials, StatsD metrics, etc.).
# Refer to https://github.com/versity/versitygw#configuration for the full list.
# Example:
# extraEnv:
# - name: VGW_EVENT_KAFKA_URL
# value: "kafka:9092"
# - name: VGW_IAM_LDAP_URL
# value: "ldap://ldap.example.com"
extraEnv: []
# --- TLS ---
# Enable HTTPS for the S3 API (and admin/webui if not separately configured).
tls:
# Set to true to enable TLS. Requires certificate.secretName or certificate.create.
enabled: false
# --- cert-manager Certificate ---
certificate:
# Set to the name of an existing TLS Secret to use for HTTPS.
# If empty and certificate.create is false, defaults to <fullname>-cert.
secretName: ""
# Create a cert-manager Certificate resource to automatically provision TLS.
# Requires cert-manager to be installed in the cluster.
create: false
# DNS names to include in the certificate. Required when certificate.create is true.
dnsNames: []
# - versitygw.example.com
# cert-manager issuer reference. Required when certificate.create is true.
# issuerRef:
# group: cert-manager.io
# kind: ClusterIssuer
# name: "letsencrypt-production"
# --- Persistence ---
# Storage for the S3 gateway backend data (required for posix/scoutfs backends).
# By default, an emptyDir (ephemeral) volume is used.
persistence:
# If disabled, an emptyDir (ephemeral!) will be used instead of a PVC.
# NOTE: Data will be lost on pod restart if persistence is disabled.
enabled: true
# Whether to create a new PVC. If false, persistence.claimName must be provided.
create: true
# The name of the PVC that should be created or used (if persistence.create=false)
claimName: ""
size: 10Gi
storageClassName: ""
# If set then use a hostPath volume, needs `persistence.create=false`
hostPath: ""
# Access mode for the PVC. Use ReadWriteMany for multi-replica deployments.
accessMode: ReadWriteOnce
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 500m
# memory: 512Mi
# requests:
# cpu: 100m
# memory: 128Mi
nodeSelector: {}
tolerations: []
affinity: {}
# Topology spread constraints to control how pods are distributed across
# topology domains (e.g. nodes, zones). Useful for spreading replicas for
# high availability. See:
# https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/
# Example:
# topologySpreadConstraints:
# - maxSkew: 1
# topologyKey: topology.kubernetes.io/zone
# whenUnsatisfiable: ScheduleAnyway
# labelSelector:
# matchLabels:
# app.kubernetes.io/name: versitygw
topologySpreadConstraints: []
networkPolicy:
enabled: false
# Label maps used as matchLabels selectors. When both are set, a source pod
# must match both selectors. A pod-only selector applies to this release's
# namespace; an empty pair denies ingress to the gateway. The IAM policy
# always permits this release's gateway pods to reach its private mTLS port.
allowIngressFromNamespaces: {}
# kubernetes.io/metadata.name: kube-system
allowIngressFromPods: {}
# svccontroller.k3s.cattle.io/svcname: versitygw