7.2. 将 Pod 附加到额外网络

作为集群用户,您可以将 Pod 附加到额外网络。

7.2.1. 将 Pod 添加到额外网络

您可以将 Pod 添加到额外网络。Pod 继续通过默认网络发送与集群相关的普通网络流量。

先决条件

  • Pod 必须与额外网络处于相同的命名空间。
  • 安装 OpenShift 命令行界面 (CLI),通常称为 oc
  • 您必须登录集群。

流程

要添加带有额外网络的 Pod,请完成以下步骤:

  1. 在 Pod 资源定义中,将 k8s.v1.cni.cncf.io/networks 参数添加到 Pod metadata 映射中。k8s.v1.cni.cncf.io/networks 接受由一个或多个 NetworkAttachmentDefinition 自定义资源 (CR) 名称组成并用逗号分隔的字符串:

    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1
    1
    <network> 替换为要与 Pod 关联的额外网络的名称。要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次指定同一额外网络,则 Pod 会将多个网络接口附加到该网络。

    在以下示例中,两个额外网络附加到 Pod:

    apiVersion: v1
    kind: Pod
    metadata:
      name: example-pod
      annotations:
        k8s.v1.cni.cncf.io/networks: net1,net2
    spec:
      containers:
      - name: example-pod
        command: ["/bin/bash", "-c", "sleep 2000000000000"]
        image: centos/tools
  2. 运行以下命令来创建 Pod:

    $ oc create -f pod.yaml
  3. 可选:通过运行以下命令,确认 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 添加到额外网络,请完成以下步骤:

  1. 编辑 Pod 资源定义。如果您要编辑现有的 Pod,请运行以下命令在默认编辑器中编辑其定义。将 <name> 替换为要编辑的 Pod 的名称。

    $ oc edit pod <name>
  2. 在 Pod 资源定义中,将 k8s.v1.cni.cncf.io/networks 参数添加到 Pod metadata 映射。k8s.v1.cni.cncf.io/networks 接受一个 JSON 字符串,该字符串除指定附加属性外,还引用 NetworkAttachmentDefinition 自定义资源 (CR) 名称的对象。

    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]' 1
    1
    <network> 替换为 JSON 对象,如下例所示。单引号是必需的。
  3. 在以下示例中,通过 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
    1
    name 是与 Pod 关联的额外网络的名称。
    2
    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/networks-status 来查看哪个额外网络已经分配了默认路由,这可以通过 JSON 格式的对象列表中的 default-route 键实现。

要为 Pod 设置静态 IP 地址或 MAC 地址,可以使用 JSON 格式的注解。这要求您创建允许此功能的网络。这可以在 CNO 的 rawCNIConfig 中指定。

  1. 运行以下命令来编辑 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

1
为您要创建的额外网络附加指定名称。该名称在指定的 namespace 中需要是唯一的。
2
指定要在其中创建网络附加的命名空间。如果您未指定值,则使用 default 命名空间。
3
基于以下模板,以 JSON 格式指定 CNI 插件配置。

以下对象描述了使用 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"
    }]
}

1
plugins 字段指定了一个 CNI 配置的配置列表。
2
capabilities 键表示正在发出请求来启用 CNI 插件运行时配置功能的静态 IP 功能。
3
master 字段专用于 macvlan 插件。
4
这里的 capabilities 键表示请求启用 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>", 1
        "ips": [ "192.0.2.205/24" ], 2
        "mac": "CA:FE:C0:FF:EE:00" 3
      }
    ]'

1
使用在创建 rawCNIConfig 时提供的 <name>
2
提供所需的 IP 地址。
3
提供所需的 MAC 地址。
注意

静态 IP 地址和 MAC 地址不需要同时使用,您可以单独使用,也可以一起使用。

要验证一个带有额外网络的 Pod 的 IP 地址和 MAC 属性,请使用 oc 命令在 Pod 中执行 ip 命令。

$ oc exec -it <pod_name> -- ip a