5.2. 配置和使用多个网络


安装 MicroShift Multus Container Network Interface (CNI)后,您可以使用其他网络插件。

5.2.1. IP 地址管理类型和额外网络

通过您配置的 IP 地址管理(IPAM) CNI 插件为额外网络置备 IP 地址。MicroShift 中支持的 IP 地址置备类型是 主机本地静态dhcp

5.2.1.1. 网桥接口特定

使用 网桥 类型接口和 dhcp IPAM 时,需要一个侦听桥接网络的 DHCP 服务器。如果您使用防火墙,通过运行 firewall-cmd --remove-service=dhcp 命令配置 firewalld 服务,以允许网络区上的 DHCP 流量。

5.2.1.2. macvlan 接口特定

macvlan 类型接口访问主机所连接的网络。这意味着,如果使用 dhcp IPAM 插件,接口可以从主机网络上的 DHCP 服务器接收 IP 地址。

5.2.1.3. IPVLAN 接口详情

ipvlan 接口还可以直接访问主机网络,但与主机接口共享 MAC 地址。由于共享 MAC 地址,ipvlan 类型接口不能与 dhcp 插件一起使用。IPAM 插件不支持使用 ClientID 的 DHCP 协议。

5.2.2. 为额外网络创建 NetworkAttachmentDefinition

使用以下步骤为额外网络创建 NetworkAttachmentDefinition 配置文件。在本例中,使用了 bridge-type 接口。您还可以使用此处的示例工作流,它使用 主机本地 IP 地址管理(IPAM)来配置其他支持的额外网络类型。

重要

如果您使用 bridgedhcp IPAM,则需要侦听桥接网络的 DHCP 服务器。如果您也使用防火墙,需要将 firewalld 服务配置为允许网络区上的 DHCP 流量。在这种情况下,您可以运行 firewall-cmd --remove-service=dhcp 命令。

先决条件

  • 已安装 MicroShift Multus CNI。
  • 已安装 OpenShift CLI (oc)。
  • 集群正在运行。

