You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Kubespray部署K8s集群时如何保留客户端源IP

使用Kubespray部署K8s集群时如何保留客户端源IP

我来帮你梳理下在Kubespray部署的Kubernetes集群里,保留客户端源IP的可行方案——结合你提到的痛点(externalTrafficPolicy: Local对HA不友好、Calico+eBPF/Cilium尝试失败),给几个实用的方向:

一、优化externalTrafficPolicy: Local的高可用性

你觉得这个方案对HA不友好其实是可以通过配置优化的,并非死穴:

  • 节点与Pod分布策略:确保服务的Pod均匀分布在不同可用区/机架的节点上,配合云厂商负载均衡(或本地LB)的健康检查,让流量只转发到运行有Pod的节点。Kubernetes的EndpointSlice会自动同步Pod状态,避免流量打到无Pod的节点。
  • 可用性保障配置:给服务配置PodDisruptionBudget,限制同时下线的Pod数量;再配合Horizontal Pod Autoscaler,根据流量自动扩容Pod,进一步提升容错能力。
  • 云厂商LB适配:如果是在公有云环境,大部分云厂商的LB支持和externalTrafficPolicy: Local联动,会自动更新目标组,只包含有Pod的节点,不用手动维护。

二、正确配置CNI插件以支持源IP保留

你之前尝试Calico+eBPF、Cilium没成功,大概率是配置没到位,给你具体的配置指引:

Calico(非eBPF模式)

在Kubespray的inventory/group_vars/k8s_cluster/addons.yml里调整以下变量:

calico_enable: true
calico_ippool_ipip_mode: Always  # 或CrossSubnet,根据你的网络拓扑选择
calico_external_traffic_policy_local: true

同时确保服务的externalTrafficPolicy设为Local,Calico会自动处理节点路由,避免SNAT,保留客户端源IP。

Cilium

Cilium要开启源IP保留,需要调整kube-proxy替换模式和相关路由配置,在Kubespray的Cilium变量里设置:

cilium_enable: true
cilium_kube_proxy_replacement: strict  # 用Cilium替代kube-proxy
cilium_enable_ipv4_nexthop_host: true  # 开启源IP保留
cilium_external_traffic_policy: Local

部署完成后,服务配置externalTrafficPolicy: Local即可保留客户端源IP。

三、裸金属环境:NodePort+外部LB透传源IP

如果是裸金属集群,没有云厂商LB的支持,可以用NodePort服务配合外部负载均衡器(比如HAProxy、Nginx):

  1. 服务配置:
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: NodePort
  externalTrafficPolicy: Local
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30080
  1. 外部LB配置:以HAProxy为例,开启proxy_protocol透传源IP,后端指向集群所有节点的NodePort端口,同时LB本身不做SNAT。

总结

优先推荐优化externalTrafficPolicy: Local的HA配置,这是Kubernetes原生支持的方案,成本最低;如果需要更灵活的网络能力,再调整Calico或Cilium的配置;裸金属环境则用NodePort+外部LB的组合。

备注:内容来源于stack exchange,提问作者AslanLiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 15:52:55