node.js - 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 到服务的公共域名的客户端连接不起作用?
解决方案
事实证明,问题在于 kube-proxy 如何处理 LoadBalancer 类型的服务以及集群内部对它的请求。事实证明,在创建服务时,它会添加 iptables 条目,导致集群内的请求完全跳过负载均衡器,当负载均衡器也处理 SSL 终止时,这会成为一个问题。有一种解决方法,即添加一个loadbalancer-hostname
注释,强制所有连接使用负载均衡器。AWS 往往没有这个问题,因为他们会自动将变通方法应用到他们的服务配置中,但 Digital Ocean 没有。
以下是更多细节:
推荐阅读
- google-people-api - 向 Google People API 请求时出现 429 错误
- django - 尽管设置,表单不需要 Django 小部件
- visual-studio - 为 VS2017 安装 GitHub 扩展“此扩展不可安装在任何当前安装的产品上”
- sql - pg_shadow 表在哪里?
- excel - 在范围内的值上构建组合框列表跳过空单元格
- ios - 是否可以使用 xcodebuild 而完全不使用 Xcode 来开发 iOS 应用程序?
- modelica - 循环使用注释创建和声明对象
- amazon-web-services - Codebuild 没有安装 PHP 包
- python-3.x - 在 Python 中查找任何给定年份的 6 月和 12 月的最后营业日期
- clipboard - 从 Windows 的 linux 子系统中的剪贴板进行管道传输