Kubernetes-入口配置,两条路径重定向到不同的名称空间

时间:2020-03-24 07:17:24

标签: nginx kubernetes nginx-ingress azure-aks

我正在努力应对允许从两个不同路径访问到部署在不同名称空间上的服务的入口配置。

1#入口:

    # Source: deployment/templates/ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: portal-api
  labels:
    helm.sh/chart: deployment-0.1.0
    app.kubernetes.io/name: deployment
    app.kubernetes.io/instance: portal-api
    app.kubernetes.io/version: "0.0.1"
    app.kubernetes.io/managed-by: Helm
  annotations:
    certmanager.k8s.io/acme-challenge-type: http01
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    kuberentes.io/tls-acme: "true"
    kubernetes.io/ingress.class: nginx
spec:
  tls:
    - hosts:
        - "example.com"
      secretName: portal-certificate
  rules:
    - host: "example.com"
      http:
        paths:
          - path: /api/rest/(.*)
            backend:
              serviceName: portal-api
              servicePort: 80

2入口

# Source: deployment/templates/ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: portal-ui
  labels:
    helm.sh/chart: deployment-0.1.0
    app.kubernetes.io/name: deployment
    app.kubernetes.io/instance: portal-ui
    app.kubernetes.io/version: "0.0.1"
    app.kubernetes.io/managed-by: Helm
  annotations:
    certmanager.k8s.io/acme-challenge-type: http01
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
    - hosts:
        - "example.com"
      secretName: portal-certificate
  rules:
    - host: "example.com"
      http:
        paths:
          - path: /(.*)
            backend:
              serviceName: portal-ui
              servicePort: 80

为路径example.com路由-有效,将其重定向到portal-ui。 路径路由example.com/api/rest/(某物)-不起作用,它重定向到Portal-ui服务。

我认为它将在相同的名称空间上工作...但是我需要为每个服务使用两个名称空间。

2 个答案:

答案 0 :(得分:3)

@Arghya Sadhu提到

Ingress及其对应的服务必须位于同一名称空间中,否则Ingress无法从服务中发现端点。

自2015年以来开设了github issue,并且仍在讨论如何使其运作。

目前,可以在同一名称空间中创建入口

由github发行成员@aledbf制作的示例

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: component1
  namespace: component1
spec:
  rules:
  - host: domain.com
    http:
      paths:
      - backend:
          serviceName: component1
          servicePort: 80
        path: /component1
apiVersion: extensions/v1beta1


kind: Ingress
metadata:
  name: component2
  namespace: component2
spec:
  rules:
  - host: domain.com
    http:
      paths:
      - backend:
          serviceName: component2
          servicePort: 80
        path: /component2

OR


您可以尝试由github问题成员@chestack制作的workaround

我的解决方法:

namespaceA中的serviceA

在namespaceB中创建serviceB

spec:
    ...
    type: ExtertalName
    externalName: serviceA.namespaceA.svc.cluster.local

将入口规则添加到命名空间B中的ingressB

- path: /****
        backend:
          serviceName: serviceB
          servicePort: ***

答案 1 :(得分:1)

Ingress及其对应的服务必须位于同一名称空间中,否则Ingress无法从服务中发现端点。因此,在名称空间1中创建i​​ngress1,service1,在名称空间2中创建ingress2,service2。

相关问题