首页 > 解决方案 > Kubernetes Ingress - 将外部路径引用到服务中的另一个路径

问题描述

我有多个使用不同服务的命名空间其中
一些服务公开相同的路径,即/ready

我想为每个命名空间/服务创建一个入口规则,因此外部路径namespaceA/ready实际上会转到路径下的namespaceA服务/ready

我读到了rewrite,但如果我理解正确,它将重定向namespaceA/ready/ready全局,这意味着它就像路径一样/ready,无论名称空间如何。

标签: kuberneteskubernetes-ingressnginx-ingress

解决方案


除了Lentil1016 answer之外,这里是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/

对于命名空间 namespaceB 中的目标服务 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 选项和注释对于它们中的每一个都可能不同。

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"

推荐阅读