k8s之multus cni

2023-05-16

通常情况下在k8s中,一个pod只有一个接口,用于集群网络中pod和pod通信,
而multus定义了一种crd(Kubernetes Network Custom Resource Definition)-NetworkAttachmentDefinition,可用来定义其他网络接口,使pod可以生成多个接口。
如下图,eth0为默认的集群网络中的接口,net0和net1是自定义的其他接口。

image.png

安装multus

安装multus前,k8s必须已经安装了一种cni用于连接pod集群网络,比如calico。
再安装multus,multus会使用之前的cni作为默认网络,将之前cni的配置放在/etc/cni/net.d/00-multus.conf
再通过NetworkAttachmentDefinition定义其他的cni接口。
在pod的yaml的annotation中使用"k8s.v1.cni.cncf.io/networks" 引用,如果用逗号分开,同时添加多个接口。

参考官网,安装multus有两种方法,一种是手动安装(手动下载multus binary,手动创建sa,crd等),另一种是通过daemonset自动安装。

下面采用自动安装方法

#下载源码
root@master:~/multus# git clone https://github.com/intel/multus-cni.git
#安装multus
root@master:~/multus# kubectl apply -f multus-cni-master/images/multus-daemonset.yml
customresourcedefinition.apiextensions.k8s.io/network-attachment-definitions.k8s.cni.cncf.io created
clusterrole.rbac.authorization.k8s.io/multus created
clusterrolebinding.rbac.authorization.k8s.io/multus created
serviceaccount/multus created
configmap/multus-cni-config created
daemonset.apps/kube-multus-ds-amd64 created
daemonset.apps/kube-multus-ds-ppc64le created

查看multus pod已经处于running状态

root@master:~/multus# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-5b644bc49c-vrlmw   1/1     Running   0          7h45m
calico-node-5fhft                          1/1     Running   0          7h45m
calico-node-8jpzr                          1/1     Running   0          7h45m
calico-node-p8wxx                          1/1     Running   0          7h45m
coredns-9d85f5447-4znmx                    1/1     Running   4          42d
coredns-9d85f5447-fh667                    1/1     Running   2          42d
etcd-master                                1/1     Running   8          184d
kube-apiserver-master                      1/1     Running   0          36h
kube-controller-manager-master             1/1     Running   8          184d
kube-multus-ds-amd64-469ls                 1/1     Running   0          2s
kube-multus-ds-amd64-bzkts                 1/1     Running   0          2s
kube-multus-ds-amd64-pj2p4                 1/1     Running   0          2s
kube-proxy-l4wn7                           1/1     Running   5          184d
kube-proxy-prhcm                           1/1     Running   5          184d
kube-proxy-psxqt                           1/1     Running   8          184d
kube-scheduler-master                      1/1     Running   8          184d

network-attachment-definitions.k8s.cni.cncf.io 为multus创建的crd,用于定义其他网络接口

root@master:~/multus# kubectl describe CustomResourceDefinition network-attachment-definitions.k8s.cni.cncf.io
Name:         network-attachment-definitions.k8s.cni.cncf.io
Namespace:
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"apiextensions.k8s.io/v1","kind":"CustomResourceDefinition","metadata":{"annotations":{},"name":"network-attachment-definiti...
API Version:  apiextensions.k8s.io/v1
Kind:         CustomResourceDefinition
Metadata:
  Creation Timestamp:  2020-08-16T21:28:15Z
  Generation:          1
  Resource Version:    12551106
  Self Link:           /apis/apiextensions.k8s.io/v1/customresourcedefinitions/network-attachment-definitions.k8s.cni.cncf.io
  UID:                 71df5215-ce14-41b3-bd6b-bf6bfa8198f5
Spec:
  Conversion:
    Strategy:  None
  Group:       k8s.cni.cncf.io
  Names:
    Kind:       NetworkAttachmentDefinition
    List Kind:  NetworkAttachmentDefinitionList
    Plural:     network-attachment-definitions
    Short Names:
      net-attach-def
    Singular:  network-attachment-definition
  Scope:       Namespaced
  Versions:
    Name:  v1
    Schema:
      openAPIV3Schema:
        Description:  NetworkAttachmentDefinition is a CRD schema specified by the Network Plumbing Working Group to express the intent for attaching pods to one or more logical or physical networks. More information available at: https://github.com/k8snetworkplumbingwg/multi-net-spec
        Properties:
          Spec:
            Description:  NetworkAttachmentDefinition spec defines the desired state of a network attachment
            Properties:
              Config:
                Description:  NetworkAttachmentDefinition config is a JSON-formatted CNI configuration
                Type:         string
            Type:             object
        Type:                 object
    Served:                   true
    Storage:                  true
Status:
  Accepted Names:
    Kind:       NetworkAttachmentDefinition
    List Kind:  NetworkAttachmentDefinitionList
    Plural:     network-attachment-definitions
    Short Names:
      net-attach-def
    Singular:  network-attachment-definition
  Conditions:
    Last Transition Time:  2020-08-16T21:28:15Z
    Message:               no conflicts found
    Reason:                NoConflicts
    Status:                True
    Type:                  NamesAccepted
    Last Transition Time:  2020-08-16T21:28:15Z
    Message:               the initial names have been accepted
    Reason:                InitialNamesAccepted
    Status:                True
    Type:                  Established
  Stored Versions:
    v1
Events:  <none>

使用multus创建多个接口

首先创建一个NetworkAttachmentDefinition,指定macvlan类型

cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: macvlan-conf
spec:
  config: '{
      "cniVersion": "0.3.0",
      "type": "macvlan",
      "master": "ens3",
      "mode": "bridge",
      "ipam": {
        "type": "host-local",
        "subnet": "192.168.1.0/24",
        "rangeStart": "192.168.1.200",
        "rangeEnd": "192.168.1.216",
        "routes": [
          { "dst": "0.0.0.0/0" }
        ],
        "gateway": "192.168.1.1"
      }
    }'
