首页 > 其他分享 >【Kubernetes】Calico CrossSubnet 模式实

【Kubernetes】Calico CrossSubnet 模式实

时间:2023-11-08 13:45:50浏览次数:34  
标签:Kubernetes 0.0 192.168 255.255 CrossSubnet ff 172.16 k8s Calico

网络环境

主机名宿主机 IP 地址
k8s-master1 192.168.3.241
k8s-master2 192.168.3.242
k8s-master3 192.168.3.243
k8s-node1 192.168.32.105

注意:k8s-node1 是 32.0/24 网段,跟其他三个节点不同网段。

部署 Vxlan CroossSubnet

修改 calico.yaml,将 CALICO_IPV4POOL_IPIP 改为 Never,CALICO_IPV4POOL_VXLAN 改为 CrossSubnet。

- name: CALICO_IPV4POOL_IPIP
              value: "Never"
- name: CALICO_IPV4POOL_VXLAN
              value: "CrossSubnet"

执行 kubectl apply -f calico.yaml 命令。

root@k8s-master1:~# kubectl describe ippool default-ipv4-ippool
...
...
Spec:
  Allowed Uses:
    Workload
    Tunnel
  Block Size:     26
  Cidr:           172.16.0.0/16
  Ipip Mode:      Never
  Nat Outgoing:   true
  Node Selector:  all()
  Vxlan Mode:     CrossSubnet # 启用 CroosSubnet 模式
Events:           <none>
root@k8s-master1:~#

待 calico-node 运行起来后,在每个节点都会创建一个 vxlan.calico 网卡。

看下所有节点的 vxlan.calico IP地址以及路由表。

# k8s-master1
root@k8s-master1:~# ip addr show vxlan.calico
11: vxlan.calico: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default 
    link/ether 66:04:84:48:ab:6a brd ff:ff:ff:ff:ff:ff
    inet 172.16.159.128/32 scope global vxlan.calico
       valid_lft forever preferred_lft forever
    inet6 fe80::6404:84ff:fe48:ab6a/64 scope link 
       valid_lft forever preferred_lft forever
root@k8s-master1:~#
root@k8s-master1:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.3.1     0.0.0.0         UG    0      0        0 eth0
172.16.36.64    172.16.36.64    255.255.255.192 UG    0      0        0 vxlan.calico
172.16.135.192  192.168.3.243   255.255.255.192 UG    0      0        0 eth0
172.16.159.128  0.0.0.0         255.255.255.192 U     0      0        0 *
172.16.159.145  0.0.0.0         255.255.255.255 UH    0      0        0 cali64d6bf8fbc2
172.16.159.146  0.0.0.0         255.255.255.255 UH    0      0        0 cali65229b3901f
172.16.159.147  0.0.0.0         255.255.255.255 UH    0      0        0 cali371c0d785a0
172.16.159.148  0.0.0.0         255.255.255.255 UH    0      0        0 cali260c8237869
172.16.224.0    192.168.3.242   255.255.255.192 UG    0      0        0 eth0
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.32.0    192.168.3.130   255.255.255.0   UG    0      0        0 eth0
root@k8s-master1:~#

# k8s-master2
root@k8s-master2:~# ip addr show vxlan.calico
11: vxlan.calico: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default 
    link/ether 66:6c:9e:74:3f:25 brd ff:ff:ff:ff:ff:ff
    inet 172.16.224.0/32 scope global vxlan.calico
       valid_lft forever preferred_lft forever
    inet6 fe80::646c:9eff:fe74:3f25/64 scope link 
       valid_lft forever preferred_lft forever
root@k8s-master2:~#
root@k8s-master2:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.3.1     0.0.0.0         UG    0      0        0 eth0
172.16.36.64    172.16.36.64    255.255.255.192 UG    0      0        0 vxlan.calico
172.16.135.192  192.168.3.243   255.255.255.192 UG    0      0        0 eth0
172.16.159.128  192.168.3.241   255.255.255.192 UG    0      0        0 eth0
172.16.224.0    0.0.0.0         255.255.255.192 U     0      0        0 *
172.16.224.15   0.0.0.0         255.255.255.255 UH    0      0        0 cali1efce61525b
172.16.224.16   0.0.0.0         255.255.255.255 UH    0      0        0 calib842f790f49
172.16.224.17   0.0.0.0         255.255.255.255 UH    0      0        0 cali274c832c1f9
172.16.224.18   0.0.0.0         255.255.255.255 UH    0      0        0 cali40e7bc80fa0
172.16.224.19   0.0.0.0         255.255.255.255 UH    0      0        0 calid91ffb2ed56
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.32.0    192.168.3.130   255.255.255.0   UG    0      0        0 eth0
root@k8s-master2:~#

