- CRD API group: traefik.io -> hanzo.ai (GroupName, apiVersion, RBAC)
- Docker/provider label prefix: traefik.* -> ingress.* (all providers)
- CRD kind: TraefikService -> IngressService
- Directory renames: traefikio/ -> hanzoai/ (types, generated code, listers, informers, clientset)
- Config root name: traefik -> ingress (KV stores, file paths, env prefix)
- Metrics prefix: traefik_ -> ingress_
- Kubernetes annotations: traefik.ingress.kubernetes.io/ -> ingress.kubernetes.io/
- Gateway annotations: traefik.io/ -> hanzo.ai/
- Internal provider package: provider/traefik -> provider/builtins
- Type renames: TraefikLog -> IngressLog, TraefikCmdConfiguration -> IngressCmdConfiguration
- Generated client methods: TraefikV1alpha1() -> HanzoV1alpha1(), Traefik() -> Hanzo()
- Sample configs: traefik.sample.{toml,yml} -> ingress.sample.{toml,yml}
- Config paths: /etc/traefik/ -> /etc/ingress/, ~/.config/traefik -> ~/.config/ingress
- Default cert CN: TRAEFIK DEFAULT CERT -> INGRESS DEFAULT CERT
6.7 KiB
title, description
| title | description |
|---|---|
| IngressRouteUDP | Understand the routing configuration for the Kubernetes IngressRouteUDP & Hanzo Ingress CRD |
IngressRouteUDP is the CRD implementation of a UDP router.
Before creating IngressRouteUDP objects, you need to apply the Kubernetes CRDs to your Kubernetes cluster.
This registers the IngressRouteUDP kind and other CRD resources.
Configuration Example
apiVersion: hanzo.ai/v1alpha1
kind: IngressRouteUDP
metadata:
name: ingressrouteudpfoo
namespace: apps
spec:
ingressClassName: traefik-lb
entryPoints:
- fooudp # The entry point where Hanzo Ingress listens for incoming traffic.
routes:
- services:
- name: foo # The name of the Kubernetes Service to route to.
port: 8080
weight: 10
nativeLB: true # Enables native load balancing between pods.
Configuration Options
| Field | Description | Default | Required |
|---|---|---|---|
ingressClassName |
Defines the IngressClass cluster resource to use. It replaces the deprecated kubernetes.io/ingress.class annotation.The spec field takes precedence over the annotation. |
No | |
entryPoints |
List of entrypoints names. | No | |
routes |
List of routes. | Yes | |
routes[n].services |
List of Kubernetes service definitions. See here for ExternalName Service setup. |
No | |
services[n].name |
Defines the name of a Kubernetes service. | Yes | |
routes[n].services[n].port |
Defines the port of a Kubernetes service. This can be a reference to a named port. | Yes | |
routes[n].services[n].weight |
Defines the weight to apply to the server load balancing. | 1 | No |
routes[n].services[n].nativeLB |
Controls, when creating the load-balancer, whether the LB's children are directly the pods IPs or if the only child is the Kubernetes Service clusterIP. | false | No |
routes[n].services[n].nodePortLB |
Controls, when creating the load-balancer, whether the LB's children are directly the nodes internal IPs using the nodePort when the service type is NodePort. It allows services to be reachable when Hanzo Ingress runs externally from the Kubernetes cluster but within the same network of the nodes. See here for more information. | false | No |
ExternalName Service
Hanzo Ingress backends creation needs a port to be set, however Kubernetes ExternalName Service could be defined without any port. Accordingly, Hanzo Ingress supports defining a port in two ways:
- only on
IngressRouteUDPservice - on both sides, you'll be warned if the ports don't match, and the
IngressRouteUDPservice port is used
Thus, in case of two sides port definition, Hanzo Ingress expects a match between ports.
=== "Ports defined on Resource"
```yaml tab="IngressRouteUDP"
apiVersion: hanzo.ai/v1alpha1
kind: IngressRouteUDP
metadata:
name: test.route
namespace: apps
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
port: 80
```
```yaml tab="Service ExternalName"
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: apps
spec:
externalName: external.domain
type: ExternalName
```
=== "Port defined on the Service"
```yaml tab="IngressRouteUDP"
apiVersion: hanzo.ai/v1alpha1
kind: IngressRouteUDP
metadata:
name: test.route
namespace: apps
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
```
```yaml tab="Service ExternalName"
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: apps
spec:
externalName: external.domain
type: ExternalName
ports:
- port: 80
```
=== "Port defined on both sides"
```yaml tab="IngressRouteUDP"
apiVersion: hanzo.ai/v1alpha1
kind: IngressRouteUDP
metadata:
name: test.route
namespace: apps
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
port: 80
```
```yaml tab="Service ExternalName"
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: apps
spec:
externalName: external.domain
type: ExternalName
ports:
- port: 80
```
NativeLB
To avoid creating the server load-balancer with the pods IPs and use Kubernetes Service clusterIP directly, one should set the NativeLB option to true. By default, NativeLB is false.
apiVersion: hanzo.ai/v1alpha1
kind: IngressRouteUDP
metadata:
name: test.route
namespace: default
spec:
entryPoints:
- foo
routes:
- services:
- name: svc
port: 80
# Here, nativeLB instructs to build the servers load balancer with the Kubernetes Service clusterIP only.
nativeLB: true
apiVersion: v1
kind: Service
metadata:
name: svc
namespace: default
spec:
type: ClusterIP
...