k8s网络插件-flannel
来源: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
test.yaml
可以看点在每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