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

    文章

    346

    浏览量

    29074
  • 网络接口
    +关注

    关注

    0

    文章

    97

    浏览量

    18970

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Kubernetes Pod启动失败的各种场景及其排障方法

    Kubernetes 日常运维中,Pod 起不来是最常见的故障形态之一。很多运维工程师看到 Pod 状态不是 Running 时,第一反应是盯着 kubectl get pod
    的头像 发表于 04-13 13:53 101次阅读

    Prometheus千节点集群的横向扩展实践

    在2026年的运维环境中,千节点规模的Kubernetes集群已经稀松平常。一个典型的中大型互联网公司,其Kubernetes集群规模通常在3000至5000个节点,单个集群中运行的Pod数量动辄数万个。在这样的规模下,监控系统
    的头像 发表于 03-31 14:37 223次阅读

    Kubernetes Pod异常问题排查实战

    集群跑着跑着,Pod 挂了。Slack 告警一刷屏,脑子一片空白。打开终端敲 kubectl get pods,看到一堆 CrashLoopBackOff、ImagePullBackOff、Pending,不知道从哪下手。这是每个刚接触 Kubernetes 运维的人都会
    的头像 发表于 03-18 15:43 256次阅读

    Kubernetes Pod调度策略原理与落地指南

    Pod调度是Kubernetes的核心机制之一,决定了Pod最终运行在哪个节点上。默认调度器kube-scheduler通过一系列预选(Filtering)和优选(Scoring)算法完成调度决策,但默认行为在生产环境中往往不够
    的头像 发表于 02-27 11:08 311次阅读

    Kubernetes HPA和VPA使用实战指南

    线上业务流量存在明显的波峰波谷。白天高峰期Pod数量不够导致请求排队,凌晨低谷期大量Pod空跑浪费资源。手动扩缩容不现实——你不可能每天早上8点上线加Pod、晚上12点再缩回去。
    的头像 发表于 02-26 16:27 278次阅读

    Kubernetes存储管理功能的落地实践

    容器本身是无状态的,Pod重启后容器内的数据全部丢失。数据库、消息队列、文件存储这类有状态服务跑在K8s上,必须解决持久化存储问题。Kubernetes通过PersistentVolume(PV)、PersistentVolumeClaim(PVC)和StorageCla
    的头像 发表于 02-26 14:45 410次阅读

    Kubernetes故障排查手册

    K8s集群出故障是常态。Pod起不来、Service访问不通、节点NotReady、证书过期、etcd磁盘满——每一个问题都可能导致业务中断。和传统运维不同,K8s的故障链路更长:一个请求从
    的头像 发表于 02-26 09:47 314次阅读

    KubePi:开源Kubernetes可视化管理面板,让集群管理如此简单

    的部署、监控和维护,让即使不具备深厚Kubernetes知识的用户也能轻松管理集群。 1.2 核心价值:可视化集群管理 KubePi允许管理员导入多个Kubernetes集群,并通过精细的权限控制将不
    发表于 02-11 12:53

    Kubernetes kubectl命令行工具详解

    kubectl是Kubernetes官方提供的命令行工具,作为与Kubernetes集群交互的主要接口,它通过调用Kubernetes API Server实现对集群资源的全面管理。在生产环境中,运维工程师需要熟练掌握kubec
    的头像 发表于 02-02 16:40 600次阅读

    机器视觉网卡与普通网卡的5点关键不同

    统也使用网卡进行网络连接,但其所需的网卡通常与普通网卡存在显著差异。本文将深入探讨机器视觉网卡与普通网卡的差异,分析这些差异背后的原因,以及
    的头像 发表于 01-15 16:38 342次阅读
    机器视觉<b class='flag-5'>网卡</b>与普通<b class='flag-5'>网卡</b>的5点关键不同

    使用NVIDIA Grove简化Kubernetes上的复杂AI推理

    过去几年,AI 推理的部署已经从单一模型、单一 Pod 演变为复杂的多组件系统。如今,一个模型部署可能包含多个不同的组件——预填充 (prefill)、解码 (decode)、视觉编码
    的头像 发表于 11-14 10:25 5454次阅读
    使用NVIDIA Grove简化<b class='flag-5'>Kubernetes</b>上的复杂AI推理

    网融合时代:4G/Wi-Fi/以太网/虚拟网卡配置实战!

    在物联网与边缘计算快速发展的今天,掌握多种网络接口的配置至关重要。本文以实战为导向,详解4G、Wi-Fi、以太网和虚拟网卡的接入与协同策略。 网络适配器,它的一个更广为人知的名字是——网卡。   在
    的头像 发表于 10-09 18:25 427次阅读
    <b class='flag-5'>多</b>网融合时代:4G/Wi-Fi/以太网/虚拟<b class='flag-5'>网卡</b>配置实战!

    生产环境中Kubernetes容器安全的最佳实践

    随着容器化技术的快速发展,Kubernetes已成为企业级容器编排的首选平台。然而,在享受Kubernetes带来的便利性和可扩展性的同时,安全问题也日益凸显。本文将从运维工程师的角度,深入探讨生产环境中Kubernetes容器
    的头像 发表于 07-14 11:09 952次阅读

    详解Kubernetes中的Pod调度亲和性

    Kubernetes(K8s)中,Pod 调度亲和性(Affinity) 是一种高级调度策略,用于控制 Pod 与节点(Node)或其他 Pod 之间的关联(亲和)或反关联(反亲和
    的头像 发表于 06-07 13:56 1101次阅读

    Kubernetes Helm入门指南

    Helm 是 Kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 Kubernetes 应用的管理工作。Helm 的出现是为了解决在 Kubernetes
    的头像 发表于 04-30 13:42 3226次阅读
    <b class='flag-5'>Kubernetes</b> Helm入门指南