赞
踩
bridge:容器的默认网络
joined:使用别的容器的网络空间
open:容器直接共享宿主机的网络空间
none:不使用网络空间
容器间通信:同一个Pod内的多个容器间的通信
Pod通信:Pod IP <=> Pod IP
Pod与Service通信: Pod IP <=> ClusterIP
Service与集群外部客户端的通信
kubernetes集群内的网络需要借助网络插件来解决;
CNI:(Container Network Interface)常用的网络插件有:
flannel (部署简单,支持网络地址分配,但不支持网络策略)
calico (部署麻烦,支持网络地址分配,也支持网络策略,而且支持基于BGP协议实现三层网络路由)
canel (flannel与calico的组合)
kube-router (由kubernetes研发的网络插件)
flannel
支持多种后端
vxlan:
flannel默认使用VxLAN方式来作为后端网络传输方式的;使用网络叠加方式,通过隧道(主机网卡中的flannel.x,默认为10.244.0.0 255.255.255.255)专门封装隧道协议报文的,而且一旦后端存在被分配到网络地址的pod时,会创建一个cni接口,而且cni的网络地址与flannel在同一网段。可以理解为类似于四层隧道的协议。VxLAN因为要进行封装多层报文,是额外开销,所以使得性能相对于其他方式较弱一点,但好在可以单独管理一个网络,而且物理网络之间是彼此不相干扰的。
Dirextrouting:
若集群过于庞大,则避免不了跨网段通信,或者既想使用VxLAN可以跨网段的特性,又想host-gw的高性能,我们可以设置为Directrouting,使其同网段的用host-gw,不同网段的自动使用VxLAN网络叠加。
把主机自己的网络接口当作网关使用,使Pod的网络地址能通过此接口对外进行传递信息。
报文通过路由到达对方,而不会通过隧道网络叠加,所以这种比VxLAN性能高一点。
但是这种方式要求每个节点必须工作在同一网络中,不推荐,只能在二层网络中,不支持跨网络,如果有成千上万的Pod,容易产生广播风暴
查看CNI使用的网络插件(master)
[root@master ~]# cat /etc/cni/net.d/10-flannel.conflist { "name": "cbr0", "plugins": [ { "type": "flannel", "delegate": { "hairpinMode": true, "isDefaultGateway": true } }, { "type": "portmap", "capabilities": { "portMappings": true #端口映射 } } ] }
注意:使用adm安装的k8s的插件flannel是使用的容器的形式
1、找到flannel的configmap(该文件在“Kubernetes安装部署Master、Node”中的“14、安装 pod 网络附加组件”章节中有描述,可下载到本地即可修改,uat环境在:/srv/k8s-deploy/kubeadm_v1.11.0/kube-flannel.yml),
查看当前flannel的工作模式:
kubectl get cm kube-flannel-cfg -n kube-system -o yaml
找到如下段:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
[root@k8s-node1 ~]# ip route show
default via 172.16.1.1 dev ens33 proto static metric 100
10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink
10.244.2.0/24 dev cni0 proto kernel scope link src 10.244.2.1
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.16.1.0/24 dev ens33 proto kernel scope link src 172.16.1.103 metric 100
可以看到,10.244.0.0<–>10.244.1.0是通过flannel.1网卡通信,不管是同网段还是不同网段,显然是通过隧道封装过的。
[root@k8s-node1 ~]# ip addr s flannel.1
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN
link/ether 7e:ce:07:7e:b9:7d brd ff:ff:ff:ff:ff:ff
inet 10.244.7.0/32 scope global flannel.1
valid_lft forever preferred_lft forever
inet6 fe80::7cce:7ff:fe7e:b97d/64 scope link
valid_lft forever preferred_lft forever
1、在kube-flannel.yaml中找到如下一段,修改配置清单的net-conf.json段,加入Directrouting
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan",
"Directrouting": true #默认没有这段,若要修改,必须重装flannel插件!!!
}
2、在master上部署修改过的flannel插件:
[root@dev15 kubeadm_v1.11.0]#kubectl delete -f kube-flannel.yaml
[root@dev15 kubeadm_v1.11.0]#kubectl apply -f kube-flannel.yaml
3、查看节点路由表:
[root@dev15 kubeadm_v1.11.0]#ip route show
default via 172.16.1.1 dev ens33 proto static metric 100
10.244.0.0/24 via 172.16.1.100 dev ens33
10.244.1.0/24 via 172.16.1.102 dev ens33
10.244.2.0/24 dev cni0 proto kernel scope link src 10.244.2.1
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.16.1.0/24 dev ens33 proto kernel scope link src 172.16.1.103 metric 100
可以看出,10.244.0.0<–>10.244.1.0是通过宿主机网卡ens33通信的,明显看出是直接路由,同网段的用cni0接口直接转发,不同网段用ens33接口直接路由。
第一步,在master节点删除flannel
[root@dev15 kubeadm_v1.11.0]#kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml(文件有可能在本地,有可能用网上的,这里用的网上的,最好下载到本地)
第二步,在node节点清理flannel网络留下的文件(最好按照现有分段一段段执行,全部执行有问题)
systemctl stop kubelet
systemctl stop docker
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
systemctl start docker
systemctl restart kubelet
第一步,在master节点删除flannel
[root@dev15 kubeadm_v1.11.0]#kubectl delete node **nodename**
第二步,重置node,并清理flannel网络留下的文件(最好按照现有分段一段段执行,全部执行有问题)
kubeadm reset systemctl stop kubelet systemctl stop docker rm -rf /var/lib/cni/ rm -rf /etc/cni/net.d/* rm -rf /var/lib/kubelet/* ifconfig cni0 down ifconfig flannel.1 down ifconfig docker0 down ip link delete cni0 ip link delete flannel.1 systemctl start docker systemctl restart kubelet
第三步、将node节点挂载到master上(这个是master生成的token)
kubeadm join 172.26.48.4:6443 --token qc1eie.tviq9mcibgdssqgm \
--discovery-token-ca-cert-hash sha256:4502298f771b00714e6f65e9a34a8f5651094aac917f1d42e9bcaf20658525bf
如果 token 失效或者没有token,请在master机器上运行如下命令获得token
kubeadm token create --print-join-command
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。