來源:kubernetes進階實戰 馬永亮注
flannel在每個主機節點運行flannel的二進制代理程序,它負責從預留的網絡中按照指定或者默認的掩碼長度為當前節點分配一個子網,並將信息存儲在etcd中。flannel使用后端的容器網絡機制轉發跨節點的POD報文,目前主流的后端由vxlan、host-gw
flannel下載:https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
實驗環境:
kube-master01:10.0.2.200
kube-node01:10.0.2.201
kube-node02:10.0.2.202
kube-node03:10.0.2.203
kube-node04:10.0.1.204
1、vxlan
默認配置,使用linux內核中的vxlan模塊封裝報文,以overlay網絡模型支持跨節點的pod通信;同時該后端同樣支持直接路由模式,該模式下位於同一網段的的node節點之上的pod通信直接通過路由發送,跨網段的node間通信仍然需要vxlan轉發。flanneld監聽udp端口8472端口 發送數據包
1.1、 默認配置
修改kube-flannel.yaml文件中的configmap,網段配置為計划的網段和需要用戶k8s的網口:
在apply之前路由信息:
apply之后在masterhenode都可以看到,到其他網段的都會經過生成的flannel.1接口
新建pod測試:

kind: Namespace
apiVersion: v1
metadata:
name: test
namespace: test
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: test
namespace: test
spec:
replicas: 5
selector:
matchLabels:
app: demo
template:
metadata:
name: demo
namespace: test
labels:
app: demo
spec:
containers:
- name: demov10
image: ikubernetes/demoapp:v1.0
imagePullPolicy: Always
ports:
- name: demov10
containerPort: 80
protocol: TCP
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 50m
memory: 50Mi
可以看點在每node節點生成了cni0(用作node上的pod通信,跨節點通信還需要通過flannel.1封裝)和veth接口(與每個pod的網口一一對對應,有幾個pod就在主機生成幾個vet
1.2.1、同一節點POD通信
node4上的兩個pod:
在test-b9c4d648-gl9t5上訪問test-b9c4d648-t7wxk,只在cni0接口能看到通信報文,flannel無報文
1.2.2、跨節點通信
在test-b9c4d648-4q7rp上訪問test-b9c4d648-t7wxk,可以看到跨網段訪問,還會經過flannel.1封裝
1.3、Directingrouting
該模式下,當節點在同一網段時POD間通信直接通過節點二層網絡通信,當節點跨網段時才啟用vxlan
配置:修改configmap kube-flannel-cfg,增加 "Directrouting": true,然后刪除flannel pod,重建flannel pod生效,可以看到,當node在同一網段時,通信直接通過節點IP,node4和其他節點不在同一網段,使用通過flannel.1 vxlan通信
2、host-gw
host-gw通過類似與直接路由,但是要求所有節點必須在同一網段,通過路由通信,由於不會通過vxlan,通信不會通過flannel.1
配置:修改configmap kube-flannel-cfg
可以看到沒有到node4的pod網段的路由,網絡也不通
3、卸載flannel
管理節點
kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
ip link set dev flannel.1 down
ip link delete flannel.1
systemctl restart kubelet
node節點
清理flannel網絡留下的文件,然后重啟kubelet

ip link set dev cni0 down ip link delete cni0 ip link set dev flannel.1 down ip link delete flannel.1 rm -rf /var/lib/cni/ rm -f /etc/cni/net.d/* systemctl restart kubelet