当前位置: 首页 > 科技观察

KubernetesPodMulti-NICSolutionMultus中文入门指南_0

时间:2023-03-16 01:02:05 科技观察

许多CNI插件(如WeaveNet、Flannel、Calico等)都遵循这些规范。这些插件中的任何一个都可以在集群上使用和部署以提供网络解决方案。该网络称为集群的默认网络。这个默认网络使Pod不仅可以在同一节点上相互通信,还可以跨集群中的节点相互通信。随着它的发展,Kubernetes缺乏支持VNF中的多个网络接口所需的功能。传统上,网络功能使用多个网络接口来分离控制、管理和控制用户/数据网络平面。它们还用于支持不同的协议并满足不同的调整和配置要求。为了满足这一需求,英特尔为MULTUS实施了CNI插件,它提供了向Pod添加多个接口的能力。这允许一个pod通过不同的接口连接到多个网络,每个接口将使用自己的CNI插件。下面是连接到Pod的MultusCNI提供的网络接口的图示。该图显示了一个具有三个接口的容器:eth0、net0和net1。eth0连接Kubernetes集群网络,用于连接kubernetesservers/services(如Kubernetesapi-server、kubelet等)。net0和net1是其他网络附件,使用其他CNI插件(例如vlan/vxlan/ptp)连接到其他网络。MULTUS是如何工作的Kubernetes目前不提供为POD添加额外的接口选项,或多个CNI插件同时工作的规定,但它确实提供了一种机制来扩展API服务器支持的API。这可以使用“自定义资源定义”来完成。MULTUS依靠“自定义资源定义”来存储其他接口和CNI插件所需的信息。我们首先需要确保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”——自定义资源定义。自定义资源是扩展KubernetesAPI的一种方式。我们在这里使用这些来存储Multus可以读取的一些信息。首先,我们使用它们来存储附加到您的Pod的每个其他接口的配置。目前支持Kubernetes1.16+版本。安装我们推荐的部署Multus的快速启动方法是使用Daemonset(一种在集群中的每个节点上运行pod的方法)进行部署,该方法安装Multus二进制文件并配置Multus以供使用。首先,克隆这个GitHub存储库。$gitclonehttps://github.com/intel/multus-cni.git&&cdmultus-cni我们将在此存储库中使用带有kubectl的YAML文件。$cat./images/multus-daemonset.yml|kubectlapply-f-Multusdaemonset有用吗?启动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访问KubernetesAPI的身份验证信息。创建额外的接口我们要做的第一件事是为附加到Pod的每个其他接口创建配置。我们将通过创建自定义资源来做到这一点。Quickstart安装的一部分会创建一个“CRD”(自定义资源定义,这是我们保存这些自定义资源的地方),我们将在其中存储每个接口的配置。CNI配置我们将添加的每个配置都是CNI配置。如果您不熟悉它们,让我们快速分解它们。这是一个CNI配置示例:{"cniVersion":"0.3.0","type":"loopback","additional":"information"}CNI配置是JSON,我们这里有一个包含一些东西的结构interest:cniVersion:告诉每个CNI插件正在使用哪个版本,如果正在使用的版本太晚(或太早),可以提供插件信息。type:告诉CNI在磁盘上调用哪个二进制文件。每个CNI插件都是一个二进制文件。通常,这些二进制文件存储在每个节点上的/opt/cni/bin中,CNI执行此二进制文件。在本例中,我们指定了loopback二进制文件(它将创建一个loopback类型的网络接口)。如果这是您第一次安装Multus,您可能需要验证“类型”字段中的插件确实位于/opt/cni/bin目录中。additional:该字段以这里为例,每个CNI插件都可以在JSON中指定自己需要的任意配置参数。这些特定于您在“类型”字段中调用的二进制文件。当CNI配置更改时,您无需重新加载或刷新Kubelet。每次创建和删除pod时都会读取这些内容。因此,如果您更改配置,它将在下次创建pod时应用。如果现有pod需要新配置,则可能需要重新启动。将配置存储为自定义资源因此我们创建了一个额外的接口。让我们创建一个macvlan接口供pod使用。我们将创建一个自定义资源来定义接口的CNI配置。请注意,在以下命令中有一个:NetworkAttachmentDefinition。这是我们配置的名称——它是Kubernetes的自定义扩展,定义了我们如何将网络连接到pod。其次,注意配置字段。正如我们之前解释的那样,您将看到这是一个CNI配置。最后但同样重要的是,请注意元数据下的名称字段-在这里我们给这个配置一个名字,这是我们告诉pod使用这个配置的方式。这里的名字是macvlan-conf-我们正在为macvlan创建一个配置。以下是创建此示例配置的命令:apiVersion:"k8s.cni.cncf.io/v1"kind:NetworkAttachmentDefinitionmetadata:name:macvlan-confspec: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一样,它看起来很熟悉,但是,我们将有一个特殊的注释字段-在这种情况下,我们将有一个名为k8s.v1.cni.cncf.io的pod,用于/networks的注释。正如上面创建的,此字段在逗号分隔列表中列出NetworkAttachmentDefinitions的名称。请注意,在下面的命令中,我们对k8s.v1.cni.cncf.io/networks:macvlan-conf进行了注释,其中macvlan-conf是我们在创建配置时使用的名称。让我们继续使用以下命令创建一个pod:apiVersion:v1kind:Podmetadata:name:samplepodannotations:k8s.v1.cni.cncf.io/networks:macvlan-confspec:containers:-name:samplepodcommand:["/bin/ash","-c","trap:TERMINT;sleepinfinity&wait"]image:alpine您现在可以检查pod并查看连接了哪些接口,如下所示:$kubectlexec-itsamplepod--ipa你应该看到有3个接口:loloopback接口eth0我们的默认网络net1是我们使用macvlanconfig创建的新接口NetworkStatusAnnotations要确认,请使用kubectldescribepodpodsamplepod,然后会有一个注释部分,一些东西like在下面的内容中:注释:k8s.v1.cni.cncf.io/networks:macvlan-confk8s.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":"86:1d:96:ff:55:0d","dns":{}}]这个元数据告诉我们我们有两个成功运行的CNI插件如果我如果你想要更多接口?您可以通过创建更多自定义资源然后在pod的注释中引用它们来向pod添加更多接口。也可以复用配置,比如给一个Pod附加两个macvlan接口,可以这样创建Pod:apiVersion:v1kind:Podmetadata:name:samplepodannotations:k8s.v1.cni.cncf.io/networks:macvlan-conf,macvlan-confspec:containers:-name:samplepodcommand:["/bin/ash","-c","trap:TERMINT;sleepinfinity&wait"]image:alpine请注意,现在已阅读评论作为k8s.v1.cni.cncf.io/networks:macvlan-conf,macvlan-conf。如果我们有相同的配置使用两次,用逗号分隔。参考资料https://zhuanlan.zhihu.com/p/73863683