Kubernetes:通过 traefik 入口控制器处理与集群中多个 LoadBalancer 的连接

Kubernetes: Handle connections with multiple LoadBalancer in cluster via traefik ingress controller

如果我不能正确解释,可能很难解释。很抱歉。

在我们的 k8s 集群中,我们有两个 OpenStack-Load Balancer,因为我们想通过必须面向 Internet 的入口公开我们的应用程序。在同一个集群中,我们还部署了 pgadmin4,它必须面向 Intranet。(只能从内部网络访问。)

因此,在这些 OpenStack-LB 之前,我们还有 f5 负载均衡器,它处理 https 连接、ssl .. 以及通过内联网或互联网公开的逻辑。

MyApp 面向互联网,需要通过 host.internet.net

访问

PgAdmin4 是内联网,需要通过 host.intranet.net/pgadmin4

访问

所以问题是,当我尝试使用 host.internet.net 通过入口公开我的应用程序时,它不会工作并且我收到以下错误,原因可能是它无法与正确的 openStack-LB 通信。当我尝试通过 openStack-lb IP 公开时,一切正常。

{"level":"error","msg":"Service not found for dev/oneapihub-ui-dev","time":"2020-03-26T05:20:05Z"} {"level":"error","msg":"endpoints not found for dev/oneapihub-ui-dev","time":"2020-03-26T05:20:05Z"}

问题是,如何通过入口控制器处理这个问题?我应该安装另一个 traefik 入口控制器吗?

capel0068340585:~ semural$ kubectl get ingress -n ingress
NAME                        HOSTS   ADDRESS   PORTS   AGE
ingress-traefik-dashboard   *                 80      21d

kubectl get tenantSpec -o yaml

    loadBalancers:
    - ip: <IP1>
      name: LBaaS2
      ports:
      - extPort: 80
        name: "80"
        nodePort: 30001
    - ip: <IP2>
      name: LBaaS1
      ports:
      - extPort: 80
        name: "80"
        nodePort: 30000

NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/oneapihub-ui-dev        ClusterIP   10.254.173.130   <none>        80/TCP     15m

NAME                        ENDPOINTS           AGE
endpoints/oneapihub-ui-dev        10.6.24.136:3000    15m

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: traefik
  hosts:
    - host:  host.internet.net -> example
      paths: [/]
  tls: []

ingress:
  enabled: ingress
  annotations: 
    kubernetes.io/ingress.class: traefik
  hosts:
    - host: host.intranet.net
      paths:
      - /pgadmin4

你的错误状态 "Service not found for dev/oneapihub-ui-dev",这意味着 traefik 正在尝试连接到名为 "oneapihub-ui-dev" 的 dev 命名空间中的服务,但它找不到。

您需要确保服务存在并且具有端点。您可以使用 kubectl -n dev get service oneapihub-ui-dev 检查该服务是否存在。如果存在,请检查它是否具有 kubectl -n dev get ep oneapihub-ui-dev.

的端点

编辑:如果服务存在并且有端点,那么您可能需要查看 traefik 的 RBAC 权限,看看它是否有足够的权限查看 dev 命名空间,以及您是否没有在阻止入口命名空间连接的开发命名空间。

我通过使用 labelSelector for traefik 解决了这个问题。我只为内部网络公开的服务有一个标签,例如 traffic-type=internal 。您还可以为 RBAC 权限提供一个命名空间.

kubernetes:
  namespaces:
   - default
   - database
   - monitoring
   - logging
   - ingress
  labelSelector: "traffic-type=internal"