0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kubernetes Pod多网卡方案MULTUS

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-06-22 10:08 次阅读

在 Kubernetes中,网络是非常重要的一个领域。Kubernetes 本身不提供网络解决方案,但是提供了 CN I规范。这些规范被许多 CNI 插件(例如 WeaveNet,Flannel,Calico 等)遵守。这些插件中任何一个都可以在集群上使用和部署以提供网络解决方案。该网络称为集群的默认网络。此默认网络使 Pods 不仅可以在同一节点上而且可以在群集中的各个节点之间相互通信

随着发展,Kubernetes 缺乏支持 VNF 中多个网络接口的所需功能。传统上,网络功能使用多个网络接口分离控制,管理和控制用户/数据的网络平面。他们还用于支持不同的协议,满足不同的调整和配置要求。

为了解决这个需求,英特尔实现了 MULTUS 的 CNI 插件,其中提供了将多个接口添加到 Pod 的功能。这允许 POD 通过不同的接口连接到多个网络,并且每个接口都将使用其自己的 CNI 插件。

下面是 Multus CNI 提供的连接到 Pod 的网络接口的图示。该图显示了具有三个接口的容器:eth0net0net1eth0连接 Kubernetes 集群网络以连接kubernetes服务器/服务(例如 Kubernetes api-server,kubelet 等)。net0net1是其他网络附件,并通过使用其他 CNI 插件(例如vlan / vxlan / ptp)连接到其他网络。

2f234896-f167-11ec-ba43-dac502259ad0.jpg

MULTUS 工作原理

Kubernetes 当前没有提供为POD添加额外的接口选项的规定,或支持多个 CNI 插件同时工作的规定,但是它确实提供了一种由 API 服务器扩展受支持的API的机制。使用 "自定义资源定义" 可以做到这一点。MULTUS依赖于 "自定义资源定义" 来存储其他接口和CNI插件所需的信息

2f33682a-f167-11ec-ba43-dac502259ad0.jpg

我们首先需要确保将 MULTUS 二进制文件放置在 /opt/cni/bin 位置的所有节点上,并在/etc/cni/net.d位置创建一个新的配置文件。与 MULTUS 使用的 kubeconfig 文件一起使用。

/etc/cni/net.d中创建的新配置文件基于集群中已经存在的默认网络配置。

在此之后,CRD 用于定义新的种类名称 "NetworkAttachmentDefinition",以及服务帐户和 MULTUS 的集群角色以及相应的绑定。这个新的集群角色将提供对随 CRD 添加的新 API 组以及默认 API 组中 Pod 资源的访问权限。

然后创建类型为 "NetworkAttachmentDefinition" 的客户资源实例,该实例稍后将在创建具有多个接口的 Pod 时使用。

部署示例

在本文中,我们将多次提及两件事:

  • "默认网络" - 这是您的Pod到Pod网络。这就是集群中 Pod 之间相互通信的方式,以及它们之间的连通性。一般而言,这被称为名为 eth0 的接口。此接口始终连接到您的 Pod,以便它们之间可以相互连接。除此之外,我们还将添加接口。
  • “ CRD” - 自定义资源定义。自定义资源是扩展 Kubernetes API 的一种方式。我们在这里使用这些存储 Multus 可以读取的一些信息。首先,我们使用它们来存储附加到您的 Pod 的每个其他接口的配置。

目前支持 Kubernetes 1.16+ 版本。

安装

我们建议的用于部署 Multus 的快速入门方法是使用 Daemonset(在群集中的每个节点上运行 Pod 的方法)进行部署,该 Pod 会安装 Multus 二进制文件并配置 Multus 以供使用。

首先,克隆此 GitHub 存储库。

$gitclonehttps://github.com/intel/multus-cni.git&&cdmultus-cni

我们将在此存储库中使用带有kubectl的YAML文件。

$cat./images/multus-daemonset.yml|kubectlapply-f-

