7.2. 将 Pod 附加到额外网络
作为集群用户,您可以将 Pod 附加到额外网络。
7.2.1. 将 Pod 添加到额外网络
您可以将 Pod 添加到额外网络。Pod 继续通过默认网络发送与集群相关的普通网络流量。
创建 Pod 时会附加额外网络。但是,如果 Pod 已存在,您无法为其附加额外网络。
先决条件
- Pod 必须与额外网络处于相同的命名空间。
-
安装 OpenShift CLI(
oc
)。 - 您必须登录集群。
流程
为 Pod 对象添加注解。只能使用以下注解格式之一:
要在没有自定义的情况下附加额外网络,请使用以下格式添加注解。将
<network>
替换为要与 Pod 关联的额外网络的名称:metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1
- 1
- 要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次指定同一额外网络,则 Pod 会将多个网络接口附加到该网络。
要通过自定义来附加额外网络,请添加具有以下格式的注解:
metadata: annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "<network>", 1 "namespace": "<namespace>", 2 "default-route": ["<default-route>"] 3 } ]
运行以下命令来创建 Pod。将
<name>
替换为 Pod 的名称。$ oc create -f <name>.yaml
可选: 要确认 Pod CR 中是否存在注解,请输入以下命令,将
<name>
替换为 Pod 的名称。$ oc get pod <name> -o yaml
在以下示例中,
example-pod
Pod 附加到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/networks-status: |- 1 [{ "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: ...
- 1
k8s.v1.cni.cncf.io/networks-status
参数是对象的 JSON 数组。每个对象描述附加到 Pod 的额外网络的状态。注解值保存为纯文本值。
7.2.1.1. 指定特定于 Pod 的地址和路由选项
将 Pod 附加到额外网络时,您可能需要在特定的 Pod 中指定有关该网络的其他属性。这可让您更改路由的某些方面,并指定静态 IP 地址和 MAC 地址。要达到此目的,您可以使用 JSON 格式的注解。
先决条件
- Pod 必须与额外网络处于相同的命名空间。
-
安装 OpenShift 命令行界面(
oc
)。 - 您必须登录集群。
流程
在指定地址和/或路由选项的同时,要将 Pod 添加到额外网络,请完成以下步骤:
编辑 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>,...]]' 1
- 1
- 将
<network>
替换为 JSON 对象,如下例所示。单引号是必需的。
在以下示例中,通过
default-route
参数,注解指定了哪个网络附加将使用默认路由。apiVersion: v1 kind: Pod metadata: name: example-pod annotations: k8s.v1.cni.cncf.io/networks: ' { "name": "net1" }, { "name": "net2", 1 "default-route": ["192.0.2.1"] 2 }' spec: containers: - name: example-pod command: ["/bin/bash", "-c", "sleep 2000000000000"] image: centos/tools
默认路由将导致任何没有在其它路由中指定的流量被路由到网关。
将 OpenShift Container Platform 的默认路由设置为默认网络接口以外的接口时,可能会导致应该是 Pod 和 Pod 间的网络流量被路由到其他接口。
要验证 Pod 的路由属性,可使用 oc
命令在 Pod 中执行 ip
命令。
$ oc exec -it <pod_name> -- ip route
您还可以引用 Pod 的 k8s.v1.cni.cncf.io/networks-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> 1 namespace: <namespace> 2 rawCNIConfig: '{ 3 ... }' type: Raw
以下对象描述了使用 macvlan CNI 插件的静态 MAC 地址和 IP 地址的配置参数:
使用静态 IP 和 MAC 地址的 macvlan CNI 插件 JSON 配置对象
{ "cniVersion": "0.3.1", "plugins": [{ 1 "type": "macvlan", "capabilities": { "ips": true }, 2 "master": "eth0", 3 "mode": "bridge", "ipam": { "type": "static" } }, { "capabilities": { "mac": true }, 4 "type": "tuning" }] }
然后,以上网络附加可能会以 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>", 1 "ips": [ "192.0.2.205/24" ], 2 "mac": "CA:FE:C0:FF:EE:00" 3 } ]'
静态 IP 地址和 MAC 地址不需要同时使用,您可以单独使用,也可以一起使用。
要验证一个带有额外网络的 Pod 的 IP 地址和 MAC 属性,请使用 oc
命令在 Pod 中执行 ip 命令。
$ oc exec -it <pod_name> -- ip a