如何使用Calico CNI为Kubernetes Pod分配静态IP地址
Calico 为Pod分配静态IP实现方案
前提校验
执行以下操作前请先确认基础配置符合要求:
- 你的集群Calico已启用自带IPAM功能,查看
calico-configConfigMap中ipam字段值为calico-ipam - 执行
calicoctl get ippools -o wide确认10.222.0.0/16网段的IP池处于可用状态,disabled字段为false
实现方案
方案1:工作负载注解直接指定静态IP(轻量场景首选)
无需提前创建额外Calico资源,直接在Pod/工作负载的模板注解中配置要绑定的IP即可,IP必须属于10.222.0.0/16网段。
- 单Pod配置示例:
apiVersion: v1 kind: Pod metadata: name: static-ip-demo annotations: cni.projectcalico.org/ipAddrs: '["10.222.1.100"]' spec: containers: - name: nginx image: nginx:alpine
- Deployment/StatefulSet配置示例,注解需填写在
spec.template.metadata下:
apiVersion: apps/v1 kind: Deployment metadata: name: static-ip-deploy spec: replicas: 1 selector: matchLabels: app: static-ip template: metadata: labels: app: static-ip annotations: cni.projectcalico.org/ipAddrs: '["10.222.1.101"]' spec: containers: - name: nginx image: nginx:alpine
注意:如果指定的IP已经被其他Pod占用,新建Pod会启动失败,配置前可先执行
kubectl get pods -o wide | grep 10.222.确认目标IP未被使用。
方案2:IP预留后分配(避免IP被抢占,推荐多负载场景)
如果需要批量保留一批IP不被集群自动分配给其他随机Pod,可以先创建Calico IPReservation资源锁定IP范围:
- 编写IP预留配置文件
ip-reserve.yaml:
apiVersion: projectcalico.org/v3 kind: IPReservation metadata: name: static-ip-pool spec: reservedCIDRs: # 支持单个IP预留或小段网段预留 - 10.222.1.100/32 - 10.222.1.101/32 - 10.222.1.102/32
- 应用配置生效:
calicoctl apply -f ip-reserve.yaml - 预留完成后,再按照方案1的方式在工作负载中指定对应的预留IP即可,不会出现IP被其他Pod抢占的问题。
配置验证
Pod启动完成后执行以下命令确认IP分配符合预期:kubectl get pod <你的Pod名称> -o wide
也可以通过Calico命令查看全局网络端点的IP分配记录:calicoctl get wep --all-namespaces
内容的提问来源于stack exchange,提问作者Nyquillus
相关产品推荐
相关产品推荐

