【问题标题】:Kubernetes - Ingress configuration, two paths redirects to different namespacesKubernetes - 入口配置,两条路径重定向到不同的命名空间
【发布时间】:2020-07-04 16:14:42
【问题描述】:

我正在努力解决入口配置,该配置将允许从两个不同路径访问部署在不同命名空间上的服务。

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/(something) 的路由 - 不起作用,它重定向到 portal-ui 服务。

我认为它可以在同一个命名空间上工作......但我需要为每个服务提供两个命名空间。

【问题讨论】:

    标签: nginx kubernetes nginx-ingress azure-aks


    【解决方案1】:

    正如@Arghya Sadhu 提到的

    Ingress 及其对应的服务需要在同一个命名空间中,否则 Ingress 无法从服务中发现端点。

    有一个github issue 自 2015 年以来开放,目前仍在讨论如何使其发挥作用。

    目前要么在同一个命名空间中创建入口

    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
    


    你可以试试 github issue member @chestack 制作的workaround

    我的解决方法:

    命名空间A中的服务A

    在命名空间B中创建服务B

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

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

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

    【讨论】:

      【解决方案2】:

      Ingress 及其对应的服务需要在同一个命名空间中,否则 Ingress 无法从服务中发现端点。所以在 namespace1 中创建 ingress1, service1,在 namespace2 中创建 ingress2, service2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        • 2020-12-30
        • 1970-01-01
        • 1970-01-01
        • 2019-01-23
        • 2018-03-09
        • 2016-05-23
        相关资源
        最近更新 更多