我在Kubernetes集群上有一个基于socket.io的node.js部署,它通过Digital Ocean提供了LoadBalancer类型的服务。该服务通过上载到DO的证书使用SSL终止。
我写了一个Pod,该Pod用作运行状况检查,以确保客户端仍然可以连接。此pod是使用socket.io-client
包的node.js,它通过服务的公共域名连接。当我在本地运行容器时,它连接正常,但是当我在与服务相同的群集中将容器作为容器运行时,运行状况检查将无法连接。当我将壳或任何真正的壳装入外壳并尝试wget my-socket.domain.com
时,会收到SSL握手错误“版本号错误”。
从群集外部的客户端连接为什么起作用,从群集外部到普通服务器的客户端连接为什么起作用的任何想法,但是从群集中的Pod到服务的公共域名的客户端连接不起作用?
答案 0 :(得分:0)
您必须设置Ingress Controller才能将流量从负载均衡器路由到服务。
流量看起来像这样:
INTERNET -> LoadBalancer -> [ Ingress Controller -> Service]
如果要使用SSL:
您可以提供自己的SSL证书并创建一个Secret来保存它。然后,您可以参考Ingress规范中的Secret来创建使用证书的HTTP(S)负载均衡器。
您可以使用以下说明来部署类似nginx的入口控制器:ingress-controller。
答案 1 :(得分:0)
结果是,问题出在kube-proxy如何处理LoadBalancer类型的服务以及如何从集群内部对其进行请求。事实证明,在创建服务时,它会添加iptables条目,从而导致群集内的请求完全跳过负载平衡器,这在负载平衡器还处理SSL终止时成为一个问题。有一种解决方法,即添加一个loadbalancer-hostname
批注,以强制所有连接使用负载均衡器。 AWS往往不会出现此问题,因为它们会自动将变通方法应用于其服务配置,但Digital Ocean不会。
以下是更多详细信息: