3.3. 将 pod 附加到二级网络
您可以将 pod 附加到二级网络。将 pod 附加到二级网络可让 pod 使用主集群网络之外的其他网络接口。
3.3.1. 将 pod 添加到二级网络 复制链接链接已复制到粘贴板!
您可以将 pod 添加到二级网络。pod 继续通过默认网络发送与集群相关的普通网络流量。
创建 pod 时,二级网络会附加到 pod。但是,如果 pod 已存在,则无法将二级网络附加到其中。
pod 必须与二级网络位于同一个命名空间中。
先决条件
-
安装 OpenShift CLI(
oc)。 - 登录到集群。
流程
为
Pod对象添加注解。只能使用以下注解格式之一:要在没有自定义的情况下附加二级网络,请使用以下格式添加注解:
metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
k8s.v1.cni.cncf.io/networks- 指定要与 pod 关联的二级网络的名称。要指定多个二级网络,请使用逗号分隔每个网络。逗号之间不可包括空格。如果您多次指定相同的二级网络,则该 pod 会将多个网络接口附加到该网络。
要通过自定义来附加二级网络,请添加具有以下格式的注解:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
name-
指定
NetworkAttachmentDefinition对象定义的二级网络的名称。 namespace-
指定定义
NetworkAttachmentDefinition对象的命名空间。 default-route-
可选参数。为默认路由指定覆盖,如
192.168.17.1。
运行以下命令来创建 pod。
oc create -f <name>.yaml
$ oc create -f <name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<name>替换为 pod 的名称。可选:输入以下命令确认
podCR 中是否存在注解。将<name>替换为 pod 的名称。oc get pod <name> -o yaml
$ oc get pod <name> -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例中,
example-podpod 附加到net1二级网络:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
k8s.v1.cni.cncf.io/network-status- 指定对象的 JSON 数组。每个对象描述附加到 pod 的二级网络的状态。注解值保存为纯文本值。
3.3.1.1. 指定特定于 pod 的地址和路由选项 复制链接链接已复制到粘贴板!
您可以使用 JSON 格式的注解配置特定于 pod 的地址和路由选项。配置这些选项可让您为 pod 设置静态 IP 地址、MAC 地址和默认路由。
先决条件
- pod 必须与二级网络位于同一个命名空间中。
-
安装 OpenShift CLI (
oc) 。 - 您必须登录集群。
流程
编辑
Pod资源定义。如果要编辑现有Pod资源,请运行以下命令在默认编辑器中编辑其定义。将<name>替换为要编辑的Pod资源的名称。oc edit pod <name>
$ oc edit pod <name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
Pod资源定义中,将k8s.v1.cni.cncf.io/networks参数添加到 podmetadata映射中。k8s.v1.cni.cncf.io/networks接受 JSON 字符串,该字符串除指定附加属性外,还引用NetworkAttachmentDefinition自定义资源(CR)名称的对象。metadata: annotations: k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]' # ...metadata: annotations: k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]' # ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<network>- 如以下示例所示,将 替换为 JSON 对象。单引号是必需的。
在以下示例中,通过
default-route参数,注解指定了哪个网络附加将使用默认路由。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
name- 指定要与 pod 关联的二级网络的名称。
default-route-
如果路由表中没有其他路由条目,则指定要路由的流量的值。如果指定了多个
default-route键,这将导致 pod 无法成为活跃状态。
默认路由将导致任何没有在其它路由中指定的流量被路由到网关。
重要将 OpenShift Container Platform 的默认路由设置为默认网络接口以外的接口时,可能会导致应该是 pod 和 pod 间的网络流量被路由到其他接口。
要验证 pod 的路由属性,可使用
oc命令在 pod 中执行ip命令。oc exec -it <pod_name> -- ip route
$ oc exec -it <pod_name> -- ip routeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您还可以通过 JSON 格式的对象列表中的
default-route键来引用 pod 的k8s.v1.cni.cncf.io/network-status来查看哪个二级网络已被分配默认路由。要为 pod 设置静态 IP 地址或 MAC 地址,您可以使用 JSON 格式的注解。这要求您创建允许此功能的网络。这可以在 CNO 的 rawCNIConfig 中指定。
运行以下命令来编辑 CNO CR:
oc edit networks.operator.openshift.io cluster
$ oc edit networks.operator.openshift.io clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下 YAML 描述了 CNO 的配置参数:
Cluster Network Operator YAML 配置
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
name-
指定您要创建的二级网络附加的名称。该名称在指定的
namespace中需要是唯一的。 namespace-
指定要在其中创建网络附加的命名空间。如果您未指定值,则使用
default命名空间。 rawCNIConfig- 以 JSON 格式指定 CNI 插件配置,它基于以下模板。
以下对象描述了使用 macvlan CNI 插件的静态 MAC 地址和 IP 地址的配置参数:
使用静态 IP 和 MAC 地址的 macvlan CNI 插件 JSON 配置对象
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
name-
指定要创建的二级网络附加的名称。该名称在指定的
namespace中需要是唯一的。 plugins- 指定 CNI 插件配置的数组。第一个对象指定 macvlan 插件配置,第二个对象指定 tuning 插件配置。
ips- 指定一个请求启用 CNI 插件运行时配置功能的静态 IP 地址功能。
master- 指定 macvlan 插件使用的接口。
mac- 指定一个请求启用 CNI 插件的静态 MAC 地址功能。
以上网络附加可能会以 JSON 格式的注解引用,同时使用相关的键来指定将哪些静态 IP 和 MAC 地址分配给指定 pod。
输入以下命令编辑 pod:
oc edit pod <name>
$ oc edit pod <name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用静态 IP 和 MAC 地址的 macvlan CNI 插件 JSON 配置对象
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
name-
指定要创建的二级网络附加的名称。该名称在指定的
namespace中需要是唯一的。 ips- 指定包括子网掩码的 IP 地址。
mac- 指定 MAC 地址。
注意静态 IP 地址和 MAC 地址不需要同时使用。您可以单独使用它们,也可以一起使用。