17.5. 将 pod 附加到额外网络
您可以将 pod 附加到二级网络。将 pod 附加到二级网络可让 pod 使用主集群网络之外的其他网络接口。
17.5.1. 将 pod 添加到额外网络 复制链接链接已复制到粘贴板!
您可以将 pod 添加到二级网络。pod 继续通过默认网络发送与集群相关的普通网络流量。
创建 pod 时会附加额外网络。但是,如果 pod 已存在,您无法为其附加额外网络。
pod 必须与额外网络处于相同的命名空间。
先决条件
-
安装 OpenShift CLI(
oc)。 - 登录到集群。
流程
为
Pod对象添加注解。只能使用以下注解格式之一:要在没有自定义的情况下附加二级网络,请使用以下格式添加注解:
metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]其中:
k8s.v1.cni.cncf.io/networks- 指定要与 pod 关联的二级网络的名称。要指定多个二级网络,请使用逗号分隔每个网络。逗号之间不可包括空格。如果您多次指定相同的二级网络,则该 pod 会将多个网络接口附加到该网络。
要通过自定义来附加二级网络,请添加具有以下格式的注解:
metadata: annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "<network>", "namespace": "<namespace>", "default-route": ["<default_route>"] } ]其中:
name-
指定
NetworkAttachmentDefinition对象定义的二级网络的名称。 namespace-
指定定义
NetworkAttachmentDefinition对象的命名空间。 default-route-
可选参数。为默认路由指定覆盖,如
192.168.17.1。
运行以下命令来创建 pod。
$ oc create -f <name>.yaml将
<name>替换为 pod 的名称。可选:输入以下命令确认
podCR 中是否存在注解。将<name>替换为 pod 的名称。$ oc get pod <name> -o yaml在以下示例中,
example-podpod 附加到net1额外网络:$ oc get pod example-pod -o yaml apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: macvlan-bridge k8s.v1.cni.cncf.io/network-status: |- [{ "name": "openshift-sdn", "interface": "eth0", "ips": [ "10.128.2.14" ], "default": true, "dns": {} },{ "name": "macvlan-bridge", "interface": "net1", "ips": [ "20.2.2.100" ], "mac": "22:2f:60:a5:f8:00", "dns": {} }] name: example-pod namespace: default spec: ... status: ...其中:
k8s.v1.cni.cncf.io/network-status- 指定对象的 JSON 数组。每个对象描述附加到 pod 的二级网络的状态。注解值保存为纯文本值。
17.5.1.1. 指定特定于 pod 的地址和路由选项 复制链接链接已复制到粘贴板!
您可以使用 JSON 格式的注解配置特定于 pod 的地址和路由选项。配置这些选项可让您为 pod 设置静态 IP 地址、MAC 地址和默认路由。
先决条件
- pod 必须与额外网络处于相同的命名空间。
-
安装 OpenShift CLI (
oc) 。 - 您必须登录集群。
流程
编辑
Pod资源定义。如果要编辑现有Pod资源,请运行以下命令在默认编辑器中编辑其定义。将<name>替换为要编辑的Pod资源的名称。$ oc edit pod <name>在
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>,...]]' # ...其中:
<network>- 如以下示例所示,将 替换为 JSON 对象。单引号是必需的。
在以下示例中,通过
default-route参数,注解指定了哪个网络附加将使用默认路由。apiVersion: v1 kind: Pod metadata: name: example-pod annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "net1" }, { "name": "net2", "default-route": ["192.0.2.1"] }]' spec: containers: - name: example-pod command: ["/bin/bash", "-c", "sleep 2000000000000"] image: centos/tools其中:
name- 指定要与 pod 关联的二级网络的名称。
default-route-
如果路由表中没有其他路由条目,则指定要路由的流量的值。如果指定了多个
default-route键,这将导致 pod 无法成为活跃状态。
默认路由将导致任何没有在其它路由中指定的流量被路由到网关。
重要将 OpenShift Container Platform 的默认路由设置为默认网络接口以外的接口时,可能会导致应该是 pod 和 pod 间的网络流量被路由到其他接口。
要验证 pod 的路由属性,可使用
oc命令在 pod 中执行ip命令。$ oc exec -it <pod_name> -- ip route注意您还可以引用 pod 的
k8s.v1.cni.cncf.io/network-status来查看哪个额外网络已被分配默认路由,这可以通过 JSON 格式的对象列表中的default-route键存在。要为 pod 设置静态 IP 地址或 MAC 地址,您可以使用 JSON 格式的注解。这要求您创建允许此功能的网络。这可以在 CNO 的 rawCNIConfig 中指定。
运行以下命令来编辑 CNO CR:
$ oc edit networks.operator.openshift.io cluster以下 YAML 描述了 CNO 的配置参数:
Cluster Network Operator YAML 配置
name: <name> namespace: <namespace> rawCNIConfig: '{ ... }' type: Raw其中:
name-
指定您要创建的二级网络附加的名称。该名称在指定的
namespace中需要是唯一的。 namespace-
指定要在其中创建网络附加的命名空间。如果您未指定值,则使用
default命名空间。 rawCNIConfig- 以 JSON 格式指定 CNI 插件配置,它基于以下模板。
以下对象描述了使用 macvlan CNI 插件的静态 MAC 地址和 IP 地址的配置参数:
使用静态 IP 和 MAC 地址的 macvlan CNI 插件 JSON 配置对象
{ "cniVersion": "0.3.1", "name": "<name>", "plugins": [{ "type": "macvlan", "capabilities": { "ips": true }, "master": "eth0", "mode": "bridge", "ipam": { "type": "static" } }, { "capabilities": { "mac": true }, "type": "tuning" }] }其中:
name-
指定要创建的二级网络附加的名称。该名称在指定的
namespace中需要是唯一的。 plugins- 指定 CNI 插件配置的数组。第一个对象指定 macvlan 插件配置,第二个对象指定 tuning 插件配置。
ips- 指定一个请求启用 CNI 插件运行时配置功能的静态 IP 地址功能。
master- 指定 macvlan 插件使用的接口。
mac- 指定一个请求启用 CNI 插件的静态 MAC 地址功能。
以上网络附加可能会以 JSON 格式的注解引用,同时使用相关的键来指定将哪些静态 IP 和 MAC 地址分配给指定 pod。
输入以下命令编辑 pod:
$ oc edit pod <name>使用静态 IP 和 MAC 地址的 macvlan CNI 插件 JSON 配置对象
apiVersion: v1 kind: Pod metadata: name: example-pod annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "<name>", "ips": [ "192.0.2.205/24" ], "mac": "CA:FE:C0:FF:EE:00" } ]'其中:
name-
指定要创建的二级网络附加的名称。该名称在指定的
namespace中需要是唯一的。 ips- 指定包括子网掩码的 IP 地址。
mac- 指定 MAC 地址。
注意静态 IP 地址和 MAC 地址不需要同时使用。您可以单独使用它们,也可以一起使用。