流程

  1. 可选:通过运行以下命令,验证 MicroShift 集群是否使用 Multus CNI 运行:

    $ oc get pods -n openshift-multus

    输出示例

    NAME                READY   STATUS    RESTARTS   AGE
    dhcp-daemon-dfbzw   1/1     Running   0          5h
    multus-rz8xc        1/1     Running   0          5h

  2. 运行以下命令并使用以下示例文件来创建 NetworkAttachmentDefinition 配置文件:

    $ oc apply -f network-attachment-definition.yaml

    NetworkAttachmentDefinition 文件示例

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: bridge-conf
    spec:
      config: '{
          "cniVersion": "0.4.0",
          "type": "bridge", 1
          "bridge": "br-test", 2
          "mode": "bridge",
          "ipam": {
            "type": "host-local", 3
            "ranges": [
              [
                {
                  "subnet": "10.10.0.0/24",
                  "rangeStart": "10.10.0.20",
                  "rangeEnd": "10.10.0.50",
                  "gateway": "10.10.0.254"
                 }
              ],
              [
                {
                  "subnet": "fd00:IJKL:MNOP:10::0/64", 4
                  "rangeStart": "fd00:IJKL:MNOP:10::1",
                  "rangeEnd": "fd00:IJKL:MNOP:10::9"
            "dataDir": "/var/lib/cni/br-test"
          }
        }'

    1
    type 值指定 CNI 插件的名称。本例使用 bridge 类型。
    2
    bridge 值是所用 MicroShift 主机上的网桥名称。pod 的额外接口连接到该网桥。如果主机上不存在接口,则 Bridge CNI 会创建它。如果接口已存在,它将被重复使用。在本例中,接口名称为 br-test
    3
    IPAM 类型。
    4
    IPv6 地址可以添加到二级接口。
    注意

    使用网桥的名称特定于插件 的网桥 类型。其他插件使用其 NetworkAttachmentDefinition 中的不同字段。例如,macvlanipvlan 配置使用 master 来指定要附加的主机接口。

5.2.3. 将 pod 添加到额外网络

您可以将 pod 添加到额外网络。在创建 pod 时,会附加额外网络。pod 继续通过默认网络发送与集群相关的普通网络流量。

如果要将额外网络附加到已在运行的 pod,您必须重启 pod。

先决条件

  • 已安装 OpenShift CLI (oc)。
  • 集群正在运行。
  • 要将 pod 附加到的 NetworkAttachmentDefinition 对象定义的网络。

流程

  1. Pod YAML 文件添加注解。只能使用以下注解格式之一:

    1. 要在没有自定义的情况下附加额外网络,请使用以下格式添加注解。将 & lt;network > 替换为要与 pod 关联的额外网络的名称:

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

      网桥类型额外网络的注解示例

      apiVersion: v1
      kind: Pod
      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: bridge-conf
      # ...

    2. 要通过自定义来附加额外网络,请添加具有以下格式的注解:

      apiVersion: v1
      kind: Pod
      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 YAML 文件并为额外网络添加 NetworkAttachmentDefinition 注解,请运行以下命令并使用示例 YAML:

    $ oc apply -f ./<test_bridge>.yaml 1
    1
    <test_bridge > 替换为您要使用的 pod 名称。

    输出示例

    pod/test_bridge created

    test_bridge pod YAML 示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: test_bridge
      annotations:
        k8s.v1.cni.cncf.io/networks: bridge-conf
      labels:
        app: test_bridge
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: hello-microshift
        image: quay.io/microshift/busybox:1.36
        command: ["/bin/sh"]
        args: ["-c", "while true; do echo -ne \"HTTP/1.0 200 OK\r\nContent-Length: 16\r\n\r\nHello MicroShift\" | nc -l -p 8080 ; done"]
        ports:
        - containerPort: 8080
          protocol: TCP
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          runAsNonRoot: true
          runAsUser: 1001
          runAsGroup: 1001
          seccompProfile:
            type: RuntimeDefault

  3. 确保 NetworkAttachmentDefinition 注解正确:

    NetworkAttachmentDefinition 注解示例

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: bridge-conf
    # ...

  4. 可选: 要确认 Pod YAML 中是否存在 NetworkAttachmentDefinition 注解,请运行以下命令,将 < name& gt; 替换为 pod 的名称。

    $ oc get pod <name> -o yaml 1
    1
    <name > 替换为您要使用的 pod 名称。在以下示例中,使用 &lt ;test_bridge& gt;。

    在以下示例中,test_bridge 附加到 net1 额外网络:

    $ oc get pod <test_bridge> -o yaml

    输出示例

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: bridge-conf
        k8s.v1.cni.cncf.io/network-status: |- 1
          [{
              "name": "ovn-kubernetes",
              "interface": "eth0",
              "ips": [
                  "10.42.0.18"
              ],
              "default": true,
              "dns": {}
          },{
              "name": "bridge-conf",
              "interface": "net1",
              "ips": [
                  "20.2.2.100"
              ],
              "mac": "22:2f:60:a5:f8:00",
              "dns": {}
          }]
      name: pod
      namespace: default
    spec:
    # ...
    status:
    # ...

    1
    k8s.v1.cni.cncf.io/network-status 参数是对象的 JSON 数组。每个对象描述附加到 pod 的额外网络的状态。注解值保存为纯文本值。
  5. 运行以下命令验证 pod 是否正在运行:

    $ oc get pod

    输出示例

    NAME          READY   STATUS    RESTARTS   AGE
    test_bridge   1/1     Running   0          81s

5.2.4. 配置额外网络

创建 NetworkAttachmentDefinition 对象并应用后,请使用以下示例步骤配置额外网络。在本例中,使用 网桥 类型额外网络。您还可以将此工作流用于其他额外网络类型。

前提条件

  1. 已创建并应用 NetworkAttachmentDefinition 对象配置。

流程

  1. 运行以下命令,验证主机上是否已创建网桥:

    $ ip a show br-test

    输出示例

    22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff
        inet6 fe80::34e2:bbff:fed2:31f2/64 scope link
           valid_lft forever preferred_lft forever

  2. 运行以下命令,为网桥配置 IP 地址:

    $ sudo ip addr add 10.10.0.10/24 dev br-test
  3. 运行以下命令,验证 IP 地址配置是否已添加到网桥中:

    $ ip a show br-test

    输出示例

    22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff
        inet 10.10.0.10/24 scope global br-test 1
           valid_lft forever preferred_lft forever
        inet6 fe80::34e2:bbff:fed2:31f2/64 scope link
           valid_lft forever preferred_lft forever

    1
    IP 地址按预期配置。
  4. 运行以下命令验证 pod 的 IP 地址:

    $ oc get pod test-bridge --output=jsonpath='{.metadata.annotations.k8s\.v1\.cni\.cncf\.io/network-status}'

    输出示例

    [{
        "name": "ovn-kubernetes",
        "interface": "eth0",
        "ips": [
            "10.42.0.17"
        ],
        "mac": "0a:58:0a:2a:00:11",
        "default": true,
        "dns": {}
    },{
        "name": "default/bridge-conf", 1
        "interface": "net1",
        "ips": [
            "10.10.0.20"
        ],
        "mac": "82:01:98:e5:0c:b7",
        "dns": {}

    1
    网桥额外网络会如预期附加。
  5. 可选: 您可以使用 oc exec 访问 pod 并使用 ip 命令确认其接口:

    $ oc exec -ti test-bridge -- ip a

    输出示例

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
        link/ether 0a:58:0a:2a:00:11 brd ff:ff:ff:ff:ff:ff
        inet 10.42.0.17/24 brd 10.42.0.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::858:aff:fe2a:11/64 scope link
           valid_lft forever preferred_lft forever
    3: net1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
        link/ether 82:01:98:e5:0c:b7 brd ff:ff:ff:ff:ff:ff
        inet 10.10.0.20/24 brd 10.10.0.255 scope global net1 1
           valid_lft forever preferred_lft forever
        inet6 fe80::8001:98ff:fee5:cb7/64 scope link
           valid_lft forever preferred_lft forever

    1
    pod 按预期附加到 net1 接口上 1 0.10.0.20 IP 地址。
  6. 通过从 MicroShift 主机访问 pod 中的 HTTP 服务器,确认连接正常工作。使用以下命令:

    $ curl 10.10.0.20:8080

    输出示例

    Hello MicroShift

5.2.5. 从额外网络中删除 pod

您只能通过删除 pod 来从额外网络中删除 pod。

先决条件

  • 一个额外网络被附加到 pod。
  • 安装 OpenShift CLI(oc)。
  • 登录到集群。

流程

  • 要删除 pod,输入以下命令:

    $ oc delete pod <name> -n <namespace>
    • <name> 是 pod 的名称。
    • <namespace> 是包含 pod 的命名空间。

5.2.6. Multus 网络故障排除

如果没有正确配置多个网络的设置,pod 可能无法启动。以下步骤可帮助您解决几个常见情况。

5.2.6.1. 无法配置 Pod 网络

如果 Multus CNI 插件无法将网络注解应用到 pod,则 pod 不会启动。如果任何额外网络 CNI 失败,Pod 也可以启动。

错误示例

Warning  NoNetworkFound     0s     multus    cannot find a network-attachment-definitio (asdasd) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-ref-doesnt-exist" not found

在这种情况下,您可以执行以下步骤来解决 CNI 失败:

  • 验证 NetworkAttachmentDefinition 和 annotations 中的值。
  • 删除注解,以验证是否仅使用默认网络成功创建 pod。如果没有,这可能表示 Multus 配置以外的网络问题。
  • 如果您是设备管理员,您可以检查 crio.servicemicroshift.service 日志,请特别注意 kubelet 生成的。

    例如,kubelet 中的以下错误显示主 CNI 没有运行。这种情况可能是由 pod 没有启动,或者因为 CRI-O 错误配置(如不正确的 cni_default_network 设置)导致。

    kubelet-generated 错误示例

    Feb 06 13:47:31 dev microshift[1494]: kubelet E0206 13:47:31.163290    1494 pod_workers.go:1298] "Error syncing pod, skipping" err="network is not ready: container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: No CNI configuration file in /etc/cni/net.d/. Has your network provider started?" pod="default/samplepod" podUID="fe0f7f7a-8c47-4488-952b-8abc0d8e2602"

5.2.6.2. 缺少配置文件

有时无法创建 pod,因为注解引用了不存在的 NetworkAttachmentDefinition 配置 YAML。在这种情况下,通常会生成类似如下的错误:

日志示例

cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-conf" not found" pod="default/samplepod"`

错误输出示例

"CreatePodSandbox for pod failed" err="rpc error: code = Unknown desc = failed to create pod network sandbox k8s_samplepod_default_5fa13105-1bfb-4c6b-aee7-3437cfb50e25_0(7517818bd8e85f07b551f749c7529be88b4e7daef0dd572d049aa636950c76c6): error adding pod default_samplepod to CNI network \"multus-cni-network\": plugin type=\"multus\" name=\"multus-cni-network\" failed (add): Multus: [default/samplepod/5fa13105-1bfb-4c6b-aee7-3437cfb50e25]: error loading k8s delegates k8s args: TryLoadPodDelegates: error in getting k8s network for pod: GetNetworkDelegates: failed getting the delegate: getKubernetesDelegate: cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io \"bad-conf\" not found" pod="default/samplepod"

若要修复此错误,请创建并应用 NetworkAttachmentDefinition YAML。

5.2.7. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.