多个网络层面的需求

一开始为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>

这里有两点需要注意:

  1. flannel会自动读取k8s-api-server的cluster-cidr信息,也就是/etc/kubernetes/manifests/kube-controller-manager.yaml 文件中的--cluster-cidr参数,要注意这个地址的有效性,不能和其他网络的有重叠。例如不能和calico网络重叠也不能和--service-cluster-ip-range重叠。
  2. 如果想要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 ~]#

可以看出cni配置文件中有calico、flannel和multus.其中谁的序号小就用谁,这里使用multus,而multus配置文件中写明使用的默认网络插件是calico.

创建使用calico网络的容器

因为multus使用的默认网络是calico,因此像往常一样不用修改任何文件创建出来的容器就是使用的calico网络插件。当然不能在yaml文件中指定使用hostlocal网络"hostNetwork: true".

创建使用flannel网络的容器

首先创建一个资源:

cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: flannel-conf
spec:
config: '{
"cniVersion": "0.3.0",
"type": "flannel",
"delegate": {
"isDefaultGateway": true
}
}'
EOF

使用命令kubectl get networkattachmentdefinition.k8s.cni.cncf.io -A查看该资源。

然后在容器中添加annotation:

[root@k8s-master multus]# cat flannel-pod-128.yml
---
apiVersion: v1
kind: Pod
metadata:
name: flannelpod128
namespace: net
annotations:
v1.multus-cni.io/default-network: default/flannel-conf
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-master
containers:
- name: samplepod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: dougbtv/centos-network
ports:
- containerPort: 80
[root@k8s-master multus]#

使用以上yaml文件就可以创建出一个使用flannel网络的容器。

创建一个双网卡容器,分别使用calico和flannel

默认网络是calico,如果再指定使用一个网络那么就会在容器里面创建两个网卡。例如,使用如下的yaml文件,创建pod

[root@k8s-master multus]# cat example.yml
apiVersion: v1
kind: Pod
metadata:
name: samplepod
annotations:
k8s.v1.cni.cncf.io/networks: default/flannel-conf
spec:
containers:
- name: samplepod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: dougbtv/centos-network
[root@k8s-master multus]#

当容器运行起来之后可以看到,容器里面有两张网卡,其中eth0是calico管理的,net1是flannel管理的:

[root@k8s-master multus]# kubectl get pods  -o wide -A|grep sample
default samplepod 1/1 Running 0 14s 10.200.235.196 k8s-master <none> <none>
[root@k8s-master multus]# kubectl exec -ti -n default samplepod ip a
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP
link/ether 1a:c9:1e:a8:67:b6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.200.235.196/32 brd 10.200.235.196 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::18c9:1eff:fea8:67b6/64 scope link
valid_lft forever preferred_lft forever
6: net1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP
link/ether 66:b7:a4:91:ec:50 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.244.0.4/24 brd 10.244.0.255 scope global net1
valid_lft forever preferred_lft forever
inet6 fe80::64b7:a4ff:fe91:ec50/64 scope link
valid_lft forever preferred_lft forever
[root@k8s-master multus]#

网络连通性

这里使用了calico和flannel两种网络插件,数据通路不一样,但是跨节点都是相互通的,如下所示:

[root@k8s-deploy4-master-1 ~]# kubectl get pods  -o wide -A|grep pod
net calicopod 1/1 Running 2 45h 10.8.19.213 k8s-deploy4-worker-1 <none> <none>
net calicopodmaster 1/1 Running 0 45h 10.8.18.133 k8s-deploy4-master-1 <none> <none>
net flannelpod 1/1 Running 1 45h 192.168.1.53 k8s-deploy4-worker-1 <none> <none>
net flannelpodmaster 1/1 Running 0 45h 192.168.0.24 k8s-deploy4-master-1 <none> <none>

这四个Pod两两之间是可以ping通的,但是在有些环境中数据包跨节点后到达flannel绑定的网卡或者calico绑定的网卡就不再转发给容器的网卡了,也是出现过的。按照本地路由是应该转发给容器的网卡的,但就是不转发。说明这种情况网卡有异常,为了谨慎起见,不建议calico和flannel网络之间有通信,而使之起到网络分流的作用。

