Skip to main content

Command Palette

Search for a command to run...

Calico 3.5:根据节点标签分配 IP 地址

Updated
2 min read

原文:Assigning IP addresses based on topology

关于 IP 地址的分配

Calico 能够进行配置,为不同拓扑指定 IP 地址池。例如可能希望某些机架、地区、或者区域能够从同一个 IP 池中获取地址。这对于降低路由数量或者配合防火墙策略的要求会很有帮助。

cni 插件配置参考中的 IP 地址管理章节中包含了三种分配 IP 地址的方式。Kubernetes 注解方式只能用于 Namespace 或者 Pod 一级。剩下的只有两个办法,CNI 配置或者是基于节点选择器的 IP 池,相对于 CNI 配置的方式来说,节点选择器方案省去了修改本地文件的麻烦。

在更高层次上,基于节点选择器的 IP 地址分配方法就是给节点设置标签,然后用节点选择器选择对应的 IP 地址池进行分配。后面的内容中将给出一个详细的例子,用这种方式来设置一种机架亲和方式的 IP 地址分配方案。

如果 Calico 无法根据上述顺序来决定一个 IP 地址池,或者在选定的地址池中找不到可用的 IP 地址,那么这一工作负载就不会分到 IP 地址,无法启动。为了防止这种情况的发生,我们建议所有节点至少有一个合适的地址池。

先决条件

这一功能需要 Calico 在 ETCD 模式下工作。

示例:Kubernetes

本例中,我们会创建一个集群,其中包含四个节点,分布在两个机架上,每个机架各两台。示意如下:

       -------------------
       |    router       |
       -------------------
       |                 |
---------------   ---------------
| rack-0      |   | rack-1      |
---------------   ---------------
| kube-node-0 |   | kube-node-2 |
- - - - - - - -   - - - - - - - -
| kube-node-1 |   | kube-node-3 |
- - - - - - - -   - - - - - - - -

Pod IP 地址范围为 192.168.0.0/16,我们进行如下设计:保留 192.168.0.0/24rack-0, 192.168.1.0/24rack-1

要设置一个没有缺省地址池的的 Calico,首先运行 calicoctl get ippool -o wide,会看到已经创建了一个 192.168.0.0/16 的地址池:

NAME                  CIDR             NAT    IPIPMODE   DISABLED   SELECTOR
default-ipv4-ippool   192.168.0.0/16   true   Always     false      all()
  1. 删除缺省地址池

    default-ipv4-ippool 地址池已经存在,并占据了整个 /16 块,因此必须删除:calicoctl delete ippools default-ipv4-ippool

  2. 给 Node 打标签。

    要给特定节点分配地址池,节点必须用标签进行标识:

     kubectl label nodes kube-node-0 rack=0
     kubectl label nodes kube-node-1 rack=0
     kubectl label nodes kube-node-2 rack=1
     kubectl label nodes kube-node-3 rack=1
    
  3. 为每个机架创建地址池

     calicoctl create -f -<<EOF
     apiVersion: projectcalico.org/v3
     kind: IPPool
     metadata:
       name: rack-0-ippool
     spec:
       cidr: 192.168.0.0/24
       ipipMode: Always
       natOutgoing: true
       nodeSelector: rack == "0"
     EOF
    
     calicoctl create -f -<<EOF
     apiVersion: projectcalico.org/v3
     kind: IPPool
     metadata:
       name: rack-1-ippool
     spec:
       cidr: 192.168.1.0/24
       ipipMode: Always
       natOutgoing: true
       nodeSelector: rack == "1"
     EOF
    

    现在就创建了两个地址池,使用 calicoctl get ippool -o wide 进行查看:

     NAME                  CIDR             NAT    IPIPMODE   DISABLED   SELECTOR
     rack-1-ippool         192.168.0.0/24   true   Always     false      rack == "0"
     rack-2-ippool         192.168.1.0/24   true   Always     false      rack == "1"
    
  4. 检查地址池的工作状态

    创建一个 Nginx 的 Deployment,其中包含五个副本,保证分配到每一个节点上。

     kubectl run nginx --image nginx --replicas 5
    

    检查新的 Pod 是否已经根据所在机架获得了应有的 IP 地址。

     NAME                   READY   STATUS    RESTARTS   AGE    IP             NODE          NOMINATED NODE   READINESS GATES
     nginx-5c7588df-prx4z   1/1     Running   0          6m3s   192.168.0.64   kube-node-0   <none>           <none>
     nginx-5c7588df-s7qw6   1/1     Running   0          6m7s   192.168.0.129  kube-node-1   <none>           <none>
     nginx-5c7588df-w7r7g   1/1     Running   0          6m3s   192.168.1.65   kube-node-2   <none>           <none>
     nginx-5c7588df-62lnf   1/1     Running   0          6m3s   192.168.1.1    kube-node-3   <none>           <none>
     nginx-5c7588df-pnsvv   1/1     Running   0          6m3s   192.168.1.64   kube-node-2   <none>           <none>
    

    可以看到,IP 地址的是根据节点(所在的机架)来选择了对应的地址池进行分配的。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts