我有多个使用不同服务的名称空间
其中一些服务提供了相同的路径,即/ready
我想为每个名称空间/服务创建一个入口规则,因此namespaceA/ready
的 external 路径实际上将转到{{1}处namespaceA
下的服务}路径
我了解了rewrite的信息,但如果我对它的理解正确,它将在全球范围内将/ready
重定向到namespaceA/ready
,这意味着它的作用就好像路径是/ready
,无论名称空间如何。
答案 0 :(得分:1)
除了Lentil1016 answer以外,这是针对rewrite的相同nginx-ingress-controller解决方案的示例。
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: 'false'
nginx.ingress.kubernetes.io/force-ssl-redirect: 'false'
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: myapp
namespace: namespaceA
spec:
rules:
- host: mydomain.io
http:
paths:
- backend:
serviceName: myapp
servicePort: 80
path: /namespaceA(/|$)(.*)
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: myapp
namespace: namespaceB
spec:
rules:
- host: mydomain.io
http:
paths:
- backend:
serviceName: myapp
servicePort: 80
path: /namespaceB(/|$)(.*)
例如,上面的入口定义将导致以下重写:
对于命名空间namespaceA中的目标服务myapp:
mydomain.io/namespaceA rewrites to mydomain.io/
mydomain.io/namespaceA/ rewrites to mydomain.io/
mydomain.io/namespaceA/ready/ rewrites to mydomain.io/ready/
对于命名空间命名空间B中的目标服务myapp:
mydomain.io/namespaceB rewrites to mydomain.io/
mydomain.io/namespaceB/ rewrites to mydomain.io/
mydomain.io/namespaceB/ready/ rewrites to mydomain.io/ready/
注意:您可能需要使用nginx-config ConfigMap来完全关闭nginx-ingress-controller的ssl-redirect。
注意:Nginx-ingress-controllers有两种,kubernetes和nginxinc。 ConfigMap选项和annotations可能每个都不同。
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-config
namespace: nginx-ingress # <--- or ingress-nginx, depends on your installation
data:
redirect-to-https: "false"
ssl-redirect: "false"
答案 1 :(得分:0)
我不确定。但是您在rewrite
和redirect
之间可能会有一些误解。重写规则不会导致重定向,它会重写请求,然后将其发送到特定的后端。配置两个重写规则将具有相同后缀的两个路径重写到两个不同的后端是完全合理和普遍的。
重写是这样的:
$ curl mydomain.io/test/moretest
404 page not found
$ kubectl logs test-server
Request method=GET path=/moretest status=404 user-agent=curl/7.29.0
重定向,却是这样的:
# curl mydomain.io/test/moretest
Moved Permanently
# curl mydomain.io/moretest
404 page not found
$ kubectl logs test-server
Request method=GET path=/test/moretest status=302 user-agent=curl/7.29.0
Request method=GET path=/moretest status=404 user-agent=curl/7.29.0
我对Nginx不熟悉。不过,我知道如何通过Traefik实现这一目标。例如,此yaml
文件将执行以下操作:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myappA
namespace: namespaceA
annotations:
traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
spec:
rules:
- host: mydomain.io
http:
paths:
- path: /namespaceA
backend:
serviceName: myapp
servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myappB
namespace: namespaceB
annotations:
traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
spec:
rules:
- host: mydomain.io
http:
paths:
- path: /namespaceB
backend:
serviceName: myapp
servicePort: 80
对/namespaceA/ready
的所有请求将被重写为/ready
,然后在myapp
中发送给namespaceA
。
对/namespaceB/ready
的所有请求将被重写为/ready
,然后在myapp
中发送到namespaceB
。