如何在EKS中实现Pod静态IP或修改请求源IP?
解决方案:EKS中Pod静态IP或修改请求源IP实现白名单访问
一、实现Pod静态IP(UI Pod固定IP)
在EKS集群中,可通过AWS VPC CNI插件直接为Pod分配静态IP,确保Pod重启后IP不变:
1. AWS VPC CNI静态IP配置
- 前提:集群默认使用AWS VPC CNI插件(EKS默认配置),节点有足够的ENI和私网IP配额
- 给UI Pod的Deployment添加以下annotations,强制分配静态IP:
apiVersion: apps/v1 kind: Deployment metadata: name: ui-deployment spec: template: metadata: annotations: vpc.amazonaws.com/assign-static-ip: "true" # 为每个Pod分配独立ENI,避免IP复用冲突 vpc.amazonaws.com/pod-ip-target: "1" spec: # 配合节点亲和性,将UI Pod固定在指定节点组,防止节点替换导致IP丢失 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-group/role operator: In values: - ui-static-node - 注意:删除Pod重建时,只要节点ENI资源充足,会重新分配原IP;若节点被销毁,需重新将新IP加入白名单。
2. StatefulSet配合静态IP
- 使用StatefulSet部署UI应用,结合VPC CNI静态IP注解,StatefulSet的Pod名称固定,IP分配更稳定:
apiVersion: apps/v1 kind: StatefulSet metadata: name: ui-statefulset spec: serviceName: ui-service replicas: 1 template: metadata: annotations: vpc.amazonaws.com/assign-static-ip: "true" vpc.amazonaws.com/pod-ip-target: "1" spec: containers: - name: ui-container image: your-ui-image:tag
二、修改请求源IP(让后端看到固定代理IP)
通过专用代理转发流量,将UI请求的源IP替换为代理的固定IP,只需将代理IP加入后端白名单:
1. 带静态IP的Nginx代理方案
- 先部署一个单副本Nginx代理Pod,用上述静态IP方案给它分配固定IP
- 配置UI应用,将所有后端请求指向Nginx代理的IP
- Nginx配置反向代理并确保SN生效,示例配置:
server { listen 80; location / { proxy_pass http://tomcat-service:8080; proxy_set_header Host $host; # 后端可通过X-Forwarded-For获取真实UI IP(若需),但白名单只需加Nginx的静态IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } - 若需高可用,可部署多副本Nginx代理,每个都分配静态IP,将所有代理IP加入后端白名单。
2. Service SNAT配置
- 创建一个ClusterIP类型的代理Service,配置
externalTrafficPolicy: Cluster(默认),此模式下源IP会被替换为节点IP,需将节点IP加入白名单(不推荐,节点IP可能变更) - 若使用IPVS模式的kube-proxy,可配置Service的
local-ip指定固定IP,实现SNAT到该IP。
注意事项
- 静态IP方案需提前确认AWS账户的ENI和私网IP配额,避免资源不足
- 代理方案需确保代理的可用性,可结合探针和自动扩缩容
- 若后续有优化空间,建议替换IP白名单为更符合K8s生态的认证方式(如ServiceAccount令牌、OAuth2)
内容的提问来源于stack exchange,提问作者eran meiri
相关产品推荐
相关产品推荐

