如何为Kubernetes集群安全配置外部负载均衡?
如何为Kubernetes集群安全配置外部负载均衡?
兄弟,我完全懂你现在的处境——之前把DNS直接绑到集群单节点的坑你已经踩过了,现在用HAProxy做外部负载均衡总算解决了单点故障的问题,但又纠结负载均衡器到K8s集群之间的流量还是明文HTTP,想把这部分也加密对吧?我给你几个生产环境里常用的靠谱方案:
方案一:在K8s服务/Ingress层配置SSL,让HAProxy与集群走HTTPS
这是最直接的应用层加密方式,核心是让K8s侧提供HTTPS服务,HAProxy作为客户端发起加密请求:
- 证书准备:生产环境推荐用
Cert-Manager自动签发Let's Encrypt的可信证书,测试环境可以用自签证书。如果是Ingress Controller管理流量,直接在Ingress资源里配置证书即可;如果是直接暴露NodePort/ClusterIP服务,需要把证书挂载到对应的Pod中,让服务本身监听HTTPS端口。 - HAProxy配置调整:把后端服务器的协议改成https,同时添加证书验证逻辑(如果用自签证书,要把CA证书放到HAProxy的信任目录里)。举个简单的配置示例:
backend k8s-backend mode http server k8s-node-1 10.0.0.10:443 check ssl verify required ca-file /etc/haproxy/root-ca.crt server k8s-node-2 10.0.0.11:443 check ssl verify required ca-file /etc/haproxy/root-ca.crt
方案二:让HAProxy做四层TCP转发,SSL终止在K8s Ingress层
这种方式更适合集群内有统一Ingress Controller的场景,HAProxy只负责把HTTPS流量原封不动转发到Ingress的端口,加密逻辑全在K8s侧处理:
- HAProxy四层转发配置:把frontend和backend都设置为
tcp模式,直接转发443端口的流量到K8s节点的Ingress NodePort(比如30443):
frontend https-tcp-in bind *:443 mode tcp default_backend k8s-ingress-tcp backend k8s-ingress-tcp mode tcp server node-1 10.0.0.10:30443 check server node-2 10.0.0.11:30443 check
- K8s侧配置:在Ingress资源中配置好SSL证书(同样推荐用Cert-Manager自动管理),这样从用户到HAProxy是HTTPS,HAProxy到Ingress也是HTTPS,整个链路全程加密,而且Ingress可以统一管理所有服务的证书,不用逐个配置。
方案三:网络层加密(VPN/IPsec)
如果不想在应用层折腾SSL配置,还可以在负载均衡器和K8s集群之间搭建专用加密网络,比如用WireGuard或IPsec:
- 给HAProxy服务器和所有K8s节点配置WireGuard隧道,让两者之间的通信都走加密隧道,不管是HTTP还是HTTPS流量都会被加密,适合对网络安全要求极高的场景。
- 这种方式的好处是不用修改任何应用或负载均衡器的应用层配置,只需要在网络层面做设置,对业务透明。
额外注意事项
- 如果用自签证书,一定要确保HAProxy信任对应的CA证书,否则会出现SSL握手失败的问题。
- 生产环境优先用
Cert-Manager管理证书,它能自动续期证书,避免证书过期导致服务中断。 - 别忘了配置健康检查,确保HAProxy能及时识别K8s节点的状态,不会把流量转发到故障节点上。
备注:内容来源于stack exchange,提问作者Viktor Eriksson
相关产品推荐
相关产品推荐

