多个网络层面的需求
一开始为k8s集群搭建了calico网络,所有的容器都用calico对应的网卡进行通信。为了实现网络监控的清爽,想把管理组件,例如日志、统计、监控等组件挪到另外一个网络。于是产生一个想法把管理网和业务网分离,这里采用相对成熟的multus来粘合calico和flannel网络。让所有的业务容器走calico网络,让管理容器走flannel网络。其实hostlocal模式的容器也是走的管理网。
首先搭建一个默认网络这里把calico作为默认网络,因此需要先搭建好calico网络,参见之前的博文如何搭建calico网络。
创建flannel集群对Kubernetes v1.17+ 集群使用如下命令
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml该命令会在每个节点创建一个flannel容器
[root@k8s-master multus]# kubectl get pods -o wide -A NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system calico-kube-controllers-65d7476764-qrp8r 1/1 Running 0 152m 10.200.113.137 k8s-node <none> <none> kube-system calico-node-b62rz 1/1 Running 0 152m 192.168.31.128 k8s-master <none> <none> kube-system calico-node-mchl8 1/1 Running 0 152m 192.168.31.129 k8s-node <none> <none> kube-system coredns-7ff77c879f-j89ch 1/1 Running 1 75d 10.200.113.131 k8s-node <none> <none> kube-system coredns-7ff77c879f-x47fq 1/1 Running 1 75d 10.200.235.194 k8s-master <none> <none> kube-system etcd-k8s-master 1/1 Running 3 257d 192.168.31.128 k8s-master <none> <none> kube-system kube-apiserver-k8s-master 1/1 Running 4 72d 192.168.31.128 k8s-master <none> <none> kube-system kube-controller-manager-k8s-master 1/1 Running 0 72d 192.168.31.128 k8s-master <none> <none> kube-system kube-flannel-ds-mqkmc 1/1 Running 0 2m12s 192.168.31.128 k8s-master <none> <none> kube-system kube-flannel-ds-x62mj 1/1 Running 0 2m12s 192.168.31.129 k8s-node <none> <none>这里有两点需要注意:
flannel会自动读取k8s-api-server的cluster-cidr信息,也就是/etc/kubernetes/manifests/kube-controller-manager.yaml 文件中的--cluster-cidr参数,要注意这个地址的有效性,不能和其他网络的有重叠。例如不能和calico网络重叠也不能和--service-cluster-ip-range重叠。
如果想要flannel绑定指定网卡,可以修改kube-flannel.yml文件,添加--iface-regex或者--iface相关参数,如下所示:
args: - --ip-masq - --kube-subnet-mgr - --iface-regex=172.18.(.*) //注意等号两边不能有空格,后面的正则表达式不用加引号 - --iface=eth0 //如果网卡名固定的话,最好用这句配置,并且iface可以覆盖iface-regex创建完成后,查看flannel分配给容器的IP地址段:
[root@k8s-master multus]# kubectl exec -ti -n kube-system kube-flannel-ds-mqkmc cat /run/flannel/subnet.env kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead. FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.0.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true另外,查看flannel绑定的网卡:
[root@k8s-master ~]# ip -d link show flannel.1 18: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default link/ether ba:ad:f0:ca:4e:6d brd ff:ff:ff:ff:ff:ff promiscuity 0 vxlan id 1 local 192.168.31.128 dev ens33 srcport 0 0 dstport 8472 nolearning ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535可以看到vtep设备flannel.1绑定的网卡是ens33,flannel.1会把数据包封装成vxlan数据包从ens33发送出去。
使用multus把calico和flannel粘合起来multus可以管理多个网络插件,可以通过设置相关参数使得容器使用多个网卡而且每个网卡使用一中网络插件,也可以指定使用一种网络。如果什么都不指定就使用默认网络。
创建multus集群 kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/images/multus-daemonset.yml该命令会创建multus集群,每个节点创建一个multus容器。在任意一个节点上查看cni配置文件,如下所示:
[root@k8s-master ~]# ls /etc/cni/net.d/ 00-multus.conf 10-calico.conflist 10-flannel.conflist calico-kubeconfig multus.d [root@k8s-master ~]# [root@k8s-master ~]# cat /etc/cni/net.d/00-multus.conf { "cniVersion": "0.3.1", "name": "multus-cni-network", "type": "multus", "capabilities": {"portMappings": true, "bandwidth": true}, "kubeconfig": "/etc/cni/net.d/multus.d/multus.kubeconfig", "delegates": [ { "name": "k8s-pod-network", "cniVersion": "0.3.1", "plugins": [ { "type": "calico", "log_level": "info", "log_file_path": "/var/log/calico/cni/cni.log", "datastore_type": "kubernetes", "nodename": "k8s-master", "mtu": 0, "ipam": { "type": "calico-ipam" }, "policy": { "type": "k8s" }, "kubernetes": { "kubeconfig": "/etc/cni/net.d/calico-kubeconfig" } }, { "type": "portmap", "snat": true, "capabilities": {"portMappings": true} }, { "type": "bandwidth", "capabilities": {"bandwidth": true} } ] } ] } [root@k8s-master ~]#