使用multus实现管理网和业务网分离——calico和flannel共存的更多相关文章

  1. React.js 官网入门教程 分离文件 操作无法正常显示HelloWord

    对着React官网的教程练习操作,在做到分离文件练习时,按照官网步骤来却怎么也无法正常显示HelloWord. 经测试,html文件中内容改为: <!DOCTYPE html><ht ...

  2. ProxySQL 配置详解及读写分离(+GTID)等功能说明 (完整篇)

    ProxySQL是灵活强大的MySQL代理层, 是一个能实实在在用在生产环境的MySQL中间件,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行 cache,支持动态加载配 ...

  3. Spring aop与HibernateTemplate——session管理(每事务一次 Session)

    一.HibernateTemplate与Spring aop简介 参见http://bbs.csdn.net/topics/340207475中网友blueram的发言.(感谢blueram) 二.在 ...

  4. 【转载】JavaEE权限管理分析

    JavaEE权限管理分析 一.背景 在 Web 应用开发中,安全一直是非常重要的一个方面.安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来.如果在应用开发的后期才考虑安全的问题,就可 ...

  5. ProxySQL+Mysql实现数据库读写分离实战

    ProxySQL介绍 ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.具有以下特性:http://www.proxysql.com/ 1.连接池,而且是multiplexing 2 ...

  6. ProxySQL+MGR实现读写分离和主节点故障无感知切换 - 完整操作记录

    前面的文章介绍了ProxySQL用法,这里说下ProxySQL中间件针对Mysql组复制模式实现读写分离以及主节点故障时能够自动切换到新的主节点,而应用对此过程无感知的功能.Mysql组复制(MGR) ...

  7. ProxySQL实现Mysql读写分离 - 部署手册

    ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.ProxySQL是用C++语言开发的,也是percona推的一款中间件,虽然也是一个轻量级产品,但性能很好(据测试,能处理千亿级的数 ...

  8. OwnCloud 开源网盘

    https://www.getnas.com/freenas-owncloud/ FreeNAS 插件:OwnCloud 开源网盘 ownCloud 分为服务器端和客户端两个部分,服务器端可以在 Fr ...

  9. NETCore Bootstrap Admin 通用后台管理权限 [3]: 精简版任务调度模块

    前言 NETCore 里说到任务调度,大家首先想到的应该是大名鼎鼎的 QuartzNET 与 Hangfire,然而本篇介绍的却都不是,而是 Bootstrap Admin(以下简称 BA)通用后台权 ...

随机推荐

  1. LA3403天平难题(4个DFS)

    题意:      给出房间的宽度r和每个吊坠的重量wi,设计一个尽量宽但宽度不能超过房间宽度的天平,挂着所有挂坠,每个天平的一段要么挂这一个吊坠,要么挂着另一个天平,每个天平的总长度是1,细节我给出题 ...

  2. UVA10881蚂蚁

    题意:      在一个木棍上有只小蚂蚁,他们的移动速度都是1,移动的时候如果和别的蚂蚁碰面,那么碰面的这两只小蚂蚁会马上掉头继续走,给你每只蚂蚁的初始距离木棒左端点的距离和方向,以及木棍长度,问你t ...

  3. SSH后门万能密码

    当我们在获得一台Linux服务器的 root 权限后,我们第一想做的就是如何维持这个权限,维持权限肯定想到的就是在目标服务器留下一个后门.但是留普通后门,肯定很容易被发现.我们今天要讲的就是留一个SS ...

  4. 实时计算框架:Flink集群搭建与运行机制

    一.Flink概述 1.基础简介 Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算.Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算.主要特性包 ...

  5. Github镜像网站

    https://hub.fastgit.org

  6. Vue(1):用Vue-cli构建Vue3项目

    使用Vue-cli构建Vue3项目 1.检查node版本 node -v 以上node版本位14.15.0满足Vue3项目的创建条件(Vu3需要node 版本8以上) 为什么需要安装node? vue ...

  7. JVM内存溢出后服务还能运行吗

    文章开篇问一个问题吧,一个java程序,如果其中一个线程发生了OOM,那进程中的其他线程还能运行吗? 接下来做实验,看看JVM的六种OOM之后程序还能不能访问. 在这里我用的是一个springboot ...

  8. select执行顺序

    先from 找到表on过滤 找到两张表有对应关系的记录按join的方式添加外部行where 过滤group by分组having 过滤select 从having 过滤出来的字段中选择需要的字段dis ...

  9. Java集合详解(一):全面理解Java集合

    概述 Java所有集合类都在java.util包下,支持并发的集合在java.util.concurrent(juc)包下. 集合与数组区别: 数组大小是固定的,集合大小可以根据使用情况进行动态扩容. ...

  10. CentOS 7.6 操作系统 安装指导书 (鲲鹏920处理器) 01

    若需要手动调整预留内存大小,请参考如下配置进行调整. 以下以配置crashkernel为512M为例进行操作说明: 命令行执行命令vi /etc/default/grub,配置"crashk ...