EOF

root@master:~/multus# kubectl get net-attach-def
NAME           AGE
macvlan-conf   25s

作为对比,先创建一个默认的pod

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: samplepod

spec:
  containers:
  - name: samplepod
    command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
    image: alpine
EOF

如下为pod默认的网络接口。
root@master:~/multus# kubectl exec -it samplepod -- ip a
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
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@if46: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1440 qdisc noqueue state UP
    link/ether b2:95:21:e8:80:63 brd ff:ff:ff:ff:ff:ff
    inet 10.24.166.141/32 scope global eth0
       valid_lft forever preferred_lft forever

再使用macvlan-conf 创建一个pod

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: samplepod
  annotations:
    k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
  containers:
  - name: samplepod
    command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
    image: alpine
EOF

查看pod网络接口,多出来的net1为macvlan接口

root@master:~/multus#  kubectl exec -it samplepod -- ip a
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
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@if43: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1440 qdisc noqueue state UP
    link/ether 66:5c:86:29:da:d2 brd ff:ff:ff:ff:ff:ff
    inet 10.24.166.139/32 scope global eth0
       valid_lft forever preferred_lft forever
5: net1@tunl0: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether ce:b5:43:8e:50:b2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.200/24 scope global net1
       valid_lft forever preferred_lft forever

可以指定多次macvlan-conf来创建更多接口

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: samplepod
  annotations:
    k8s.v1.cni.cncf.io/networks: macvlan-conf,macvlan-conf
spec:
  containers:
  - name: samplepod
    command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
    image: alpine
EOF

多出来的net1和net2即为macvlan接口

root@master:~/multus# kubectl exec -it samplepod -- ip a
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
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@if45: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1440 qdisc noqueue state UP
    link/ether 52:f8:ed:35:c0:77 brd ff:ff:ff:ff:ff:ff
    inet 10.24.166.140/32 scope global eth0
       valid_lft forever preferred_lft forever
5: net1@tunl0: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 6a:1a:1f:0f:0d:6e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.201/24 scope global net1
       valid_lft forever preferred_lft forever
6: net2@tunl0: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 2a:6b:f3:08:d3:d2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.202/24 scope global net2
       valid_lft forever preferred_lft forever

参考

如下链接都来自multus官方文档,写的很详细
https://github.com/intel/multus-cni/blob/master/doc/how-to-use.md
https://github.com/intel/multus-cni/blob/master/doc/quickstart.md
https://github.com/intel/multus-cni/blob/master/doc/configuration.md

 

