编辑
2024-03-25
Kubernetes
00

目录

IPAMConfiguration
创建BGPConfiguration
创建BGPPeer
创建ippool
每个block的ip数量
相关命令
架构图(简)

IPAMConfiguration

bash
apiVersion: projectcalico.org/v3 kind: IPAMConfiguration metadata: name: default spec: strictAffinity: false maxBlocksPerHost: 4
bash
当 StrictAffinity 为 true 时,不允许借用 IP 地址。 maxBlocksPerHost:每个节点上最多允许创建block的数量

创建BGPConfiguration

bash
apiVersion: crd.projectcalico.org/v1 kind: BGPConfiguration metadata: name: default spec: asNumber: 102 # 规划的“容器集群的AS Number” nodeToNodeMeshEnabled: false # 与SDN对接时,无需calico内部东西向所以设置为false logSeverityScreen: Info

创建BGPPeer

bash
apiVersion: projectcalico.org/v3 kind: BGPPeer metadata: name: to-sdn-1 spec: nodeSelector: kubenetes.io/os == 'linux' # 这里使用了现有节点都有的label来匹配所有节点 peerIP: 10.120.1.3 #此处填写要对接的SDN PeerIP asNumber: 100 #此处填写要对接的SDN AS Number
bash
apiVersion: projectcalico.org/v3 kind: BGPPeer metadata: name: to-sdn-2 spec: nodeSelector: kubenetes.io/os == 'linux' # 这里使用了现有节点都有的label来匹配所有节点 peerIP: 10.120.1.4 #此处填写要对接的SDN PeerIP asNumber: 100 #此处填写要对接的SDN AS Number

创建ippool

bash
apiVersion: crd.projectcalico.org/v1 kind: IPPool metadata: name: default-ipv4-pool spec: allowedUses: # 控制池是否用于某些类型的自动分配。可选值:Workload, Tunnel, 默认为["Workload", "Tunnel"] - Workload - Tunnel blockSize: 26 # 此池使用的分配块的CIDR大小。块按需分配给主机,并用于聚合路由。只有在创建池时才能设置该值。IPv4为20至32(含),IPv6为116至128(含),默认情况下对于 IPv4 的掩码为/26,IPv6 的掩码为/122 cidr: 10.244.0.0/18 # 用于此池的 IP 范围,有效的 IPv4 或 IPv6 CIDR。子网长度必须至少足够大以容纳单个块(默认情况下对于 IPv4 的掩码为/26,IPv6 的掩码为/122 ) ipipMode: Never # 定义使用IPIP的模式。不能与vxlanMode同时设置。 可选值:Always, CrossSubnet, Never natOutgoing: true # 启用后,从该池中的Calico网络容器发送到任何Calico IP池之外的目的地的数据包将被伪装。可选值:true, false nodeSelector: all() # 选择Calico IPAM应将此池中的地址分配给的节点。 vxlanMode: Always # 定义使用vxlan的模式。不能与ipipMode同时设置。 可选值:Always, CrossSubnet, Never;当为CrossSubnet时calico可以智能的判断calico节点是否在一个二层网络如果在使用BGP,如果需要依赖三层网络则使用VXlan模式

具体内容如下:

bash
apiVersion: crd.projectcalico.org/v1 kind: IPPool metadata: name: default-ipv4-pool spec: allowedUses: - Workload - Tunnel blockSize: 26 cidr: 10.244.0.0/18 ipipMode: Never natOutgoing: true nodeSelector: all() vxlanMode: Always
  • nodeSelector: 该字段与Kubernetes节点的Label进行映射。默认为all(),表示所有节点均可使用。设置为!all(),表示所有node均不可自动使用,可通过设置命名空间或者POD的注解,实现IPPool的绑定。

  • block/blockSzie: block主要功能是路由聚合,减少对外宣告路由条目。block在POD所在节点自动创建,如在worker01节点创建1.1.1.1的POD时,blocksize为29,则该节点自动创建1.1.1.0/29的block,对外宣告1.1.1.0/29的BGP路由,并且节点下发1.1.1.0/29的黑洞路由和1.1.1.1/32的明细路由。在IBGP模式下,黑洞路由可避免环路。如果blockSize设置为32,则不下发黑洞路由也不会造成环路,缺点是路由没有聚合,路由表项会比较多,需要考虑交换机路由器的容量。

  • 借用IP:Calico创建block时,会出现借用IP的情况。如在 worker01节点存在1.1.1.0/29的block,由于worker01节点负载很高,地址为1.1.1.2的POD被调度到worker02节点,这种现象为IP借用。woker02节点会对外宣告1.1.1.2/32的明细路由,在IBGP模式下,交换机需要开启RR模式,将路由反射给worker01上,否则在不同worker节点的同一个block的POD,由于黑洞路由的存在,导致POD之间网络不通。可通过ipamconfigs来管理是否允许借用IP(strictAffinity)、每个节点上最多允许创建block的数量(maxBlocksPerHost)等。

每个block的ip数量

bash
apiVersion: crd.projectcalico.org/v1 kind: IPPool metadata: name: default-ipv4-pool spec: allowedUses: - Workload - Tunnel blockSize: 26 cidr: 10.244.0.0/18 ipipMode: Never natOutgoing: true nodeSelector: all() vxlanMode: Always
bash
如上, blockSize: 26 ,每个block的IP数量为:2**(32-26)=64个 可以通过命令查看: kubectl get ipamblocks <ippool-name> -o yaml

相关命令

bash
# 查看 ippool 的 blocks kubectl get ipamblocks # 查看ipamconfigs kubectl get ipamconfigs # 查看block kubectl get ipamblocks # 打印与 IP 地址相关的信息。 calicoctl ipam show --ip=192.168.1.2 # 按块打印更详细的 IP 使用情况。 calicoctl ipam show --show-blocks # 打印有关借用 IP 地址的更多详细信息。 calicoctl ipam show --show-borrowed # 表格显示了哪个节点从哪个块借用了哪些 IP 地址以及使用它的实体: +------------+-----------------+---------------+---------------+------+------------------------------------+ | IP | BORROWING-NODE | BLOCK | BLOCK OWNER | TYPE | ALLOCATED-TO | +------------+-----------------+---------------+---------------+------+------------------------------------+ | 172.16.0.1 | worker-node-1 | 172.16.0.0/29 | worker-node-2 | pod | external-ns/nginx-6db489d4b7-gln7h | | 172.16.0.2 | worker-node-3 | 172.16.0.0/29 | worker-node-2 | pod | external-ns/nginx-6db489d4b7-kzkbv | +------------+-----------------+---------------+---------------+------+------------------------------------+

架构图(简)

image.png

js
// 图中l1-l4为交换机,node1-node4为容器集群的ndoe节点 // node1,node2 的上联交换机为 l1,l2 // node3,node4 的上联交换机为 l3,l4 // l1、l2 中间的线互指了两个交换机的静态地址,这样就可以通过一个网卡走l1同时建立l1、l2的BGP peer // node 节点双网卡做bond0(一主一备) 如上图,nodeSelector 中 node1,node2 打相同标签,和自己的上联交换机建立两个peer,具体走哪个peer是取决于路由 node3,node4 应该建立相同的标签,使用nodeSelector和自己的上联交换机建立两个peer。 建立bgp peer之后node1会将自己的32位主机路由信息宣告给l1、l2,同样的其他节点也会将自身的32位主机路由宣告给上联交换机,这样整个集群的32位pod主机路由sdn网络中就会有了。
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:liulei

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!