Kubernetes Ingress-将外部路径引用到服务中的另一个路径

时间:2019-08-28 10:17:34

标签: kubernetes kubernetes-ingress nginx-ingress

我有多个使用不同服务的名称空间
其中一些服务提供了相同的路径,即/ready

我想为每个名称空间/服务创建一个入口规则,因此namespaceA/ready external 路径实际上将转到{{1}处namespaceA下的服务}路径

我了解了rewrite的信息,但如果我对它的理解正确,它将在全球范围内将/ready重定向到namespaceA/ready,这意味着它的作用就好像路径是/ready,无论名称空间如何。

2 个答案:

答案 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有两种,kubernetesnginxinc。 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)

我不确定。但是您在rewriteredirect之间可能会有一些误解。重写规则不会导致重定向,它会重写请求,然后将其发送到特定的后端。配置两个重写规则将具有相同后缀的两个路径重写到两个不同的后端是完全合理和普遍的。

重写是这样的:

$ 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