总目录索引:K8s网络Calico 从入门到放弃系列

1、IPIP模式简介

IPIP模式是一种将各Node的路由之间做一个tunnel,再把网络连接起来的模式:

Calico IPIP模式_第1张图片

从字面上说,就是将一个IP数据包套在另一个IP包里,使用到了Linux提供的隧道技术。可以理解为一个基于IP层的网桥,将两个本不通的网络通过点对点连接起来。

2、准备环境

准备一套k8s环境,并安装好IPIP模式的calico网络

Calico IPIP模式_第2张图片

master节点去污点,所以工作节点有两个

分别在两台worker节点运行一个pod,简易pod的yaml文件如下

cat   tomcat-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: tomcat-1
  labels:
    app: tomcat-1
spec:
  containers:
  - name: tomcat-1
    image: tomcat:v1
    imagePullPolicy: IfNotPresent
kubectl label nodes node1 worker=node1
cat  tomcat-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: tomcat-2
  labels:
    app: tomcat-2
spec:
  nodeSelector:
    worker: node1
  containers:
  - name: tomcat-2
    image: tomcat:v1
    imagePullPolicy: IfNotPresent
运行成功后

image-20200514145652207.png

3、网络结构解析

3.1 pod网络

进入tomcat-1查看pod的网络

kubectl exec  tomcat-1 -- ip  a

Calico IPIP模式_第3张图片

tomcat-2的网络

Calico IPIP模式_第4张图片

可以看到,pod有tunl0、loopback和eth0。

3.2 Node网络

Calico IPIP模式_第5张图片

Calico IPIP模式_第6张图片

    node2中除了enss33外,多了docker0和calib9c0cd39e90@if4(下面简称为cali.90),tunl0就是Calico在IPIP模式下的隧道名称 ,而cali.90是啥子类,该设备的编号为14。让我们回到pod2中,查看pod2内的ip link:

kubectl exec tomcat-2 -- ip link show eth0

image-20200514150643688.png

eth0@if14是这里eth0连接的设备号也是14!其实这个设备就是veth pair,K8s在创建Pod的时候,会创建一个veth pair设备。设备的一端是pod1的网卡,另一端就是我们在node中看见的cali.90了

3.3 查看node路由信息

Calico IPIP模式_第7张图片

Calico IPIP模式_第8张图片

根据上节的信息,绘出当前实验网络的主要设备图

Calico IPIP模式_第9张图片

3.4 node之间连接

分别在两个node的Cali.4a、tunl0、eth0出进行抓包分析,结果如下图所示,其中Cali.4a与tunl0的ip完全一致,因此合并输出。

Calico IPIP模式_第10张图片

    按照标志的1、2、3、4来依次分析:1:pod-2中的eth0(即图中的vthe0)与Cali.4a是一对veth pair,因此,Cali.4a接收到的ip流向一定与vthe0相同,为 192.168.166.145>192.168.104.20。查看之前的node1 route表,发现有一条 :

Calico IPIP模式_第11张图片

所有发往192.168.104.0/255.255.255.192的ip报都需要通过tunl0,经过192.168.10.12作为gateway发送。因此,cali.4a的ip报会发往tunl0。

2、经过tunl0的ip报会被再封上一层ip。通过node1的route规则,会发往ens33,因此我们在ens33处的抓包结果为 192.168.10.11 > 192.168.10.12: IP 192.168.166.145>192.168.104.20

Calico IPIP模式_第12张图片

3、4其实就是1、2的逆过程,检查node2的route表即可知道流向。ens33将ipip拆封后,将流量发给tunl0,tunl0再转发给cali.90。

Calico IPIP模式_第13张图片

4、node内连接

如果是同一个node内的两个pod进行访问,通过上节的route规则就可以知道,Calico会为每一个node分配一小段网络,同时会为每个pod创建一个“入”的ip route规则。如下图所示,当从pod2访问pod3时,Cali.90是直接发出192.168.104.20-> 192.168.104.21流量的,在node2的ip route中,发往192.168.104.21的ip报直接会被转发到cali.2f,不会用到tunl0,只有在node间访问的时候才会使用tunl0进行ipip封装!

image-20200514163913189.png

Calico IPIP模式_第14张图片

Calico IPIP模式_第15张图片

参考文章:https://blog.csdn.net/u010771890/article/details/103224004