首页 > 解决方案 > Kubernetes + Socket.io:Pod 客户端 -> LoadBalancer 服务 SSL 问题

问题描述

我在我的 Kubernetes 集群上有一个基于 socket.io 的 node.js 部署,并通过 Digital Ocean 提供了 LoadBalancer 类型的服务。该服务使用上传到 DO 的证书使用 SSL 终止。

我编写了一个 pod,它充当健康检查以确保客户端仍然能够连接。这个 pod 是 node.js 使用的socket.io-client包,它通过服务的公共域名连接。当我在本地运行容器时,它连接得很好,但是当我将容器作为与服务在同一集群中的 pod 运行时,健康检查无法连接。当我进入 pod 或任何 pod 并尝试wget my-socket.domain.com时,我收到 SSL 握手错误“错误的版本号”。

知道为什么来自集群外部的客户端连接有效,从集群到普通服务器的客户端连接有效,但是从集群中的 pod 到服务的公共域名的客户端连接不起作用?

标签: node.jssslnetworkingkubernetessocket.io

解决方案


事实证明,问题在于 kube-proxy 如何处理 LoadBalancer 类型的服务以及集群内部对它的请求。事实证明,在创建服务时,它会添加 iptables 条目,导致集群内的请求完全跳过负载均衡器,当负载均衡器也处理 SSL 终止时,这会成为一个问题。有一种解决方法,即添加一个loadbalancer-hostname注释,强制所有连接使用负载均衡器。AWS 往往没有这个问题,因为他们会自动将变通方法应用到他们的服务配置中,但 Digital Ocean 没有。

以下是更多细节:

https://github.com/digitalocean/digitalocean-cloud-controller-manager/blob/master/docs/controllers/services/annotations.md


推荐阅读