Ingress V1 Support
NOTE: Application Gateway for Containers has been released, which introduces numerous performance, resilience, and feature changes. Please consider leveraging Application Gateway for Containers for your next deployment.
This document describes AGIC's implementation of specific Ingress resource fields and features. As the Ingress specification has evolved between v1beta1 and v1, any differences between versions are highlighted to ensure clarity for AGIC users.
Note: Ingress/V1 is fully supported with AGIC >= 1.5.1
Kubernetes Versions
For Kubernetes version 1.19+, the API server translates any Ingress v1beta1 resources to Ingress v1 and AGIC watches Ingress v1 resources.
IngressClass and IngressClass Name
AGIC now supports using ingressClassName
property along with kubernetes.io/ingress.class: azure/application-gateway
to indicate that a specific ingress should processed by AGIC.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shopping-app
spec:
ingressClassName: azure-application-gateway
...
Ingress Rules
Wildcard Hostnames
AGIC supports wildcard hostnames as documented by the upstream API as well as precise hostnames.
- Wildcard hostnames are limited to the whole first DNS label of the hostname, e.g.
*.foo.com
is valid but*foo.com
,foo*.com
,foo.*.com
are not.*
is also not a valid hostname.
PathType property is now mandatory
AGIC now supports PathType in Ingress V1.
Exact
path matches will now result in matching requests to the given path exactly.Prefix
patch match type will now result in matching requests with a "segment prefix" rather than a "string prefix" according to the spec (e.g. the prefix/foo/bar
will match requests with paths/foo/bar
,/foo/bar/
, and/foo/bar/baz
, but not/foo/barbaz
).ImplementationSpecific
patch match type preserves the old path behaviour of AGIC < 1.5.1 and allows to backwards compatibility.
Example Ingress YAML with different pathTypes defined:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shopping-app
spec:
rules:
- http:
paths:
- path: /foo # this would stay /foo since pathType is Exact
pathType: Exact
- path: /bar # this would be converted to /bar* since pathType is Prefix
pathType: Prefix
- path: /baz # this would stay /baz since pathType is ImplementationSpecific
pathType: ImplementationSpecific
- path: /buzz* # this would stay /buzz* since pathType is ImplementationSpecific
pathType: ImplementationSpecific
Behavioural Change Notice
- Starting with AGIC 1.5.1,
- AGIC will now strip
*
from the path ifPathType: Exact
- AGIC will now append
*
to path ifPathType: Prefix
- Before AGIC 1.5.1,
PathType
property was ignored and path matching was performed using Application Gateway wildcard path patterns.- Paths prefixed with
*
were treated asPrefix
match and without were treated asExact
match. - To continue using the old behaviour, use
PathType: ImplementationSpecific
match type in AGIC 1.5.1+ to ensure backwards compatibility.
Here is a table illustrating the corner cases where the behaviour has changed:
AGIC Version | < 1.5.1 | < 1.5.1 | >= 1.5.1 | >= 1.5.1 |
---|---|---|---|---|
PathType | Exact | Prefix | Exact | Prefix |
Path | /foo* | /foo | /foo* | /foo |
Applied Path | /foo* | /foo | /foo (* is stripped) | /foo*(* is appended) |
Example YAML illustrating the corner cases above:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shopping-app
spec:
rules:
- http:
paths:
- path: /foo* # this would be converted to /foo since pathType is Exact
pathType: Exact
- path: /bar # this would be converted to /bar* since pathType is Prefix
pathType: Prefix
- path: /baz* # this would stay /baz* since pathType is Prefix
pathType: Prefix
Mitigation
In case you are affected by this behaviour change in mapping the paths, You can modify your ingress rules to use PathType: ImplementationSpecific
so to retain the old behaviour.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shopping-app
spec:
rules:
- http:
paths:
- path: /path* # this would stay /path* since pathType is ImplementationSpecific
pathType: ImplementationSpecific