文章目录
一、前言
Kubernetes中,除了daemonSet和运行在主节点的静态Pod(例如 apiserver controller-manager scheduler etcd),直接使用宿主机IP作为Pod之外,其他的,deployment statefulset job/cronjob replicaSet 控制器管理的Pod,都是需要使用虚拟IP的。这些Pod运行所需要的虚拟IP,都是cni网络插件生成的,如果使用的cni网络插件是Calico的,这些虚拟IP是一个crd自定义的 kind: IPPool 的资源生成的。
这篇文章就来看一下Calico中这个IPPool是怎样为Pod生成虚拟IP的。
本文把握两个知识点
第一,学会查看 ippool 整个yaml文件中,各个属性什么意思;(本文第二部分)
第二,对于各种业务需求,如果使用 IPPool 来完成。(本文第三部分)
二、学会查看 ippool 整个yaml文件中,各个属性什么意思
Pod一般不建议设置静态IP地址,若想要实现设置静态IP,可以参考下面的方法。像亚马逊、阿里云等厂家是支持静态IP的,但如果是自己的私有云,可以参考下面的方法。这里使用的是calico网络方案,其他的网络方案,好像并不支持,更详细的操作,可以看看calico的官方文档。
2.1 ippool整个yaml文件属性解释
IP Pool资源定义
IPPool资源yaml定义
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
blockSize: 26
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
disabled: false
如果使用calicoctl定义,则将apiVersion更改为apiVersion: projectcalico.org/v3
字段说明
metadata:
spec:
要想看每个属性的默认值,就查看集群那个ippool
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
annotations:
projectcalico.org/metadata: '{"uid":"7a74f733-5d33-47f9-8b13-5a379f6e290f","creationTimestamp":"2023-03-08T16:15:22Z"}'
creationTimestamp: "2023-03-08T16:15:22Z"
generation: 1
name: default-ipv4-ippool
resourceVersion: "737"
uid: 21d4daf2-82a3-4c06-bbba-ea99c674005a
spec:
blockSize: 26
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
blockSize 业务含义就是 块大小,默认的块大小是 64 。
32位的默认是 26位,32-26=6 位 ,2的6次方就是64,就是块大小
分块的目的是为了分机器node,每个机器node就分配一个块,证明如下:
2.2 calico底层网络通信(相同Node和不同Node)
IPv4 26和IPv6 122的默认块大小为64个地址的块。这允许将地址按组分配给在同一主机上运行的工作负载。通过对地址进行分组,主机之间以及与其他BGP对等方之间交换的路由更少。如果主机在一个块中分配所有地址,则将为其分配一个附加块。如果没有更多可用的块,则主机可以从分配给其他主机的块中获取地址。为借用的地址添加了特定的路由,这会影响路由表的大小。
情况一:将 myapp-pod 部署在主机 m 上,查看路由解释全过程(优先匹配长的,而不是匹配在前面的)
步骤1:对于具体IP,子网掩码长度24, 在机器m上,192.168.159.8/24、192.168.159.9/24、192.168.159.10/24、192.168.159.11/24、192.168.159.13/24、192.168.159.21/24、192.168.159.22/24、192.168.159.23/24 ,直接使用 calicoXxx 网卡,0.0.0.0 表示在 m 机器上自行处理
步骤2:当访问 192.168.55.64/26、192.168.159.0/26 的时候,m节点可以直接机器上处理(Gatway列为0.0.0.0),w1节点需要通过 tunl0 网卡跳转到 155 机器(Gateway列指出)
步骤3:当访问 192.168.190.64/26 的时候,w1节点可以直接机器上处理(Gatway列为0.0.0.0),m节点需要通过 tunl0 网卡跳转到 151 机器(Gateway列指出)
步骤4:当访问 192.168.100/24 的时候,两个机器都可以通过自己的 ens33 网卡,本机器 0.0.0.0 上处理 (因为这个 192.168.100/24 是通过 ipaddr+mask 配置指定的)
步骤5:当访问 172.17/16 的时候,两个机器都可以通过自己的 docker0 网卡,本机器 0.0.0.0 上处理
步骤6:当访问 0.0.0.0/0 任意地址 的时候,两个机器都可以通过自己的 ens33 网卡,本机器 0.0.0.0 上处理(因为这是通过 linux gateway 配置指定的)
[root@m ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.100.2 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.55.64 0.0.0.0 255.255.255.192 U 0 0 0 *
192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.159.0 0.0.0.0 255.255.255.192 U 0 0 0 *
192.168.159.8 0.0.0.0 255.255.255.255 UH 0 0 0 cali396dfe27aad
192.168.159.9 0.0.0.0 255.255.255.255 UH 0 0 0 calic32badc86da
192.168.159.10 0.0.0.0 255.255.255.255 UH 0 0 0 cali48e10e29d97
192.168.159.11 0.0.0.0 255.255.255.255 UH 0 0 0 cali0054af02df5
192.168.159.13 0.0.0.0 255.255.255.255 UH 0 0 0 cali22552fba529
192.168.159.21 0.0.0.0 255.255.255.255 UH 0 0 0 cali6ab633ce8cf
192.168.159.22 0.0.0.0 255.255.255.255 UH 0 0 0 cali505bb5c3e0a
192.168.159.23 0.0.0.0 255.255.255.255 UH 0 0 0 cali0027cc35f35
192.168.190.64 192.168.100.151 255.255.255.192 UG 0 0 0 tunl0
[root@w1 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0