网络组件calico总结
一、Calico简介
1.1、calico特性
Calico是另一款主流的开源虚拟化网络方案, 用于为云原生应用实现互联与策略控制, 可以整合进大多数主流的编排系统, 例如Kubernetes、 Apache Mesos、 Docker和OpenStack等。 与Flannel相比,Calico的一个显著优势是对网络策略的支持, 它允许用户动态定义访问控制规则以管控进出容器的数据报文, 从而为Pod间通信按需施加安全策略。
Calico是一个三层的虚拟网络解决方案, 它把每个节点都当作虚拟路由器(vRouter) , 并把每个节点上的Pod都当作是“节点路由器”后的一个终端设备并为其分配一个IP地址。 各节点路由器通过BGP协议学习生成路由规则, 从而实现不同节点上Pod间的互联互通。
1.2、calico通信机制
BGP是互联网上一个核心的去中心化自治路由协议, 它通过维护IP路由表或“前缀”表来实现自治系统(AS) 之间的可达性, 通常作为大规模数据中心维护不同的自治系统之间路由信息的矢量路由协议。 Linux内核原生支持BGP, 因而我们可轻易把一台Linux主机配置成为边界网关。
Calico把Kubernetes集群环境中的每个节点上的Pod所组成的网络视为一个自治系统, 而每个节点也就自然由各自的Pod对象组成虚拟网络, 进而形成自治系统的边界网关。 各节点间通过BGP协议交换路由信息并生成路由规则。 但考虑到并非所有网络都能支持BGP, 而且BGP路由模型要求所有节点必须要位于同一个二层网络, 所以Calico还支持基于IPIP和VXLAN的Overlay网络模型, 它们的工作模式与Flannel的VXLAN和IPIP模型并无显著不同。
类似Flannel在VXLAN后端启用DirectRouting时的网络模型, Calico也支持混合使用路由和Overlay网络模型, BGP路由模型用于二层网络的高性能通信, IP-IP或VXLAN用于跨子网的节点间报文转发。 IP-IP协议包头非常小, 理论上它的速度要比VXLAN稍快一点,但安全性更差。需要注意的是, Calico网络提供的在线部署清单中默认使用的是IPIP隧道网络, 而非BGP或者混合模型, 因为它假设节点的底层网络不支持BGP协议。
1.3、calico架构
Calico的系统组件主要有Felix、 BGP路由反射器、 编排系统插件、BIRD和etcd存储系统等。
BGP模式下的Calico所承载的各Pod资源直接基于vRouter经由基础网络进行互联, 它非叠加、 无隧道、 不使用VRF表, 也不依赖于NAT, 因此每个工作负载都可以直接配置使用公网IP接入互联网, 当然, 也可以按需使用网络策略控制它的网络连通性。
(1) Felix
Felix是运行于各节点上守护进程, 它主要负责完成接口管理、 路由规划、 ACL规划和状态报告几个核心任务, 从而为各端点(VM或Container) 生成连接机制。
- 接口管理, 负责创建网络接口、 生成必要信息并送往内核, 以确保内核能正确处理各端点的流量, 尤其是要确保目标节点MAC能响应当前节点上各工作负载的MAC地址的ARP请求, 以及为Felix管理的接口打开转发功能。 另外, 接口管理还要监控各接口的变动以确保规则能得到正确应用。
- 路由规划, 负责为当前节点上运行的各端点在内核FIB( Forwarding Information Base) 中生成路由信息, 以保证到达当前节点的报文可正确转发给端点。
- ACL规划, 负责在Linux内核中生成ACL, 实现仅放行端点间的合规流量, 并确保流量不能绕过Calico等安全措施。
- 状态报告, 负责提供网络健康状态的相关数据, 尤其是报告由Felix管理的节点上的错误和问题。 这些报告数据会存储在etcd, 供其他组件或网络管理员使用。
( 2) 编排系统插件
编排系统插件的主要功能是将Calico整合进所在的编排系统中, 例如Kubernetes或OpenStack等。 它主要负责完成API转换, 从而让管理员和用户能够无差别地使用Calico的网络功能。 换句话说, 编排系统通常有自己的网络管理API, 相应的插件要负责将对这些API的调用转换为Calico的数据模型, 并存储到Calico的存储系统中。 因而, 编排插件的具体实现依赖于底层编排系统, 不同的编排系统有各自专用的插件。
(3)etcd存储系统利用etcd, Calico网络可实现为有明确状态( 正常或故障) 的系统, 且易于通过扩展应对访问压力的提升, 避免自身成为系统瓶颈。 另外, etcd也是Calico各组件的通信总线。
(4)BGP客户端Calico要求在每个运行着Felix的节点上同时运行一个称为BIRD的守护进程, 它是BGP协议的客户端, 负责将Felix生成的路由信息载入内核并通告给整个网络中。
(5)BGP路由反射器
Calico在每一个计算节点利用Linux内核实现了一个高效的vRouter(虚拟路由器) 进行报文转发。 每个vRouter通过BGP协议将自身所属节点运行的Pod资源的IP地址信息, 基于节点上的专用代理程序(Felix) 生成路由规则向整个Calico网络内传播。 尽管小规模部署能够直接使用BGP网格模型, 但随着节点数量(假设为N) 的增加, 这些连接的数量就会以N2的规模快速增长, 从而给集群网络带来巨大的压力。因此, 一般建议大规模的节点网络使用BGP路由反射器进行路由学习,BGP的点到点通信也就转为与中心点的单路通信模型。 另外, 出于冗余考虑, 生产实践中应该部署多个BGP路由反射器。 而对于Calico来说,BGP客户端程序除了作为客户端使用外, 也可以配置为路由反射器。
另外, Calico可将关键配置抽象成资源类型, 并允许用户按需定义资源对象以完成系统配置, 这些资源对象保存在Datastore中, Datastore可以是独立管理的etcd存储系统, 也可以是Kubernetes API封装的集群状态存储系统(即Kubernetes使用的etcd存储系统) 。 Calico专有的资源类型有十几种, 包括IPPool(IP地址池) 、 NetworkPolicy(网络策略) 、BGPConfiguration(BGP配置参数) 和FelixConfiguration(Felix配置参数) 等。 类似于Kubernetes API资源的定义, 这些资源的配置格式同样以JSON使用apiVersion、 kind、 metadata和spec等一级字段进行定义, 并能够使用calicoctl客户端工具进行管理, 也支持由kublet借助CRD进行这类资源的管理。
二、k8s环境部署calico组件
#环境准备 192.168.247.91 k8s-calico-master-01 kubeapi.calico.com 2vcpu 4G 50G ubuntu20.04 192.168.247.94 k8s-calico-node-01 2vcpu 4G 50G ubuntu20.04 192.168.247.95 k8s-calico-node-02 2vcpu 4G 50G ubuntu20.04 #关闭swap swapoff -a && sed -i 's@/swap.img@#/swap.img@g' /etc/fstab #关闭防火墙 ufw disable && ufw status #配置时间同步 apt-get update && apt install chrony -y cat > /etc/chrony/chrony.conf <<EOF server ntp.aliyun.com iburst stratumweight 0 driftfile /var/lib/chrony/drift rtcsync makestep 10 3 bindcmdaddress 127.0.0.1 bindcmdaddress ::1 keyfile /etc/chrony.keys commandkey 1 generatecommandkey logchange 0.5 logdir /var/log/chrony EOF systemctl restart chrony #安装并启用docker apt -y install apt-transport-https ca-certificates curl software-properties-common curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" apt update && apt install docker-ce -y #配置docker加速 cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://reg-mirror.qiniu.com", "https://registry.docker-cn.com", "https://a7h8080e.mirror.aliyuncs.com" ], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "200m" }, "storage-driver": "overlay2" } EOF systemctl restart docker docker info #查看docker版本及加速是否生效 #安装cri-dockerd curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64.deb apt install ./cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64.deb -y #安装kubelet、kubeadm、kubectl apt update && apt install -y apt-transport-https curl curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-get update && apt install -y kubelet kubeadm kubectl systemctl enable kubelet #整合kubelet和cri-dockerd # vim /usr/lib/systemd/system/cri-docker.service # cat /usr/lib/systemd/system/cri-docker.service [Unit] Description=CRI Interface for Docker Application Container Engine Documentation=https://docs.mirantis.com After=network-online.target firewalld.service docker.service Wants=network-online.target Requires=cri-docker.socket [Service] Type=notify #ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target systemctl daemon-reload && systemctl restart cri-docker #配置kubelet mkdir /etc/sysconfig/ cat > /etc/sysconfig/kubelet <<EOF KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock" EOF
#初始化master # kubeadm config images list #查看所需的容器镜像 registry.k8s.io/kube-apiserver:v1.25.3 registry.k8s.io/kube-controller-manager:v1.25.3 registry.k8s.io/kube-scheduler:v1.25.3 registry.k8s.io/kube-proxy:v1.25.3 registry.k8s.io/pause:3.8 registry.k8s.io/etcd:3.5.4-0 registry.k8s.io/coredns/coredns:v1.9.3#拉取镜像 # kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock #拉取镜像 #初始化集群 kubeadm init --control-plane-endpoint="kubeapi.calico.com" \ --kubernetes-version=v1.25.3 \ --pod-network-cidr=10.200.0.0/16 \ --service-cidr=10.100.0.0/12 \ --token-ttl=0 \ --cri-socket unix:///run/cri-dockerd.sock \ --upload-certs #master添加 kubeadm join kubeapi.calico.com:6443 --token z4mff1.o81fx972z3itwsja \ --discovery-token-ca-cert-hash sha256:75bf3bbd22ceee393014359131b7238074671d1d259704610c7691cf7edf96b3 \ --control-plane --certificate-key ca96cb8c0a0d4e33f8561155419dec8c42d7c83c361b3f6dbc0848c2de203d78 \ --cri-socket unix:///run/cri-dockerd.sock #node添加 kubeadm join kubeapi.calico.com:6443 --token z4mff1.o81fx972z3itwsja \ --discovery-token-ca-cert-hash sha256:75bf3bbd22ceee393014359131b7238074671d1d259704610c7691cf7edf96b3 \ --cri-socket unix:///run/cri-dockerd.sock [root@k8s-calico-master-01 ~]# mkdir -p $HOME/.kube [root@k8s-calico-master-01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@k8s-calico-master-01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@k8s-calico-master-01 ~]# kubectl get node -owide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-calico-master-01 NotReady control-plane 2m41s v1.25.3 192.168.247.91 <none> Ubuntu 20.04.3 LTS 5.4.0-122-generic docker://20.10.21 k8s-calico-node-01 NotReady <none> 50s v1.25.3 192.168.247.94 <none> Ubuntu 20.04.3 LTS 5.4.0-122-generic docker://20.10.21 k8s-calico-node-02 NotReady <none> 46s v1.25.3 192.168.247.95 <none> Ubuntu 20.04.3 LTS 5.4.0-122-generic docker://20.10.21 [root@k8s-calico-master-01 ~]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-565d847f94-nd5fm 0/1 Pending 0 2m29s kube-system coredns-565d847f94-tnqxt 0/1 Pending 0 2m29s kube-system etcd-k8s-calico-master-01 1/1 Running 0 2m41s kube-system kube-apiserver-k8s-calico-master-01 1/1 Running 0 2m41s kube-system kube-controller-manager-k8s-calico-master-01 1/1 Running 0 2m42s kube-system kube-proxy-p65xq 1/1 Running 0 55s kube-system kube-proxy-rjkz7 1/1 Running 0 51s kube-system kube-proxy-zlwlt 1/1 Running 0 2m29s kube-system kube-scheduler-k8s-calico-master-01 1/1 Running 0 2m41s [root@k8s-calico-master-01 ~]# #下载calico网络组件安装包 wget https://github.com/projectcalico/calico/archive/refs/tags/v3.24.4.zip
unzip v3.24.4.zip cd calico-3.24.4/manifests [root@k8s-calico-master-01 manifests]# kubectl apply -f calico.yaml poddisruptionbudget.policy/calico-kube-controllers created serviceaccount/calico-kube-controllers created serviceaccount/calico-node created configmap/calico-config created customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created clusterrole.rbac.authorization.k8s.io/calico-node created clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created clusterrolebinding.rbac.authorization.k8s.io/calico-node created daemonset.apps/calico-node created deployment.apps/calico-kube-controllers created [root@k8s-calico-master-01 manifests]# [root@k8s-calico-master-01 manifests]# kubectl get node -owide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-calico-master-01 Ready control-plane 23m v1.25.3 192.168.247.91 <none> Ubuntu 20.04.3 LTS 5.4.0-122-generic docker://20.10.21 k8s-calico-node-01 Ready <none> 22m v1.25.3 192.168.247.94 <none> Ubuntu 20.04.3 LTS 5.4.0-122-generic docker://20.10.21 k8s-calico-node-02 Ready <none> 22m v1.25.3 192.168.247.95 <none> Ubuntu 20.04.3 LTS 5.4.0-122-generic docker://20.10.21 [root@k8s-calico-master-01 manifests]# [root@k8s-calico-master-01 manifests]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-f79f7749d-lkr96 1/1 Running 0 6m51s kube-system calico-node-5kl79 1/1 Running 0 6m51s kube-system calico-node-6fjqj 1/1 Running 0 6m51s kube-system calico-node-7bz4x 1/1 Running 0 6m51s kube-system coredns-565d847f94-m54rw 1/1 Running 0 17s kube-system coredns-565d847f94-mqlk9 1/1 Running 0 21m kube-system etcd-k8s-calico-master-01 1/1 Running 0 22m kube-system kube-apiserver-k8s-calico-master-01 1/1 Running 0 21m kube-system kube-controller-manager-k8s-calico-master-01 1/1 Running 0 21m kube-system kube-proxy-76zhv 1/1 Running 0 20m kube-system kube-proxy-8kl86 1/1 Running 0 20m kube-system kube-proxy-wl9cl 1/1 Running 0 21m kube-system kube-scheduler-k8s-calico-master-01 1/1 Running 0 22m [root@k8s-calico-master-01 manifests]# [root@k8s-calico-master-01 manifests]# kubectl create deployment nginx --image=nginx:1.23.2-alpine --replicas=3 deployment.apps/nginx created [root@k8s-calico-master-01 manifests]# [root@k8s-calico-master-01 manifests]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE default nginx-5cd78c5d7-4nl9q 1/1 Running 0 2m23s default nginx-5cd78c5d7-57pmr 1/1 Running 0 2m23s default nginx-5cd78c5d7-96qf2 1/1 Running 0 2m23s kube-system calico-kube-controllers-f79f7749d-lkr96 1/1 Running 0 9m52s kube-system calico-node-5kl79 1/1 Running 0 9m52s kube-system calico-node-6fjqj 1/1 Running 0 9m52s kube-system calico-node-7bz4x 1/1 Running 0 9m52s kube-system coredns-565d847f94-m54rw 1/1 Running 0 3m18s kube-system coredns-565d847f94-mqlk9 1/1 Running 0 24m kube-system etcd-k8s-calico-master-01 1/1 Running 0 25m kube-system kube-apiserver-k8s-calico-master-01 1/1 Running 0 24m kube-system kube-controller-manager-k8s-calico-master-01 1/1 Running 0 24m kube-system kube-proxy-76zhv 1/1 Running 0 23m kube-system kube-proxy-8kl86 1/1 Running 0 23m kube-system kube-proxy-wl9cl 1/1 Running 0 24m kube-system kube-scheduler-k8s-calico-master-01 1/1 Running 0 25m [root@k8s-calico-master-01 manifests]#
[root@k8s-calico-master-01 manifests]# kubectl create service nodeport nginx --tcp=80:80 service/nginx created [root@k8s-calico-master-01 manifests]#
[root@k8s-calico-master-01 manifests]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 25m nginx NodePort 10.105.22.18 <none> 80:30616/TCP 15s [root@k8s-calico-master-01 manifests]#
三、calico通信流程
3.1、calico网络示意图
3.2、创建net-test1、net-test2测试pod
[root@k8s-calico-master-01 ~]# kubectl run net-test1 --image=centos:7.9.2009 sleep 360000 pod/net-test1 created [root@k8s-calico-master-01 ~]# [root@k8s-calico-master-01 ~]# kubectl run net-test2 --image=centos:7.9.2009 sleep 360000 pod/net-test2 created [root@k8s-calico-master-01 ~]# [root@k8s-calico-master-01 ~]# kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES net-test1 1/1 Running 0 102s 10.200.226.132 k8s-calico-node-01 <none> <none> net-test2 1/1 Running 0 2m14s 10.200.179.132 k8s-calico-node-02 <none> <none> nginx-5cd78c5d7-4nl9q 1/1 Running 0 95m 10.200.226.130 k8s-calico-node-01 <none> <none> nginx-5cd78c5d7-57pmr 1/1 Running 0 95m 10.200.179.130 k8s-calico-node-02 <none> <none> nginx-5cd78c5d7-96qf2 1/1 Running 0 95m 10.200.226.131 k8s-calico-node-01 <none> <none> [root@k8s-calico-master-01 ~]#
提前获取对应的mac地址
net-test1 eth0 96:ea:b8:21:17:46 10.200.226.132/32
net-test2 eth0 16:92:30:1c:d5:34 10.200.179.132/32
k8s-calico-node-01
eth0 00:0c:29:8e:23:06
cali073b411309a ee:ee:ee:ee:ee:ee
k8s-calico-node-02
eth0 00:0c:29:f1:07:cb
cali2b2e7c9e43e ee:ee:ee:ee:ee:ee
3.3、在net-test1--ping-->net-test2
[root@net-test1 /]# curl 10.200.179.132 curl: (7) Failed connect to 10.200.179.132:80; Connection refused [root@net-test1 /]# curl 10.200.179.132 curl: (7) Failed connect to 10.200.179.132:80; Connection refused [root@net-test1 /]# curl 10.200.179.132 curl: (7) Failed connect to 10.200.179.132:80; Connection refused [root@net-test1 /]# curl 10.200.179.132 curl: (7) Failed connect to 10.200.179.132:80; Connection refused [root@net-test1 /]# curl 10.200.179.132 curl: (7) Failed connect to 10.200.179.132:80; Connection refused [root@net-test1 /]# curl 10.200.179.132 curl: (7) Failed connect to 10.200.179.132:80; Connection refused [root@net-test1 /]# ping 10.200.179.132 PING 10.200.179.132 (10.200.179.132) 56(84) bytes of data. 64 bytes from 10.200.179.132: icmp_seq=1 ttl=62 time=0.745 ms 64 bytes from 10.200.179.132: icmp_seq=2 ttl=62 time=0.929 ms 64 bytes from 10.200.179.132: icmp_seq=3 ttl=62 time=0.943 ms 64 bytes from 10.200.179.132: icmp_seq=4 ttl=62 time=0.875 ms 64 bytes from 10.200.179.132: icmp_seq=5 ttl=62 time=0.975 ms 64 bytes from 10.200.179.132: icmp_seq=6 ttl=62 time=0.765 ms 64 bytes from 10.200.179.132: icmp_seq=7 ttl=62 time=0.950 ms 64 bytes from 10.200.179.132: icmp_seq=8 ttl=62 time=0.880 ms 64 bytes from 10.200.179.132: icmp_seq=9 ttl=62 time=0.996 ms 64 bytes from 10.200.179.132: icmp_seq=10 ttl=62 time=1.16 ms 64 bytes from 10.200.179.132: icmp_seq=11 ttl=62 time=0.984 ms 64 bytes from 10.200.179.132: icmp_seq=12 ttl=62 time=1.10 ms 64 bytes from 10.200.179.132: icmp_seq=13 ttl=62 time=0.874 ms 64 bytes from 10.200.179.132: icmp_seq=14 ttl=62 time=1.09 ms 64 bytes from 10.200.179.132: icmp_seq=15 ttl=62 time=1.24 ms 64 bytes from 10.200.179.132: icmp_seq=16 ttl=62 time=0.674 ms 64 bytes from 10.200.179.132: icmp_seq=17 ttl=62 time=1.09 ms 64 bytes from 10.200.179.132: icmp_seq=18 ttl=62 time=0.764 ms 64 bytes from 10.200.179.132: icmp_seq=19 ttl=62 time=1.08 ms 64 bytes from 10.200.179.132: icmp_seq=20 ttl=62 time=1.02 ms 64 bytes from 10.200.179.132: icmp_seq=21 ttl=62 time=0.988 ms 64 bytes from 10.200.179.132: icmp_seq=22 ttl=62 time=0.985 ms 64 bytes from 10.200.179.132: icmp_seq=23 ttl=62 time=0.958 ms 64 bytes from 10.200.179.132: icmp_seq=24 ttl=62 time=1.02 ms 64 bytes from 10.200.179.132: icmp_seq=25 ttl=62 time=1.05 ms 64 bytes from 10.200.179.132: icmp_seq=26 ttl=62 time=1.02 ms 64 bytes from 10.200.179.132: icmp_seq=27 ttl=62 time=1.18 ms 64 bytes from 10.200.179.132: icmp_seq=28 ttl=62 time=0.991 ms 64 bytes from 10.200.179.132: icmp_seq=29 ttl=62 time=0.960 ms 64 bytes from 10.200.179.132: icmp_seq=30 ttl=62 time=0.784 ms 64 bytes from 10.200.179.132: icmp_seq=31 ttl=62 time=0.859 ms ^C --- 10.200.179.132 ping statistics --- 31 packets transmitted, 31 received, 0% packet loss, time 30137ms rtt min/avg/max/mdev = 0.674/0.967/1.247/0.131 ms [root@net-test1 /]# #node-01节点抓包 tcpdump -nn -vvv -i eth0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 -w 01.calico-eth0-out.pcap tcpdump -nn -vvv -i tunl0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 -w 02.calico-tunl0-out.pcap tcpdump -nn -vvv -i cali073b411309a -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 -w 03.calico-cali073b411309a-out.pcap #node-02节点抓包 tcpdump -nn -vvv -i eth0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 -w 04.calico-eth0-in.pcap tcpdump -nn -vvv -i tunl0 -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 -w 05.calico-tunl0-in.pcap tcpdump -nn -vvv -i cali2b2e7c9e43e -vvv -nn ! port 22 and ! port 2379 and ! port 6443 and ! port 10250 and ! arp and ! port 53 -w 06.calico-cali2b2e7c9e43e-in.pcap
3.4、通过tcpdump抓包
分别在node-01、node-02节点抓取calico、tunl0、eth0,保存并通过Wireshark进行分析
1、抓取本机net-test1 pod对应的cailco端口
此时报文中源IP为pod的eth0的ip,源mac 为pod的eth0的mac, 目的IP为10.200.179.132,下一跳为网关地址169.254.1.1 ,目的mac为ee:ee:ee:ee:ee:ee(默认网关169.254.1.1的MAC地址),源端口随机产生目的端口80.
2、报文到达tunl0
此时报文的源IP为源pod IP, 目的IP为目的pod IP。 没有MAC 地址。
3、报文到达源宿主机eth0
此时报文为IPinIP格式, 外层为源宿主机和目的宿主机的源MAC目的MAC、 源IP及目的IP, 内部为源pod IP
4、报文到达目的宿主机的eth0
报文到达目的宿主机eth0, 此时收到的是源宿主机的IPinIP报文, 外层为源宿主机和目的宿主机的源MAC目的MAC、 源IP及目的IP, 内部为源pod IP及目的pod的IP, 没有使用MAC地址, 解封装后发现是去往10.200.179.132.
5、报文到达目的宿主机tunl0
6、报文到达目的Pod与目的宿主机对应的网卡cali2b2e7c9e43e
报文到达目的宿主机cali2b2e7c9e43e网卡。 此时源IP为源Pod IP, 源MCA为tunl0 MAC, 目的IP为目的Pod IP, 目的MAC为目的Pod MAC, 随后报文被转发被目的MAC(目的Pod)