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。如果我们有两次使用相同的配置,并用逗号分隔。


审核编辑 :李倩


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

    关注

    2

    文章

    285

    浏览量

    27096
  • 网络接口
    +关注

    关注

    0

    文章

    75

    浏览量

    17076

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    [Kubernetes]为什么有时会出现删除POD后要等一段时间才能被删掉

    正常情况下,执行kubectl delete pod之后,pod一般会立即被删除。
    的头像 发表于 12-22 10:38 378次阅读
    [<b class='flag-5'>Kubernetes</b>]为什么有时会出现删除<b class='flag-5'>POD</b>后要等一段时间才能被删掉

    Pod一直处于Pending状态?什么是Pod拓扑约束?

    起因: 今天在部署组件的时候,发现组件的pod一直处于Pending状态,报错显示的原因是:不满足Pod拓扑分布约束,看了代码发现是原来同事给组件新增了Pod拓扑约束。
    的头像 发表于 12-18 11:46 699次阅读
    <b class='flag-5'>Pod</b>一直处于Pending状态?什么是<b class='flag-5'>Pod</b>拓扑约束?

    怎么使用Kubernetes检查点API快速进行容器的备份和恢复呢?

    Kubernetes v1.25 引入了容器检查点 API 作为 alpha 特性。这提供了一种在不停止容器的情况下备份和恢复运行在 Pod 中的容器的方式。此功能主要用于调试分析,但任何 Kubernetes 用户都可以利用常
    的头像 发表于 10-30 15:50 268次阅读

    探讨Kubernetes中的网络模型(各种网络模型分析)

    kubernetes 中,underlay network 中比较典型的例子是通过将宿主机作为路由器设备,Pod 的网络则通过学习路由条目从而实现跨节点通讯。
    发表于 08-24 12:44 228次阅读
    探讨<b class='flag-5'>Kubernetes</b>中的网络模型(各种网络模型分析)

    Pod是如何在底层实现的?如何使用Docker创建Pod

    刚开始接触 Kubernetes 时,你学到的第一件事就是每个 Pod 都有一个唯一的 IP 和主机名,并且在同一个 Pod 中,容器可以通过 localhost 相互通信。所以,显而易见,一个
    的头像 发表于 08-14 10:33 847次阅读
    <b class='flag-5'>Pod</b>是如何在底层实现的?如何使用Docker创建<b class='flag-5'>Pod</b>?

    K8S API资源对象-CRD介绍

    Kubernetes中,像Pod、Service和Deployment这样的资源是由内置的资源类型如Pod、Service和Deployment表示的。
    的头像 发表于 08-08 10:21 705次阅读

    Kubernetes Pod如何获取IP地址呢?

    Kubernetes 网络模型的核心要求之一是每个 Pod 都拥有自己的 IP 地址并可以使用该 IP 地址进行通信。很多人刚开始使用 Kubernetes 时,还不清楚如何为每个 Pod
    的头像 发表于 07-21 10:00 544次阅读
    <b class='flag-5'>Kubernetes</b> <b class='flag-5'>Pod</b>如何获取IP地址呢?

    Commvault:护航Kubernetes,不止Kubernetes

    Kubernetes已经不再是只存在于路线图中的未来产品。事实上,几乎所有(94%)已经采用容器的企业都在使用Kubernetes,大多数(86%)企业甚至认为它对他们的运营至关重要。这并不令人意外,Kubernetes正在帮助
    的头像 发表于 07-07 14:42 311次阅读

    如何快速查看Kubernetes Pod崩溃前的日志

    pod处于crash状态的时候,容器不断重启,此时用 kubelet logs 可能出现一直捕捉不到日志。
    的头像 发表于 07-06 09:25 401次阅读

    POD到底是什么?聊聊POD

    POD,即Plain Old Data的缩写,plain代表普通,Old代表旧,从字面意思看是老的、普通的数据类型。
    的头像 发表于 06-19 15:24 3102次阅读

    Docker容器和Kubernetes退出码中文指南

    当容器终止时,容器引擎使用退出码来报告容器终止的原因。如果您是 Kubernetes 用户,容器故障是 pod 异常最常见的原因之一,了解容器退出码可以帮助您在排查时找到 pod 故障的根本原因。以下是容器使用的最常见的退出码。
    发表于 06-06 10:08 176次阅读

    Kubernetes 监控利器功能特性

    Kubeshark 是专为 Kubernetes 设计的 API 流量分析器,它提供实时的 K8s 协议级别的可见性,可以捕获和监控所有在容器、Pod、节点和集群之间进出和流动的流量和负载。可以把它想象成专门针对 Kubernetes
    的头像 发表于 05-17 16:10 409次阅读
    <b class='flag-5'>Kubernetes</b> 监控利器功能特性

    Kubernetes Pod如何独立工作

    在学习 Kubernetes 网络模型的过程中,了解各种网络组件的作用以及如何交互非常重要。本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod 都能获取 IP 地址。
    的头像 发表于 05-16 14:29 437次阅读
    <b class='flag-5'>Kubernetes</b> <b class='flag-5'>Pod</b>如何独立工作

    Kubernetes特性有哪些?

    本文将介绍Kubernetes 的重要特性,这将有助于您更深入地了解 Kubernetes 的功能概念。
    的头像 发表于 05-12 16:16 667次阅读
    <b class='flag-5'>Kubernetes</b>特性有哪些?