kubernetes网络通信方式有:
- 容器间的通信 : pod内的容器通信 通过(lo)设备
- Pod之间的通信 :pod IP <-----> pod IP ,K8S 要求所有的 pod 都必须直接通信
- Pod与Service之间的通信 :podIP <-----> ClusterIP
- Service与集群外部的通信 ClusterIP <-----> 集群外部
CNI插件:
- flannel
- calico
- canel
- kube-route
解决方案:
- 虚拟网桥
- 多路复用 MacVLAN
- 硬件交换 SR-IOV
Flannel
Flannel本身是一个框架,真正提供网络功能是他的后端实现。目前支持三种后端实现:
- VXLAN
- host-gw
- UDP
查看 flannel
kubectl get ds -n kube-system -o wide
查看对应的 configmap
kubectl get configmap -n kube-system
VXLAN+DriectRouting 模式
VXLAN+DriectRouting是首先采用直接路由的方式,如果不可以就使用VXLAN的方式。
Flannel的默认配置是VXLAN,但是我们可以配置多个插件协作,接下来我们就使用VXLAN+DriectRouting这两个插件协作。
cd ~ ; mkdir flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 添加一个配置
vi kube-flannel.yml
...
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan", # 注意,这里有个, 逗号
"Directrouting": true # 启动 Directrouting
}
}
# 查看 ds
kubectl get ds -n kube-system
# 删除重建 flannel
kubectl delete ds kube-flannel-ds-amd64 -n kube-system
kubectl get pods -n kube-system -w
kubectl apply -f kube-flannel.yml
# 在 node1,node2 上执行 ip route show ,这里以 node1 为例子
[root@node1 ~]# ip route show
default via 192.168.0.254 dev eth0 proto static metric 100
10.244.0.0/24 via 192.168.0.205 dev eth0
10.244.1.0/24 dev cni0 proto kernel scope link src 10.244.1.1
10.244.2.0/24 via 192.168.0.207 dev eth0 # 网络到达 node2 使用 eth0 网卡即成功
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.206 metric 100