×

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

将Pod添加到附加网络

您可以将Pod添加到附加网络。Pod将继续通过默认网络发送正常的集群相关网络流量。

创建Pod时,附加网络会附加到它。但是,如果Pod已经存在,则无法将附加网络附加到它。

Pod必须与附加网络位于相同的命名空间。

先决条件
  • 安装OpenShift CLI (oc)。

  • 登录到集群。

步骤
  1. Pod对象添加注释。只能使用以下注释格式之一

    1. 要附加附加网络而无需任何自定义,请使用以下格式添加注释。将<network>替换为要与Pod关联的附加网络的名称

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] (1)
      1 要指定多个附加网络,请用逗号分隔每个网络。逗号之间不要包含空格。如果多次指定相同的附加网络,则该Pod将有多个网络接口附加到该网络。
    2. 要附加具有自定义的附加网络,请使用以下格式添加注释

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: |-
            [
              {
                "name": "<network>", (1)
                "namespace": "<namespace>", (2)
                "default-route": ["<default-route>"] (3)
              }
            ]
      1 指定由NetworkAttachmentDefinition对象定义的附加网络的名称。
      2 指定定义NetworkAttachmentDefinition对象的命名空间。
      3 可选:指定默认路由的覆盖,例如192.168.17.1
  2. 要创建Pod,请输入以下命令。将<name>替换为Pod的名称。

    $ oc create -f <name>.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/network-status: |- (1)
          [{
              "name": "ovn-kubernetes",
              "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/network-status参数是对象的JSON数组。每个对象都描述附加到Pod的附加网络的状态。注释值存储为纯文本值。

指定Pod特定的寻址和路由选项

将Pod附加到附加网络时,您可能希望在特定Pod中指定有关该网络的更多属性。这允许您更改某些路由方面,以及指定静态IP地址和MAC地址。为此,您可以使用JSON格式的注释。

先决条件
  • Pod必须与附加网络位于相同的命名空间。

  • 安装OpenShift CLI (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的路由属性,可以使用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中指定。

  1. 运行以下命令编辑CNO CR

    $ oc edit networks.operator.openshift.io cluster

以下YAML描述了CNO的配置参数

集群网络操作员YAML配置
name: <name> (1)
namespace: <namespace> (2)
rawCNIConfig: '{ (3)
  ...
}'
type: Raw
1 为要创建的附加网络附件指定一个名称。此名称在指定的namespace内必须唯一。
2 指定创建网络附件的命名空间。如果不指定值,则使用default命名空间。
3 以JSON格式指定CNI插件配置,该配置基于以下模板。

以下对象描述了使用静态MAC地址和IP地址的macvlan CNI插件的配置参数

使用静态IP和MAC地址的macvlan CNI插件JSON配置对象
{
  "cniVersion": "0.3.1",
  "name": "<name>", (1)
  "plugins": [{ (2)
      "type": "macvlan",
      "capabilities": { "ips": true }, (3)
      "master": "eth0", (4)
      "mode": "bridge",
      "ipam": {
        "type": "static"
      }
    }, {
      "capabilities": { "mac": true }, (5)
      "type": "tuning"
    }]
}
1 指定要创建的附加网络附件的名称。此名称在指定的namespace内必须唯一。
2 指定CNI插件配置数组。第一个对象指定macvlan插件配置,第二个对象指定调整插件配置。
3 指定请求启用CNI插件运行时配置功能的静态IP地址功能。
4 指定macvlan插件使用的接口。
5 指定请求启用CNI插件的静态MAC地址功能。

上述网络附件可以在JSON格式的注释中引用,并带有键以指定将为给定Pod分配哪个静态IP和MAC地址。

使用以下命令编辑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