Правила входа в Kubernetes: как использовать подстановочный знак и конкретный поддомен вместе
Я хочу, чтобы Ingress перенаправлял определенный поддомен в один бэкэнд, а все остальные - в другой. По сути, я хочу определить правило примерно так:
Если поддомен
foo.bar.com
затем перейдите кs1
, для всех других поддоменов перейдите наs2
Когда я определяю правила, как показано ниже в спецификации Ingress, я получаю это исключение при развертывании:
Error: UPGRADE FAILED: cannot re-use a name that is still in use
Когда я меняюсь *.bar.com
в demo.bar.com
это работает, однако.
Вот моя спецификация ресурса Ingress:
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
У кого-нибудь есть идея, возможно ли это или нет?
4 ответа
Теперь это возможно в 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
Я почти уверен, что в настоящее время это невозможно, если рассматривать выпуск 41881, но я мог что-то упустить в самой последней версии Kubernetes - мы собираемся выпустить версию 1.12, как мы говорим.
Уже есть пиар для поддержки доменных имен в правилах входа. обратитесь по ссылке ниже
https://github.com/containous/traefik/issues/3884
Можете ли вы попробовать Traefik v1.7 и посмотреть, включена ли поддержка подстановочных знаков.
Вы можете использовать бэкэнд по умолчанию -
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