Multus daemonset 完成了那些工作?

  • 启动 Multus 守护程序集,这会在每个节点上运行一个pod,从而在/opt/cni/bin中的每个节点上放置一个 Multus 二进制文件
  • 按照字母顺序读取/etc/cni/net.d中的第一个配置文件,并为 Multus 创建一个新的配置文件,即/etc/cni/net.d/00-multus.conf,此配置是自动生成并基于默认网络配置(假定是按字母顺序排列的第一个配置)
  • 在每个节点上创建一个/etc/cni/net.d/multus.d目录,其中包含用于 Multus 访问 Kubernetes API 的身份验证信息。

创建其他接口

我们要做的第一件事是为我们附加到Pod的每个其他接口创建配置。我们将通过创建自定义资源来做到这一点。快速入门安装的一部分会创建一个 "CRD" (自定义资源定义,它是我们保留这些自定义资源的位置),我们将在其中存储每个接口的配置。

CNI 配置

我们将添加的每个配置都是CNI配置。如果您不熟悉它们,让我们快速分解它们。这是一个示例CNI配置:

{
"cniVersion":"0.3.0",
"type":"loopback",
"additional":"information"
}

CNI配置是 JSON,我们这里有一个结构,其中包含一些我们感兴趣的东西:

  • cniVersion:告诉每个 CNI 插件正在使用哪个版本,如果使用的版本太晚(或太早),则可以提供插件信息。
  • type:告诉 CNI 在磁盘上调用哪个二进制文件。每个 CNI 插件都是一个二进制文件。通常,这些二进制文件存储在每个节点上的/opt/cni/bin中,并且 CNI 执行此二进制文件。在这种情况下,我们指定了loopback二进制文件(它将创建一个loopback类型的网络接口)。如果这是您首次安装 Multus,则可能需要验证 "type" 字段中的插件是否确实在/opt/cni/bin目录中。
  • additional:此字段以此处为例,每个 CNI 插件都可以在JSON中指定所需的任何配置参数。这些特定于您在 "type" 字段中调用的二进制文件。

当 CNI 配置更改时,您不需要重新加载或刷新 Kubelets。每次创建和删除 Pod 时都会读取这些内容。因此,如果您更改配置,它将在下一次创建 Pod 时应用。如果现有 Pod 需要新配置,则可能需要重新启动。

将配置存储为自定义资源

因此,我们要创建一个附加接口。让我们创建一个 macvlan 接口供 Pod 使用。我们将创建一个自定义资源,该资源定义接口的 CNI 配置。

请注意,在以下命令中有一种:NetworkAttachmentDefinition。这是我们配置的名字-它是 Kubernetes 的自定义扩展,定义了我们如何将网络连接到 Pod。

其次,注意配置字段。您将看到这是一个 CNI 配置,就像我们前面解释的那样。

最后但非常重要的一点是,在元数据下注意 name 字段-在这里我们为该配置指定名称,这是我们告诉 pod 使用此配置的方式。这里的名称是macvlan-conf-我们正在为 macvlan 创建配置。

这是创建此示例配置的命令:

apiVersion:"k8s.cni.cncf.io/v1"
kind:NetworkAttachmentDefinition
metadata:
name:macvlan-conf
spec:
config:'{
"cniVersion":"0.3.0",
"type":"macvlan",
"master":"eth0",
"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"
}
}'

本示例使用 eth0 作为主参数,此主参数应与集群中主机上的接口名称匹配。

您可以查看使用 kubectl 创建的配置,方法如下:

$kubectlgetnetwork-attachment-definitions

您可以通过描述它们来获得更多详细信息:

$kubectldescribenetwork-attachment-definitionsmacvlan-conf

创建一个附加附加接口的Pod