# k8s-master3
root@k8s-master3:~# ip addr show vxlan.calico
8: vxlan.calico: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default 
    link/ether 66:71:16:28:d9:6c brd ff:ff:ff:ff:ff:ff
    inet 172.16.135.192/32 scope global vxlan.calico
       valid_lft forever preferred_lft forever
    inet6 fe80::6471:16ff:fe28:d96c/64 scope link 
       valid_lft forever preferred_lft forever
root@k8s-master3:~#
root@k8s-master3:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.3.1     0.0.0.0         UG    0      0        0 eth0
172.16.36.64    172.16.36.64    255.255.255.192 UG    0      0        0 vxlan.calico
172.16.135.192  0.0.0.0         255.255.255.192 U     0      0        0 *
172.16.135.201  0.0.0.0         255.255.255.255 UH    0      0        0 calidd1fb919b68
172.16.135.202  0.0.0.0         255.255.255.255 UH    0      0        0 cali70c7ede3931
172.16.159.128  192.168.3.241   255.255.255.192 UG    0      0        0 eth0
172.16.224.0    192.168.3.242   255.255.255.192 UG    0      0        0 eth0
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.32.0    192.168.3.130   255.255.255.0   UG    0      0        0 eth0
root@k8s-master3:~#

# k8s-node1
root@k8s-node1:~# ip addr show vxlan.calico
10: vxlan.calico: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default 
    link/ether 66:8c:73:5a:90:99 brd ff:ff:ff:ff:ff:ff
    inet 172.16.36.64/32 scope global vxlan.calico
       valid_lft forever preferred_lft forever
    inet6 fe80::648c:73ff:fe5a:9099/64 scope link 
       valid_lft forever preferred_lft forever
root@k8s-node1:~# 
root@k8s-node1:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.32.1    0.0.0.0         UG    0      0        0 eth0
172.16.36.64    0.0.0.0         255.255.255.192 U     0      0        0 *
172.16.36.80    0.0.0.0         255.255.255.255 UH    0      0        0 caliedeb416dbd0
172.16.36.81    0.0.0.0         255.255.255.255 UH    0      0        0 cali003b4fb9240
172.16.135.192  172.16.135.192  255.255.255.192 UG    0      0        0 vxlan.calico
172.16.159.128  172.16.159.128  255.255.255.192 UG    0      0        0 vxlan.calico
172.16.224.0    172.16.224.0    255.255.255.192 UG    0      0        0 vxlan.calico
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.3.0     192.168.32.130  255.255.255.0   UG    0      0        0 eth0
192.168.32.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
root@k8s-node1:~#

k8s-master1 跟 k8s-master2、k8s-master3 是同一个网段,从路由表来看通信是由 eth0 负责的,而 k8s-node1 是不同网段的,需要 vxlan 封装再传输出去。

小提示:所有节点的路由表都是动态维护的,如果其中一个节点的路由表有缺失会自动补全,人为删除也会自动补回来。

 

据说 CrossSubnet 模式会自行判断是用 vxlan 还是 bgp,比如跨网段用 vxlan,同网段用 bgp。

我是实战派,通过实践来了解一下通信流程,建议结合 tcpdump 抓包。

同网段之间通信流程

按照 CrossSubnet 模式的工作原理,同网段之间通信,不需要做 vxlan 封包,所以不需要抓 vxlan.calico。

预先在 k8s-master1 上部署 tcpdump 抓包。

tcpdump -i cali64d6bf8fbc2 -nnet icmp # cali64d6bf8fbc2 是 Pod-1 的网卡
tcpdump -i eth0 -nnet icmp

简单分析一下。数据包从 Pod-1 网卡到宿主机 eth0 网卡,IP 地址都没有改变,但是 MAC 地址变了。

这两个 MAC 地址正是 k8s-master1 和 k8s-master2 的。

root@k8s-master1:~# tcpdump -i cali64d6bf8fbc2 -nnet icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on cali64d6bf8fbc2, link-type EN10MB (Ethernet), capture size 262144 bytes
5e:62:2b:8c:4d:9d > ee:ee:ee:ee:ee:ee, ethertype IPv4 (0x0800), length 98: 172.16.159.145 > 172.16.224.15: ICMP echo request, id 106, seq 0, length 64
ee:ee:ee:ee:ee:ee > 5e:62:2b:8c:4d:9d, ethertype IPv4 (0x0800), length 98: 172.16.224.15 > 172.16.159.145: ICMP echo reply, id 106, seq 0, length 64

