Multus-CNI简介
Multus-CNI是intel开发的一款应用于Kubernetes上的插件,可以作为其他CNI插件与k8s的中间件,使得kubernetes支持多个网络,实现网络冗余,为实现控制面与数据面分离提供支持。PS:multus-cni本身不提供网络配置功能,它是通过用其他满足CNI规范的插件进行container的网络配置,例如flannel/sriov等。 Multus-CNI源码地址。
其workflow如下图所示:
kubectl
调用RunPod()开始启动container;- setUpPod()调用网络配置插件(k8s的CNI);
- 网络配置插件根据k8s配置(默认位于
/etc/cni/net.d/
下),调用Multus,进入Multus逻辑;- Multus首先调用主pulgin,然后调用其他的plugin创建相应的interface,plugin包括flannel,IPAM, SR-IOV CNI plugin等。
Multus-CNI数据结构
Multus-CNI数据结构如下所示:
type NetConf struct {
types.NetConf
// 用于存放配置信息的位置, 默认"/var/lib/cni/multus, 一般用不到"
CNIDir string `json:"cniDir"`
// 具体的第三方插件的配置信息
Delegates []map[string]interface{} `json:"delegates"`
// k8s的配置文件的绝对路径
Kubeconfig string `json:"kubeconfig"`
}
type PodNet struct {
Networkname string `json:"name"`
}
type netplugin struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty" description:"standard object metadata"`
Plugin string `json:"plugin"`
Args string `json:"args"`
}
// K8sArgs is the valid CNI_ARGS used for Kubernetes
type K8sArgs struct {
types.CommonArgs
IP net.IP
K8S_POD_NAME types.UnmarshallableString
K8S_POD_NAMESPACE types.UnmarshallableString
K8S_POD_INFRA_CONTAINER_ID types.UnmarshallableString
}
Multus-CNI核心函数
cmdAdd(args *skel.CmdArgs)
主要是读取网络配置,然后调用具体的CNI实现配置,cmdDel(args *skel.CmdArgs)
则是其逆过程。配置过程的log可以通过/var/log/syslog
进行查看。 此处仅对cmdAdd
函数进行简单介绍:
func cmdAdd(args *skel.CmdArgs) error {
var result error
var nopodnet bool
// 读取配置信息
n, err := loadNetConf(args.StdinData)
if err != nil {
return fmt.Errorf("err in loading netconf: %v", err)
}
// 读取k8s配置信息
if n.Kubeconfig != "" {
// 获取k8s的网络信息;
// “/etc/cni/net.d/” 下的第一个(按照文件名的ASCII顺序)网络配置应该是multus的配置
podDelegate, err := getK8sNetwork(args, n.Kubeconfig)
if err != nil {
if _, ok := err.(*NoK8sNetworkError); ok {
nopodnet = true
if !defaultcninetwork