Ingress Gateway
Configurations to build an ingress gateway.
HttpRouting
| Field | Description | Validation Rule | 
|---|---|---|
| corsPolicy | tetrateio.api.tsb.gateway.v2.CorsPolicy  | – | 
| rules | List of tetrateio.api.tsb.gateway.v2.HttpRule  | repeated = { | 
HttpRule
A single HTTP rule.
| Field | Description | Validation Rule | 
|---|---|---|
| match | List of tetrateio.api.tsb.gateway.v2.HttpMatchCondition  | – | 
| modify | tetrateio.api.tsb.gateway.v2.HttpModifyAction  | – | 
| route | tetrateio.api.tsb.gateway.v2.Route oneof _route_or_redirect  | – | 
| redirect | tetrateio.api.tsb.gateway.v2.Redirect oneof _route_or_redirect  | – | 
| directResponse | tetrateio.api.tsb.gateway.v2.HTTPDirectResponse oneof _route_or_redirect  | – | 
HttpServer
An HTTP server exposed in an ingress gateway.
| Field | Description | Validation Rule | 
|---|---|---|
| name | string  | string = { | 
| port | uint32  | uint32 = { | 
| hostname | string  | string = { | 
| tls | tetrateio.api.tsb.gateway.v2.ServerTLSSettings  | – | 
| authentication | tetrateio.api.tsb.auth.v2.Authentication  | – | 
| authorization | tetrateio.api.tsb.auth.v2.Authorization  | – | 
| routing | tetrateio.api.tsb.gateway.v2.HttpRouting  | message = { | 
| rateLimiting | tetrateio.api.tsb.gateway.v2.RateLimiting  | – | 
IngressGateway
The functionality provided by the IngressGateway is now provided in Gateway object, and
using it is the recommended approach. The IngressGateway resource will be removed in future releases.
IngressGateway configures a workload to act as a gateway for
traffic entering the mesh. The ingress gateway also provides basic
API gateway functionalities such as JWT token validation
and request authorization. Gateways in privileged
workspaces can route to services outside the workspace while those
in unprivileged workspaces can only route to services inside the
workspace.
The following example declares an ingress gateway running on pods
with app: gateway labels in the ns1 namespace. The gateway
exposes a host bookinfo.com on https port 9443 and http port 9090.
The port 9090 is configured to receive plaintext traffic and send a
redirect to the https port 9443 (site-wide HTTP -> HTTPS redirection).
At port 9443, TLS is terminated using the certificates in the Kubernetes
secret bookinfo-certs. Clients are authenticated using JWT
tokens, whose keys are obtained from the OIDC provider www.googleapis.com.
The request is then authorized by an the user's authorization engine
hosted at https://company.com/authz before being forwarded to
the productpage service in the backend.
apiVersion: gateway.tsb.tetrate.io/v2
kind: IngressGateway
metadata:
  name: ingress-bookinfo
  group: g1
  workspace: w1
  tenant: mycompany
  organization: myorg
spec:
  workloadSelector:
    namespace: ns1
    labels:
      app: gateway
  http:
  - name: bookinfo-plaintext
    port: 9090
    hostname: bookinfo.com
    routing:
      rules:
      - redirect:
          authority: bookinfo.com
          port: 9443
          redirectCode: 301
          scheme: https
  - name: bookinfo
    port: 9443
    hostname: bookinfo.com
    tls:
      mode: SIMPLE
      secretName: bookinfo-certs
    authentication:
      rules:
        jwt:
        - issuer: https://accounts.google.com
          jwksUri: https://www.googleapis.com/oauth2/v3/certs
        - issuer: "auth.mycompany.com"
          jwksUri: https://auth.mycompany.com/oauth2/jwks
    authorization:
      external:
        uri: https://company.com/authz
        includeRequestHeaders:
        - Authorization # forwards the header to the authorization service.
    routing:
      rules:
      - route:
          host: ns1/productpage.ns1.svc.cluster.local
    rateLimiting:
      settings:
        rules:
          # Ratelimit at 10 requests/hour for clients with a remote address of 1.2.3.4 
        - dimensions: 
          - remoteAddress:
              value: 1.2.3.4
          limit:
            requestsPerUnit: 10
            unit: HOUR
          # Ratelimit at 50 requests/minute for every unique value in the user-agent header
        - dimensions:
          - header:
              name: user-agent
          limit:
            requestsPerUnit: 50
            unit: MINUTE
          # Ratelimit at 100 requests/second for every unique client remote address
          # with the HTTP requests having a GET method and the path prefix of /productpage
        - dimensions:
          - remoteAddress:
              value: "*"
          - header:
              name: ":path"
              value:
                prefix: /productpage
          - header:
              name: ":method"
              value:
                exact: "GET"
          limit:
            requestsPerUnit: 100
            unit: SECOND
In the following example, the clients are authenticated using an external OIDC provider using
AUTHORIZATION_CODE grant type.
Once the client request is authenticated, it gets forwarded to the productpage
service in the backend.
The access_token generated after client authentication is set as Bearer in request headers.
The state of authentication is stored in cookies.
apiVersion: gateway.tsb.tetrate.io/v2
kind: IngressGateway
metadata:
  name: ingress-bookinfo
  group: g1
  workspace: w1
  tenant: mycompany
  organization: myorg
spec:
  workloadSelector:
    namespace: ns1
    labels:
      app: gateway
  http:
  - name: bookinfo-plaintext
    port: 9090
    hostname: bookinfo.com
    routing:
      rules:
        - redirect:
            authority: bookinfo.com
            port: 9443
            redirectCode: 301
            scheme: https
  - name: bookinfo
    port: 9443
    hostname: bookinfo.com
    tls:
      mode: SIMPLE
      secretName: bookinfo-certs
    authentication:
      oidc:
        grantType: AUTHORIZATION_CODE
        clientId: "my-client"
        clientTokenSecret: "my-secret"
        redirectUri: https://httpbin.example.com/bearer
        provider:
          issuer: https://accounts.google.com
          authorizationEndpoint: https://accounts.google.com/v1/authorize
          tokenEndpoint: https://accounts.google.com/v1/token
          jwksUri: https://www.googleapis.com/oauth2/v3/certs
    authorization:
      external:
        uri: https://company.com/authz
        includeRequestHeaders:
          - Authorization # forwards the header to the authorization service.
    routing:
      rules:
      - route:
          serviceDestination:
            host: ns1/productpage.ns1.svc.cluster.local
If the productpage.ns1 service on Kubernetes has a ServiceRoute
with multiple subsets and weights, the traffic will be split across
the subsets accordingly.
The following example illustrates defining non-HTTP servers (based
on TCP) with TLS termination. Here, kafka.myorg.internal uses non-HTTP
protocol and listens on port 9000. The clients have to connect with TLS
with the SNI kafka.myorg.internal. The TLS is terminated at the gateway
and the traffic is routed to kafka.infra.svc.cluster.local:8000.
If subsets are defined in the ServiceRoute referencing
kafka.infra.svc.cluster.local service, then it is also considered
while routing.
apiVersion: gateway.tsb.tetrate.io/v2
kind: IngressGateway
metadata:
  name: ingress-bookinfo
  group: g1
  workspace: w1
  tenant: mycompany
  organization: myorg
spec:
  workloadSelector:
    namespace: ns1
    labels:
      app: gateway
  tcp:
  - name: kafka-gateway
    hostname: kafka.myorg.internal
    port: 9000
    tls:
      mode: SIMPLE
      secretName: kafka-cred
    route:
      host: kafka.infra.svc.cluster.local
      port: 8000
The following example customizes the Extensions to enable
the execution of the specified WasmExtensions list and details
custom properties for the execution of each extension.
apiVersion: gateway.tsb.tetrate.io/v2
kind: IngressGateway
metadata:
  name: ingress-bookinfo
  group: g1
  workspace: w1
  tenant: mycompany
  organization: myorg
spec:
  workloadSelector:
  namespace: ns1
  labels:
    app: gateway
  extension:
  - fqn: hello-world # fqn of imported extensions in TSB
    config:
      foo: bar
  http:
  - name: bookinfo
    port: 80
    hostname: bookinfo.com
    routing:
      rules:
      - route:
        host: ns1/productpage.ns1.svc.cluster.local
`IngressGateway` also allows you to apply ModSecurity/Coraza compatible Web
Application Firewall rules to traffic passing through the gateway.
```yaml
apiVersion: gateway.xcp.tetrate.io/v2
kind: IngressGateway
metadata:
  name: waf-gw
    namespace: ns1
    labels:
      app: waf-gateway
  http:
  - name: bookinfo
    port: 9443
    hostname: bookinfo.com
  waf:
    rules:
      - Include @recommended-conf
      - SecResponseBodyAccess Off
      - Include @owasp_crs/*.conf
| Field | Description | Validation Rule | 
|---|---|---|
| workloadSelector | tetrateio.api.tsb.types.v2.WorkloadSelector  | message = { | 
| http | List of tetrateio.api.tsb.gateway.v2.HttpServer  | – | 
| tlsPassthrough | List of tetrateio.api.tsb.gateway.v2.TLSPassthroughServer  | – | 
| tcp | List of tetrateio.api.tsb.gateway.v2.TCPServer  | – | 
| extension | List of tetrateio.api.tsb.types.v2.WasmExtensionAttachment  | – | 
| waf | tetrateio.api.tsb.security.v2.WAFSettings  | – | 
| configGenerationMetadata | tetrateio.api.tsb.types.v2.ConfigGenerationMetadata  | – | 
Route
One or more destinations in a local/remote cluster for the given request.
| Field | Description | Validation Rule | 
|---|---|---|
| host | string  | string = { | 
| port | uint32  | – | 
TCPServer
A TCP server exposed in an ingress gateway. A TCP server may be used for any TCP based protocol. This is also used for the special case of a non-HTTP protocol requiring TLS termination at the gateway
| Field | Description | Validation Rule | 
|---|---|---|
| name | string  | string = { | 
| port | uint32  | uint32 = { | 
| hostname | string  This is also used in multicluster routing. In the previous example, clients within the mesh
can also use  | string = { | 
| tls | tetrateio.api.tsb.gateway.v2.ServerTLSSettings  | – | 
| route | tetrateio.api.tsb.gateway.v2.Route  | – | 
TLSPassthroughServer
A TLS server exposed in an ingress gateway. For TLS servers the gateways don't terminate connections and use SNI based routing.
| Field | Description | Validation Rule | 
|---|---|---|
| name | string  | string = { | 
| port | uint32  | uint32 = { | 
| hostname | string  | string = { | 
| route | tetrateio.api.tsb.gateway.v2.Route  | message = { |