#
root@k8s-master1:~# tcpdump -i eth0 -nnet icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:15:5d:03:0b:0a > 00:15:5d:03:0b:0b, ethertype IPv4 (0x0800), length 98: 172.16.159.145 > 172.16.224.15: ICMP echo request, id 106, seq 0, length 64
00:15:5d:03:0b:0b > 00:15:5d:03:0b:0a, ethertype IPv4 (0x0800), length 98: 172.16.224.15 > 172.16.159.145: ICMP echo reply, id 106, seq 0, length 64

# k8s-master1
root@k8s-master1:~# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:03:0b:0a brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.241/24 brd 192.168.3.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.3.240/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe03:b0a/64 scope link 
       valid_lft forever preferred_lft forever
root@k8s-master1:~# 

# k8s-master2
root@k8s-master2:~# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:03:0b:0b brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.242/24 brd 192.168.3.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe03:b0b/64 scope link 
       valid_lft forever preferred_lft forever
root@k8s-master2:~#

为何使用 Pod IP 地址就能完成通信?重点是 MAC 地址,当数据包到达对方后,链路层负责 MAC 地址,解包后得到 Pod IP 地址,交由网络层负责,最终通过判断路由表将数据包转发给指定网卡。

小结:同一网段的节点之间只需要使用 Pod IP地址就能通信。

注意事项:某些云厂商的网卡有开启源目的检查功能,服务器之间不能使用 Pod IP 地址通信,解决办法也简单,关闭该功能即可。

不同网段之间通信流程

不同网段之间通信需要做 vxlan.calico 封包,需要抓取经过 vxlan.calico 的数据包。

预先在 k8s-msater1 上部署 tcpdump 抓包。

tcpdump -i cali64d6bf8fbc2 -nnet icmp
tcpdump -i vxlan.calico -nnet icmp
tcpdump -i eth0 -nnet udp

数据包从 Pod-1 网卡到 vxlan.calico 网卡,IP 地址没变,MAC 地址变化了。然后再到宿主机 eth0 网卡,做了 VXLAN 封包,IP 地址和 MAC 地址都变成了宿主机的,往目的端口 4789 传输数据包,VXLAN 里面包含了 Pod 的 IP 地址。

root@k8s-master1:~# tcpdump -i cali64d6bf8fbc2 -nnet icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on cali64d6bf8fbc2, link-type EN10MB (Ethernet), capture size 262144 bytes
5e:62:2b:8c:4d:9d > ee:ee:ee:ee:ee:ee, ethertype IPv4 (0x0800), length 98: 172.16.159.145 > 172.16.36.80: ICMP echo request, id 111, seq 0, length 64
ee:ee:ee:ee:ee:ee > 5e:62:2b:8c:4d:9d, ethertype IPv4 (0x0800), length 98: 172.16.36.80 > 172.16.159.145: ICMP echo reply, id 111, seq 0, length 64

#
root@k8s-master1:~# tcpdump -i vxlan.calico -nnet icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vxlan.calico, link-type EN10MB (Ethernet), capture size 262144 bytes
66:04:84:48:ab:6a > 66:8c:73:5a:90:99, ethertype IPv4 (0x0800), length 98: 172.16.159.145 > 172.16.36.80: ICMP echo request, id 111, seq 0, length 64
66:8c:73:5a:90:99 > 66:04:84:48:ab:6a, ethertype IPv4 (0x0800), length 98: 172.16.36.80 > 172.16.159.145: ICMP echo reply, id 111, seq 0, length 64

#
root@k8s-master1:~# tcpdump -i eth0 -nnet udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:15:5d:03:0b:0a > 00:15:5d:03:0b:12, ethertype IPv4 (0x0800), length 148: 192.168.3.241.56247 > 192.168.32.105.4789: VXLAN, flags [I] (0x08), vni 4096
66:04:84:48:ab:6a > 66:8c:73:5a:90:99, ethertype IPv4 (0x0800), length 98: 172.16.159.145 > 172.16.36.80: ICMP echo request, id 111, seq 0, length 64
00:15:5d:03:0b:12 > 00:15:5d:03:0b:0a, ethertype IPv4 (0x0800), length 148: 192.168.32.105.49738 > 192.168.3.241.4789: VXLAN, flags [I] (0x08), vni 4096
66:8c:73:5a:90:99 > 66:04:84:48:ab:6a, ethertype IPv4 (0x0800), length 98: 172.16.36.80 > 172.16.159.145: ICMP echo reply, id 111, seq 0, length 64