我们将创建一个 pod。就像您之前可能创建的任何pod一样,它看起来都很熟悉,但是,我们将有一个特殊的注释字段-在这种情况下,我们将有一个名为k8s.v1.cni.cncf.io/networks的注释。如上创建的,该字段以逗号分隔的列表列出了 NetworkAttachmentDefinitions 的名称。请注意,在下面的命令中,我们具有 k8s.v1.cni.cncf.io/networks 的注释:macvlan-conf其中macvlan-conf是我们在创建配置时使用的名称。

让我们继续使用以下命令创建一个 pod:

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:TERMINT;sleepinfinity&wait"]
image:alpine

您现在可以检查Pod并查看连接了哪些接口,如下所示:

$kubectlexec-itsamplepod--ipa

您应该看到,有 3 个接口:

  • lo环回接口
  • eth0我们的默认网络
  • net1是我们使用macvlan配置创建的新接口

网络状态 Annotations

为了确认,请使用kubectl describe pod pod samplepod,然后会有一个注释部分,类似于以下内容:

Annotations:k8s.v1.cni.cncf.io/networks:macvlan-conf
k8s.v1.cni.cncf.io/networks-status:
[{
"name":"cbr0",
"ips":[
"10.244.1.73"
],
"default":true,
"dns":{}
},{
"name":"macvlan-conf",
"interface":"net1",
"ips":[
"192.168.1.205"
],
"mac":"869655:0d",
"dns":{}
}]

该元数据告诉我们,我们有两个成功运行的 CNI 插件。

如果我想要更多接口怎么办?

您可以通过创建更多的自定义资源,然后在pod的注释中引用它们,来向pod添加更多接口。您还可以重复使用配置,例如,要将两个 macvlan 接口附加到 Pod,可以创建如下 Pod:

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:TERMINT;sleepinfinity&wait"]
image:alpine

请注意,注释现在读取为k8s.v1.cni.cncf.io/networks:macvlan-conf,macvlan-conf。如果我们有两次使用相同的配置,并用逗号分隔。


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网卡
    +关注

    关注

    4

    文章

    310

    浏览量

    27379
  • 网络接口
    +关注

    关注

    0

    文章

    86

    浏览量

    17209

