'Kubernetes ingress rules: How to use wildcard and specific subdomain together
I want Ingress to redirect a specific subdomain to one backend and all others to other backend. Basically, I want to define a rule something like the following:
If subdomain is
foo.bar.com
then go tos1
, for all other subdomains go tos2
When I define the rules as shown below in the Ingress spec, I get this exception at deployment:
Error: UPGRADE FAILED: cannot re-use a name that is still in use
When I change *.bar.com
to demo.bar.com
it works, however.
Here's my Ingress resource spec:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: s1
servicePort: 80
- host: *.bar.com
http:
paths:
- backend:
serviceName: s2
servicePort: 80
Anyone has an idea if it is possible or not?
Solution 1:[1]
This is now possible in Kubernetes:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
kubernetes.io/ingress.class: nginx
kubernetes.io/ingress.global-static-ip-name: web-static-ip
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/server-alias: www.foo.bar
nginx.ingress.kubernetes.io/use-regex: "true"
name: foo-bar-ingress
namespace: test
spec:
rules:
- host: 'foo.bar.com'
http:
paths:
- backend:
serviceName: specific-service
servicePort: 8080
path: /(.*)
pathType: ImplementationSpecific
- host: '*.bar.com'
http:
paths:
- backend:
serviceName: general-service
servicePort: 80
path: /(.*)
pathType: ImplementationSpecific
Solution 2:[2]
I'm pretty sure this is currently not possible when looking at Issue 41881, but I could be missing something in the most recent version of Kubernetes—we're about to release 1.12 as we speak.
Solution 3:[3]
THere is already a PR raised for supporting the wild card domains in ingress rules. refer the below link
https://github.com/containous/traefik/issues/3884
Can you try Traefik v1.7 and see if the wild card support is enabled.
Solution 4:[4]
You can use a default backend -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
- backend:
serviceName: s2
servicePort: 80
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: s1
servicePort: 80
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Nathaniel Ford |
Solution 2 | Michael Hausenblas |
Solution 3 | P Ekambaram |
Solution 4 | Harkirat Singh |