也可参考:k8s之multus cni - 简书 (jianshu.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s之multus cni 的相关文章

  • 删除Pods

    通过删除job删除Pods 否者pods会重启 def cmd kubectl command try r os system kubectl command if r 0 print f Fail kubectl command retu
  • K8s中的Deployment

    Deployment是kubernetes在1 2版本中引入的新概念 用于更好的解决Pod的编排问题 为此 Deployment在内部使用了ReplicaSet来实现目的 我们可以把Deployment理解为ReplicaSet的一次升 级
  • K8s部署自己的web项目

    一 静态网页项目 1 前端项目源码下载 链接 https pan baidu com s 15jCVawpyJxa0xhCJ9SwTCQ 提取码 m4an 2 编写nginx conf和Dockerfile 放在项目根目录下 1 创建ngi
  • DHorse系列文章之操作手册

    在介绍DHorse的操作之前 我们先来看一下发布一个系统的流程是什么样的 发布系统的流程 我们以一个Springboot系统为例 来说明一下发布流程 1 首先从代码仓库下载代码 比如Gitlab 2 接着是进行打包 比如使用Maven 3
  • k8s job机制初探

    博客作为学习笔记记录 若有理解或表述错误 欢迎指出 k8s的job机制 k8s官网参考 k8s的job是用来执行一次性任务的一类资源 相关的还有cronjob 用于执行以下周期性任务 部署job之后 k8s会起对应pod 当pod的状态为f
  • CNI Plugin 介绍

    CNI 插件包括两种类型 CNI Plugin 和 IPAM IP Address Management Plugin CNI Plugin 负责为容器配置网络资源 IPAM Plugin 负责对容器的 IP 地址进行分配和管理 IPAM
  • K8S 工作负载(一)

    K8S 工作负载 1 Pod Pod 是 Kubernetes 中创建 管理和调度的最小计算单元 用户可以在 K8S 中通过调用 Pod API生成一个 Pod 让 K8S 对其进行调度 Pod 是一组 一个或多个 容器 这些容器共享存储
  • kubeadm常用

    kubeadm常用 配置kubeadm自动补全 初始化一个master节点 导出kubeadm默认配置文件 将node节点加入集群 生成node配置 升级k8s版本 kubeadm升级node 维护或下线node节点 管理kubeadm j
  • 基于hostpath的k8s pod日志持久化

    基于hostpath的k8s pod日志持久化 前置条件 step1 修改服务的yaml文件 step2 推送日志到minio版保存 step3 优化 附加 简单了解 前置条件 考虑到pod的多副本 但同时需要将日志集中收集起来 所以采用h
  • 局域网使用kubeadm安装高可用k8s集群

    主机列表 ip 主机名 节点 cpu 内存 192 168 23 100 k8smaster01 master 2核 2G 192 168 23 101 k8smaster02 node 2核 2G 192 168 23 102 k8sma
  • Liveness、Readiness 和 Startup Probes

    liveness apiVersion v1 kind Pod metadata labels test liveness name liveness exec spec containers name liveness image k8s
  • k8s英伟达GPU插件(nvidia-device-plugin)

    安装方法 Installation Guide NVIDIA Cloud Native Technologies documentation 1 本地节点添加 NVIDIA 驱动程序 要求 NVIDIA drivers 384 81 先确保
  • k8s-3:集群的三种网络

    k8s集群一共有三种网络模型 Node IP Node节点的IP地址 即物理网卡的IP地址 Pod IP Pod的IP地址 即docker容器的IP地址 此为虚拟IP地址 Cluster IP Service的IP地址 此为虚拟IP地址 N
  • k8s中Endpoint是什么

    在Kubernetes K8s 中 Endpoint是一种资源对象 用于表示一个Service所依赖的真实后端节点的Pod信息 它存储了一组IP地址和端口号的列表 这些IP地址和端口号对应着提供相同服务的Pod实例 主要作用 Endpoin
  • Kubernetes 集群部署 ------ 二进制部署(二)

    单节点 https blog csdn net Yplayer001 article details 104234807 先具备单master1节点部署环境 三 master02部署 优先关闭防火墙和selinux服务 在master01上
  • k8s Failed to create pod sandbox错误处理

    错误信息 Failed to create pod sandbox rpc error code Unknown desc failed to get sandbox image k8s gcr io pause 3 2 failed to
  • k8s问题 CrashLoopBackOff

    我们创建资源发现资源出现CrashLoopBackOff解决 CrashLoopBackOff 告诉我们 Kubernetes 正在尽力启动这个 Pod 但是一个或多个容器已经挂了 或者正被删除 root localhost kubectl
  • k8备份与恢复-Velero

    简介 Velero 是一款可以安全的备份 恢复和迁移 Kubernetes 集群资源和持久卷等资源的备份恢复软件 Velero 实现的 kubernetes 资源备份能力 可以轻松实现 Kubernetes 集群的数据备份和恢复 复制 ku
  • namespace命令空间

    目录 1 解决什么问题 2 基本介绍 2 1 定义 2 2 应用场景 3 使用案例 4 资源配额 5 标签 5 1 定义 5 2 pod资源打标签 5 3 查看标签 1 解决什么问题 命令空间类似于C 中的命名空间 当用户数量较多的集群 才
  • flannel和calico区别

    k8s网络模式 Flannel数据包在主机间转发是由backend实现的 目前已经支持UDP VxLAN host gw等多种模式 VxLAN 使用内核中的VxLAN模块进行封装报文 也是flannel推荐的方式 host gw虽然VXLA

随机推荐