3.3. 将 pod 附加到二级网络


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

3.3.1. 将 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
      Copy to Clipboard Toggle word wrap
      1
      要指定多个二级网络,请使用逗号分隔每个网络。逗号之间不可包括空格。如果您多次指定相同的二级网络,则该 pod 会将多个网络接口附加到该网络。
    2. 要通过自定义来附加二级网络,请添加具有以下格式的注解:

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: |-
            [
              {
                "name": "<network>", 
      1
      
                "namespace": "<namespace>", 
      2
      
                "default-route": ["<default_route>"] 
      3
      
              }
            ]
      Copy to Clipboard Toggle word wrap
      1
      指定 NetworkAttachmentDefinition 对象定义的二级网络的名称。
      2
      指定定义 NetworkAttachmentDefinition 对象的命名空间。
      3
      可选:为默认路由指定覆盖,如 192.168.17.1
  2. 运行以下命令来创建 pod。将 <name> 替换为 pod 的名称。

    $ oc create -f <name>.yaml
    Copy to Clipboard Toggle word wrap
  3. 可选: 要确认 Pod CR 中是否存在注解,请输入以下命令将 <name> 替换为 pod 的名称。

    $ oc get pod <name> -o yaml
    Copy to Clipboard Toggle word wrap

    在以下示例中,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:
      ...
    Copy to Clipboard Toggle word wrap
    1
    k8s.v1.cni.cncf.io/network-status 参数是对象的 JSON 数组。每个对象描述附加到 pod 的二级网络的状态。注解值保存为纯文本值。

3.3.1.1. 指定特定于 pod 的地址和路由选项

将 pod 附加到二级网络时,您可能需要在特定 pod 中指定有关该网络的其他属性。这可让您更改路由的某些方面,并指定静态 IP 地址和 MAC 地址。要达到此目的,您可以使用 JSON 格式的注解。

先决条件

  • pod 必须与二级网络位于同一个命名空间中。
  • 安装 OpenShift CLI (oc) 。
  • 您必须登录集群。

流程

要在指定地址和/或路由选项的同时将 pod 添加到二级网络,请完成以下步骤:

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

    $ oc edit pod <name>
    Copy to Clipboard Toggle word wrap
  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>,...]]'
    # ...
    Copy to Clipboard Toggle word wrap

    其中:

    <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
    Copy to Clipboard Toggle word wrap

    其中:

    name
    name 是与 pod 关联的二级网络的名称。
    default-route
    default-route 指定了一个网关,当在路由表中没有其它路由条目时使用这个网关。如果指定了多个 default-route 键,这将导致 pod 无法成为活跃状态。

    默认路由将导致任何没有在其它路由中指定的流量被路由到网关。

    重要

    将 OpenShift Container Platform 的默认路由设置为默认网络接口以外的接口时,可能会导致应该是 pod 和 pod 间的网络流量被路由到其他接口。

    要验证 pod 的路由属性,可使用 oc 命令在 pod 中执行 ip 命令。

    $ oc exec -it <pod_name> -- ip route
    Copy to Clipboard Toggle word wrap
    注意

    您还可以通过 JSON 格式的对象列表中的 default-route 键来引用 pod 的 k8s.v1.cni.cncf.io/network-status 来查看哪个二级网络已被分配默认路由。

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

  3. 运行以下命令来编辑 CNO CR:

    $ oc edit networks.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap

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

    Cluster Network Operator YAML 配置

    name: <name> 
    1
    
    namespace: <namespace> 
    2
    
    rawCNIConfig: '{ 
    3
    
      ...
    }'
    type: Raw
    Copy to Clipboard Toggle word wrap

    其中:

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

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

    使用静态 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"
        }]
    }
    Copy to Clipboard Toggle word wrap

    其中:

    name
    指定要创建的二级网络附加的名称。该名称在指定的 namespace 中需要是唯一的。
    plugins
    指定 CNI 插件配置的数组。第一个对象指定 macvlan 插件配置,第二个对象指定 tuning 插件配置。
    ips
    指定一个请求启用 CNI 插件运行时配置功能的静态 IP 地址功能。
    master
    指定 macvlan 插件使用的接口。
    mac
    指定一个请求启用 CNI 插件的静态 MAC 地址功能。

    以上网络附加可能会以 JSON 格式的注解引用,同时使用相关的键来指定将哪些静态 IP 和 MAC 地址分配给指定 pod。

    使用以下内容编辑 pod:

    $ oc edit pod <name>
    Copy to Clipboard Toggle word wrap

    使用静态 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
    
          }
        ]'
    Copy to Clipboard Toggle word wrap

    1 1 1 1
    使用在创建 rawCNIConfig 时提供的 <name>
    2 2 2 2
    提供包括子网掩码的 IP 地址。
    3 3 3
    提供 MAC 地址。
    注意

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

  4. 要验证一个带有二级网络的 pod 的 IP 地址和 MAC 属性,请使用 oc 命令在 pod 中执行 ip 命令。

    $ oc exec -it <pod_name> -- ip a
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat