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"
如果我不能正确解释,可能很难解释。很抱歉。
在我们的 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"