Kubernets:Mutus-CNI简介

Github-blog
优快云

Multus-CNI简介

Multus-CNI是intel开发的一款应用于Kubernetes上的插件,可以作为其他CNI插件与k8s的中间件,使得kubernetes支持多个网络,实现网络冗余,为实现控制面与数据面分离提供支持。PS:multus-cni本身不提供网络配置功能,它是通过用其他满足CNI规范的插件进行container的网络配置,例如flannel/sriov等。 Multus-CNI源码地址


其workflow如下图所示:
image

  1. kubectl调用RunPod()开始启动container;
  2. setUpPod()调用网络配置插件(k8s的CNI);
  3. 网络配置插件根据k8s配置(默认位于/etc/cni/net.d/下),调用Multus,进入Multus逻辑;
  4. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值