选stream模块因它在tcp层透传tls流量,不终止ssl、不解析http头,避免证书校验与host改写问题;而http模块需终止tls并处理sni,易出错。

直接用 Nginx 的 stream 模块做跨地域多 K8s 集群 API Server 代理,本质是做 TCP 层转发,不解析 HTTP 内容,适合透传 TLS 加密的 kube-apiserver 流量。它比 HTTP 层代理更轻量、更稳定,也避免了 SSL 证书校验、Host 头改写、重定向失败等常见问题。
为什么选 stream 而不是 http 模块
API Server 通信默认走 HTTPS(TLS),且客户端(如 kubectl、client-go)严格校验证书 Subject Alternative Name(SAN)和域名。HTTP 模块会终止 TLS,需要配置证书、处理 SNI、转发 Host 头,极易出错;而 stream 模块只做 4 层转发,原始 TLS 握手直通到远端 apiserver,证书由客户端和目标集群直接验证,完全透明。
核心配置要点
需在 Nginx 主配置中启用 stream 模块,并为每个远程集群定义一个 upstream 和 server 块:
- 确保 Nginx 编译时已启用
--with-stream(主流发行版包通常默认包含) - stream 块不能放在 http 块内,必须与 http 同级
- 每个集群建议使用独立端口(如 64431 → cluster-us-east,64432 → cluster-cn-north),避免端口冲突和路由混淆
- upstream 中配置真实 apiserver 地址,支持域名(需代理机可解析)或 IP + 端口
- proxy_timeout 和 proxy_responses 影响长连接稳定性,建议设为 1h 或更高(K8s watch 流会长时间保持)
典型配置示例
以下配置将本地 64431 端口流量,无修改地转发至美国东部集群的 api-us-east.example.com:6443:
stream {
upstream cluster_us_east {
server api-us-east.example.com:6443;
}
<pre class="brush:php;toolbar:false;">server {
listen 64431 ssl;
proxy_pass cluster_us_east;
proxy_timeout 3600s;
proxy_responses 1;
# 可选:启用 TLS 终止(仅当你要替换证书时才开),一般建议关闭
# ssl_certificate /path/to/proxy.crt;
# ssl_certificate_key /path/to/proxy.key;
# ssl_protocols TLSv1.2 TLSv1.3;
}}
注意:若不启用 TLS 终止(推荐),则 listen 64431 就够了,无需 ssl 关键字;加上 ssl 表示你在代理层终结 TLS,这反而增加复杂度,通常不需要。
客户端使用方式
用户只需把原 kubeconfig 中的 server 字段改为代理地址即可:
server: https://your-proxy-host:64431
其他不变:certificate-authority-data、token 或 client-certificate 仍由原集群提供。kubectl 或 client-go 会照常完成 TLS 握手,只是 TCP 连接被 stream 模块转到了远端集群。
多个集群就配多个 server 块,分别监听不同端口,再配合不同 kubeconfig 上下文切换,就能实现一套代理服务统一接入多个异地集群。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











