GKE中为同StatefulSet的两个Pod分配主VPC静态内网IP
针对GKE StatefulSet Pod分配主VPC网段静态内网IP的方案
方案一:直接为Pod指定静态IP(VPC原生集群适用)
这是最直接的解决方式,无需调整集群CIDR,仅需在主VPC子网预留静态IP后绑定到Pod:
- 在GCP VPC主子网中预留两个未被占用的静态内网IP,确保它们不在集群的
cluster_ipv4_cidr_block和services_ipv4_cidr_block范围内。 - 修改StatefulSet的Pod模板,通过
ipam字段绑定静态IP:
apiVersion: apps/v1 kind: StatefulSet metadata: name: your-statefulset-name spec: serviceName: your-headless-service replicas: 2 template: metadata: annotations: ipam.gke.io/ip-family: IPv4 spec: containers: - name: your-container image: your-image:tag # StatefulSet会按Pod序号对应分配静态IP ipam: staticIPs: - ipam.gke.io/static-ip: "10.0.0.10" # 对应Pod-0的主网段IP - ipam.gke.io/static-ip: "10.0.0.11" # 对应Pod-1的主网段IP
StatefulSet的Pod会按序号自动匹配静态IP,Pod-0用第一个IP,Pod-1用第二个IP,刚好契合你活动/备用的节点架构,不需要负载均衡分流。
方案二:HostNetwork绑定节点静态IP(备选)
如果Pod静态IP的版本限制无法满足,可以让Pod直接使用节点的网络命名空间,通过节点的静态IP对外提供服务:
- 为集群内的两个节点分别分配主VPC网段的静态内网IP,完成节点的IP绑定配置。
- 修改StatefulSet模板,启用
hostNetwork并通过nodeSelector固定Pod到指定节点:
apiVersion: apps/v1 kind: StatefulSet metadata: name: your-statefulset-name spec: serviceName: your-headless-service replicas: 1 template: spec: hostNetwork: true nodeSelector: kubernetes.io/hostname: "node-with-static-ip-1" containers: - name: your-container image: your-image:tag ports: - containerPort: 8080 hostPort: 8080 # 需指定主机端口避免冲突
再创建一个相同配置的StatefulSet(或调整副本逻辑),绑定到第二个带静态IP的节点。这种方式需要注意端口冲突问题,确保Pod使用的端口在节点上未被占用。
关键注意事项
- 方案一要求集群为VPC原生模式,且GKE版本≥1.21(Pod静态IP功能的最低支持版本)
- 预留的静态IP必须属于主VPC子网,且未被其他GCP资源占用
- 两种方案都不需要配置负载均衡,可通过应用层健康检查实现活动/备用节点的切换
内容的提问来源于stack exchange,提问作者tumpy
相关产品推荐
相关产品推荐