原文标题:Kubernetes Pod 多网卡方案 Multus

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    艾体宝与Kubernetes原生数据平台AppsCode达成合作

    虹科姐妹公司艾体宝宣布与Kubernetes 原生数据平台 AppsCode达成正式合作,致力于将其核心产品KubeDB引入中国市场,为企业提供专业、高效的云原生数据库管理解决方案
    的头像 发表于 12-16 15:07 212次阅读

    网卡的演进和应用

    随着云计算和虚拟化技术的发展,网卡在功能和硬件结构方面也经历了四个阶段,即网卡、智能网卡、基于FPGA的DPU和DPU SoC网卡。本文将重点介绍这些不同类型的网络适配器和处理器,在硬
    的头像 发表于 10-24 16:45 322次阅读
    <b class='flag-5'>网卡</b>的演进和应用

    服务器网卡和普通网卡区别

    服务器网卡和普通网卡的区别主要体现在以下几个方面: 1. 性能差异 1.1 带宽 服务器网卡通常具有更高的带宽,以满足大量数据传输的需求。普通网卡的带宽通常较低,适用于家庭或小型办公室
    的头像 发表于 10-10 16:37 421次阅读

    使用Velero备份Kubernetes集群

    Velero 是 heptio 团队(被 VMWare 收购)开源的 Kubernetes 集群备份、迁移工具。
    的头像 发表于 08-05 15:43 352次阅读
    使用Velero备份<b class='flag-5'>Kubernetes</b>集群

    如何使用Kubeadm命令在PetaExpress Ubuntu系统上安装Kubernetes集群

    Kubernetes,通常缩写为K8s,是一个开源的容器编排平台,旨在自动化容器化应用的部署、扩展和管理。有了Kubernetes,您可以轻松地部署、更新和扩展应用,而无需担心底层基础设施。
    的头像 发表于 07-15 13:31 867次阅读
    如何使用Kubeadm命令在PetaExpress Ubuntu系统上安装<b class='flag-5'>Kubernetes</b>集群

    有线网卡和无线网卡分别指的是什么

    有线网卡和无线网卡是计算机或网络设备中用于连接网络的两种不同类型的网络接口卡。它们的主要区别在于传输媒介和连接方式。
    的头像 发表于 05-28 15:28 3575次阅读

    门禁物联网卡的使用与管理

    门禁物联网卡,作为现代门禁系统的重要组件,它使得门禁系统能够与网络相连,从而实现远程监控、数据记录、智能控制等多种功能。那么,门禁物联网卡究竟如何使用呢?本文将详细解析门禁物联网卡的使用步骤
    的头像 发表于 04-11 16:51 583次阅读
    门禁物联<b class='flag-5'>网卡</b>的使用与管理

    网卡揭秘:如何选择适合您需求的网卡

    网卡(Network Interface Card,NIC),也称网络适配器,是连接计算机与网络的硬件设备。在光通信系统中,网卡特指光纤网卡,它通过光纤接口与外部网络通信,传输数据。早期的网卡
    的头像 发表于 04-10 10:04 709次阅读
    光<b class='flag-5'>网卡</b>揭秘:如何选择适合您需求的<b class='flag-5'>网卡</b>

    linux怎么查看网卡的收光功率?

    linux怎么查看网卡的收光功率? 在Linux系统中,可以使用一些命令和工具来查看网卡的收光功率。本文将介绍如何使用这些命令和工具来查看和监测网卡的收光功率。 1. 使用ifconfig命令查看
    的头像 发表于 01-31 14:24 3615次阅读

    无线网卡驱动怎么安装 无线网卡怎么连接台式电脑

    如今,随着科技的不断发展,无线网络已经成为了我们生活中不可或缺的一部分。对于台式电脑用户而言,如果没有内置无线网卡,就需要通过安装外置无线网卡来连接无线网络。本文将详细介绍如何安装无线网卡驱动并对台
    的头像 发表于 01-19 09:54 3292次阅读

    Kubernetes Gateway API攻略教程

    Kubernetes Gateway API 刚刚 GA,旨在改进将集群服务暴露给外部的过程。这其中包括一套更标准、更强大的 API资源,用于管理已暴露的服务。在这篇文章中,我将介绍 Gateway
    的头像 发表于 01-12 11:32 890次阅读
    <b class='flag-5'>Kubernetes</b> Gateway API攻略教程

    请问如何使用Helm在K8s上集成Prometheus呢?

    ArtifactHub 为 Helm Chart 提供了公共和私有资源库。我们将使用这些 Helm Chart 来设置 Kubernetes 集群中的 pod 和服务。
    的头像 发表于 01-10 17:24 672次阅读
    请问如何使用Helm在K8s上集成Prometheus呢?

    配置KubernetesPod使用代理的两种常见方式

    的需要。本文将介绍配置KubernetesPod使用代理的两种常见方式:通过ConfigMap和直接在应用程序环境变量中设置。
    的头像 发表于 01-05 11:22 1135次阅读
    配置<b class='flag-5'>Kubernetes</b>中<b class='flag-5'>Pod</b>使用代理的两种常见方式

    使用Jenkins和单个模板部署多个Kubernetes组件

    在持续集成和部署中,我们通常需要部署多个实例或组件到Kubernetes集群中。通过Jenkins的管道脚本,我们可以自动化这个过程。在本文中,我将演示如何使用Jenkins Pipeline及单个
    的头像 发表于 01-02 11:40 764次阅读
    使用Jenkins和单个模板部署多个<b class='flag-5'>Kubernetes</b>组件

    网卡硬件故障及解决方法

    网卡硬件故障及解决方法 网卡是计算机与网络之间进行通信的重要组件之一。然而,由于各种原因,网卡硬件故障可能会导致计算机无法连接到网络或者网络连接缓慢不稳定。本文将介绍常见的网卡硬件故障
    的头像 发表于 12-27 15:17 3547次阅读