当数据包到达对方后,先做 VXLAN 解包得到 Pod IP 地址,然后根据路由表将数据包转发给指定的网卡。

小结:不同网段的节点之间通信,需要做 VXLAN 封包

标签:Kubernetes,0.0,192.168,255.255,CrossSubnet,ff,172.16,k8s,Calico
From: https://www.cnblogs.com/cheyunhua/p/17817206.html

相关文章

  • 详解 Calico 三种模式(与 Fannel 网络对比学习)
    1.概述Calico是一个基于BGP的纯三层网络方案。它在每个计算节点都利用Linuxkernel实现了一个高效的虚拟路由器vRouter来进行数据转发。每个vRouter都通过BGP协议将本节点上运行容器的路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则。Calico保......
  • kubernetes最新版部署
    部署最新1.28.2-0版本kuberneteskubernetes集群规划主机名IP地址备注k8s-master1192.168.2.24master1k8s-master2192.168.2.25master2k8s-master3192.168.2.26master3k8s-master-lb192.168.2.36keepalived虚拟IPk8s-node1192.168.2.27node1k......
  • 云原生架构实战06 Kubernetes的核心概念
    一、有状态和无状态二、对象规约和状态spec是规约规格的意思,描述了对象的期望状态--希望对象所具有的特征,当创建Kubernetes对象是,必须提供兑现对象的规约,用来描述该对象的期望状态,以及关于对象的一些基本信息(名称)状态status:表示对象的实际状态,该属性由k8s自己维护,会通过一系列......
  • Kubernetes:kube-apiserver 和 etcd 的交互
    kubernetes:kube-apiserver系列文章:Kubernetes:kube-apiserver之scheme(一)Kubernetes:kube-apiserver之scheme(二)Kubernetes:kube-apiserver之启动流程(一)Kubernetes:kube-apiserver之启动流程(二)0.前言上几篇文章介绍了kubernetes的核心数据结构scheme......
  • kubernetes驱逐机制总结
    概述k8s的驱逐机制是指在某些场景下,如node节点notReady、node节点压力较大等,将pod从某个node节点驱逐掉,让pod的上层控制器重新创建出新的pod来重新调度到其他node节点。这里也将kube-scheduler的抢占调度纳入到了驱逐的讨论范围内,因为当调度高优先级的pod时发现资源不足,会驱逐掉n......
  • Kubernetes:kube-apiserver 之启动流程(二)
    接着Kubernetes:kube-apiserver之启动流程(一)加以介绍。1.2.2创建APIExtensionsServer创建完通用APIServer后继续创建APIExtensionsServer。func(ccompletedConfig)New(delegationTargetgenericapiserver.DelegationTarget)(*CustomResourceDefinitions,erro......
  • Kubernetes学习笔记-安装
    准备工作操作系统:Centos7.6容器环境:Docker所需工具:kubectl,minikube安装Docker#安装yum工具包yum-yinstallyum-utils#添加yum源yum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装docker社区版yuminstalld......
  • 904-907 Prometheus自动发现机制 kube-state-metrics和metrics-server Prometheus监
    一、Prometheus自动发现机制服务发现机制:为了实现自动将被监控目标添加到PermethusPrometheus数据源的配置分为静态配置和动态发现,常见为以下几类:static_configs:静态服务发现,即将配置直接写到配置文件或Configmapfile_sd_config:文件服务器发现,创建一个专门配置target的配置文......
  • 部署 calicoctl v3.26.1
    calicoctl与kubectl在Calicov3.20以前的版本中,calicoctl需要管理projectcalico.org/v3API组中的CalicoAPI资源。calicoctlCLI工具提供了对这些API的重要验证和默认设置。在Calicov3.20+以后的版本中,CalicoAPI服务器在服务器端执行默认和验证,公开相同的API语义,而不依......
  • 使用 Sealos 一键部署 Kubernetes 集群
    Sealos是一款以Kubernetes为内核的云操作系统发行版,使用户能够像使用个人电脑一样简单地使用云。与此同时,Sealos还提供一套强大的工具,可以便利地管理整个Kubernetes集群的生命周期。Sealos不仅可以一键安装一个单节点的Kubernetes开发环境,还能构建数千节点的生产高可......