24.6. 从 OpenShift SDN 网络插件迁移


作为集群管理员,您可以从 OpenShift SDN 网络插件迁移到 OVN-Kubernetes 网络插件。

您可以使用离线迁移方法从 OpenShift SDN 网络插件迁移到 OVN-Kubernetes 插件。离线迁移是一个手动过程,会包括一些停机时间。

24.6.1. 迁移到 OVN-Kubernetes 网络插件

迁移到 OVN-Kubernetes 网络插件是一个手动的过程,其中会包括一些停机时间,在此期间集群无法被访问。

重要

在将 OpenShift Container Platform 集群迁移到使用 OVN-Kubernetes 网络插件前,将集群更新至最新的 z-stream 版本,以便所有最新的程序错误修复都应用到集群。

虽然提供了一个回滚过程,但迁移通常被认为是一个单向过程。

在以下平台上支持迁移到 OVN-Kubernetes 网络插件:

  • 裸机硬件
  • Amazon Web Services (AWS)
  • Google Cloud Platform (GCP)
  • IBM Cloud®
  • Microsoft Azure
  • Red Hat OpenStack Platform (RHOSP)
  • VMware vSphere
重要

Red Hat OpenShift Dedicated, Azure Red Hat OpenShift(ARO), 和 Red Hat OpenShift Service on AWS (ROSA) 上的受管 OpenShift 云服务不支持迁移到 OVN-Kubernetes 网络插件。

Nutanix 不支持从 OpenShift SDN 网络插件迁移到 OVN-Kubernetes 网络插件。

如果您在 OpenShift Container Platform 集群中有超过 150 个节点,请创建一个支持问题单,供您迁移到 OVN-Kubernetes 网络插件。

迁移过程中不会保留分配给节点的子网以及分配给各个 pod 的 IP 地址。

虽然 OVN-Kubernetes 网络插件实现 OpenShift SDN 网络插件中存在的许多功能,但配置并不相同。

  • 如果您的集群使用以下 OpenShift SDN 网络插件功能,您必须在 OVN-Kubernetes 网络插件中手动配置相同的功能:

    • 命名空间隔离
    • 出口路由器 pod
  • 在迁移到 OVN-Kubernetes 之前,请确保不使用以下 IP 地址范围:100.64.0.0/16, 169.254.169.0/29, 100.88.0.0/16, fd98::/64, fd69::/125, 和 fd97::/64。OVN-Kubernetes 在内部使用这些范围。不要在集群或基础架构的任何其他 CIDR 定义中包含这些范围。
  • 如果您的带有 Precision Time Protocol (PTP) 的 openshift-sdn 集群使用 User Datagram Protocol (UDP) 进行硬件时间戳,且迁移到 OVN-Kubernetes 插件,则硬件时间戳无法应用到主接口设备,如 Open vSwitch (OVS) 网桥。因此,UDP 版本 4 配置无法使用 br-ex 接口。

以下小节重点介绍了上述功能在 OVN-Kubernetes 和 OpenShift SDN 网络插件中的配置差异。

24.6.1.1.1. 主网络接口

OpenShift SDN 插件允许 NodeNetworkConfigurationPolicy (NNCP)自定义资源(CR)的应用程序到节点上的主接口。OVN-Kubernetes 网络插件没有此功能。

如果您的 NNCP 应用到主接口,则必须在迁移到 OVN-Kubernetes 网络插件前删除 NNCP。删除 NNCP 不会从主接口中删除配置,但使用 OVN-Kubernetes,Kubernetes NMState 无法管理此配置。相反,configure-ovs.sh shell 脚本管理附加到这个接口的主接口和配置。

24.6.1.1.2. 命名空间隔离

OVN-Kubernetes 仅支持网络策略隔离模式。

重要

对于使用在多租户或子网隔离模式下配置的 OpenShift SDN 的集群,您仍然可以迁移到 OVN-Kubernetes 网络插件。请注意,在迁移操作后,多租户隔离模式会被丢弃,因此您必须手动配置网络策略,以便为 Pod 和服务达到相同的项目级别的隔离。

24.6.1.1.3. 出口 IP 地址

OpenShift SDN 支持两种不同的 Egress IP 模式:

  • 自动分配方法中,给节点分配一个出口 IP 地址范围。
  • 手动分配方法中,给节点分配包含一个或多个出口 IP 地址的列表。

迁移过程支持迁移使用自动分配模式的 Egress IP 配置。

下表中描述了在 OVN-Kubernetes 和 OpenShift SDN 配置出口 IP 地址的不同:

Expand
表 24.4. 出口 IP 地址配置的不同
OVN-KubernetesOpenShift SDN
  • 创建 EgressIPs 对象
  • 在一个 Node 对象上添加注解
  • NetNamespace 对象进行补丁
  • HostSubnet 对象进行补丁

有关在 OVN-Kubernetes 中使用出口 IP 地址的更多信息,请参阅"配置出口 IP 地址"。

24.6.1.1.4. 出口网络策略

下表中描述在 OVN-Kubernetes 和 OpenShift SDN 间配置出口网络策略(也称为出口防火墙)的不同之处:

Expand
表 24.5. 出口网络策略配置的不同
OVN-KubernetesOpenShift SDN
  • 在命名空间中创建 EgressFirewall 对象
  • 在命名空间中创建一个 EgressNetworkPolicy 对象
注意

由于 EgressFirewall 对象的名称只能设置为 default,在迁移后,所有迁移的 EgressNetworkPolicy 对象都会命名为 default,而无论在 OpenShift SDN 下的名称是什么。

如果您随后回滚到 OpenShift SDN,则所有 EgressNetworkPolicy 对象都会命名为 default,因为之前的名称已丢失。

有关在 OVN-Kubernetes 中使用出口防火墙的更多信息,请参阅"配置项目出口防火墙"。

24.6.1.1.5. 出口路由器 pod

OVN-Kubernetes 支持重定向模式的出口路由器 pod。OVN-Kubernetes 不支持 HTTP 代理模式或 DNS 代理模式的出口路由器 pod。

使用 Cluster Network Operator 部署出口路由器时,您无法指定节点选择器来控制用于托管出口路由器 pod 的节点。

24.6.1.1.6. 多播

下表中描述了在 OVN-Kubernetes 和 OpenShift SDN 上启用多播流量的区别:

Expand
表 24.6. 多播配置的不同
OVN-KubernetesOpenShift SDN
  • Namespace 对象上添加注解
  • NetNamespace 对象中添加注解

有关在 OVN-Kubernetes 中使用多播的更多信息,请参阅"启用项目多播"。

24.6.1.1.7. 网络策略

OVN-Kubernetes 在 networking.k8s.io/v1 API 组中完全支持 Kubernetes NetworkPolicy API。从 OpenShift SDN 进行迁移时,网络策略不需要更改。

24.6.1.2. 迁移过程如何工作

下表对迁移过程进行了概述,它分为操作中的用户发起的步骤,以及在响应过程中迁移过程要执行的操作。

Expand
表 24.7. 从 OpenShift SDN 迁移到 OVN-Kubernetes
用户发起的步骤迁移操作

将名为 clusterNetwork.operator.openshift.io 自定义资源(CR)的 migration 字段设置为 OVNKubernetes。在设置值之前,请确保 migration 项为 null

Cluster Network Operator (CNO)
相应地更新名为 clusterNetwork.config.openshift.io CR 的状态。
Machine Config Operator(MCO)
将更新发布到 OVN-Kubernetes 所需的 systemd 配置 ; MCO 默认更新每个池的单一机器,从而导致迁移总时间随着集群大小而增加。

更新 Network.config.openshift.io CR 的 networkType 字段。

CNO

执行以下操作:

  • 销毁 OpenShift SDN control plane pod。
  • 部署 OVN-Kubernetes control plane pod。
  • 更新 Multus 对象以反映新的网络插件。

重新引导集群中的每个节点。

Cluster
当节点重启时,集群会为 OVN-Kubernetes 集群网络上的 pod 分配 IP 地址。

如果需要回滚到 OpenShift SDN,下表描述了这个过程。

重要

在启动回滚前,您必须等待 OpenShift SDN 到 OVN-Kubernetes 网络插件的迁移过程成功。

Expand
表 24.8. 执行到 OpenShift SDN 的回滚
用户发起的步骤迁移操作

挂起 MCO 以确保它不会中断迁移。

MCO 停止。

将名为 clusterNetwork.operator.openshift.io 自定义资源(CR)的 migration 字段设置为 OpenShiftSDN。在设置值之前,请确保 migration 项为 null

CNO
相应地更新名为 clusterNetwork.config.openshift.io CR 的状态。

更新 networkType 字段。

CNO

执行以下操作:

  • 销毁 OVN-Kubernetes control plane pod。
  • 部署 OpenShift SDN control plane pod。
  • 更新 Multus 对象以反映新的网络插件。

重新引导集群中的每个节点。

Cluster
当节点重启时,集群会为 OpenShift-SDN 网络上的 pod 分配 IP 地址。

在集群重启中的所有节点后启用 MCO。

MCO
将更新发布到 OpenShift SDN 所需的 systemd 配置 ; MCO 默认更新每个池的单一机器,因此迁移总时间随着集群的大小而增加。

作为集群管理员,您可以使用 Ansible 集合 network.offline_migration_sdn_to_ovnk 从 OpenShift SDN Container Network Interface (CNI)网络插件迁移到集群的 OVN-Kubernetes 插件。Ansible 集合包括以下 playbook:

  • playbooks/playbook-migration.yml :包含按顺序执行的 playbook,每个 playbook 代表迁移过程中的一个步骤。
  • playbooks/playbook-rollback.yml :包含按顺序执行的 playbook,其中每个 playbook 代表回滚过程中的一个步骤。

先决条件

  • 已安装 python3 软件包,最小版本 3.10。
  • 已安装 jmespathjq 软件包。
  • 已登陆到 Red Hat Hybrid Cloud Console 并打开 Ansible Automation Platform web 控制台。
  • 您创建了一条安全组规则,允许所有云平台上所有节点的端口 6081 上用户数据报协议(UDP)数据包。如果没有此任务,您的集群可能无法调度 pod。
  • 检查集群是否在主机网络中使用静态路由或路由策略。

    • 如果为 true,则后续步骤需要将 routingViaHost 参数设置为 true,在 playbooks/playbook-migration.yml 文件的 gatewayConfig 部分中将 ipForwarding 参数设置为 Global
  • 如果 OpenShift-SDN 插件使用 100.64.0.0/16100.88.0.0/16 地址范围,则您修补了地址范围。如需更多信息,请参阅附加资源部分中的 "Patching OVN-Kubernetes address ranges"。

流程

  1. 安装 ansible-core 软件包,最低为 2.15 版本。以下示例命令演示了如何在 Red Hat Enterprise Linux (RHEL)上安装 ansible-core 软件包:

    $ sudo dnf install -y ansible-core
    Copy to Clipboard Toggle word wrap
  2. 创建 ansible.cfg 文件,并将类似以下示例的信息添加到该文件中。确保该文件存在于与 ansible-galaxy 命令和 playbook 运行相同的目录中。

    $ cat << EOF >> ansible.cfg
    [galaxy]
    server_list = automation_hub, validated
    
    [galaxy_server.automation_hub]
    url=https://console.redhat.com/api/automation-hub/content/published/
    auth_url=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token
    token=
    
    #[galaxy_server.release_galaxy]
    #url=https://galaxy.ansible.com/
    
    [galaxy_server.validated]
    url=https://console.redhat.com/api/automation-hub/content/validated/
    auth_url=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token
    token=
    EOF
    Copy to Clipboard Toggle word wrap
  3. 在 Ansible Automation Platform web 控制台中进入 Connect to Hub 页并完成以下步骤:

    1. 在页的离线令牌部分中,点 Load token 按钮。
    2. 在令牌加载后,点 Copy to clipboard 图标。
    3. 打开 ansible.cfg 文件,并将 API 令牌粘贴到 token= 参数中。对 ansible.cfg 文件中指定的服务器 URL 进行身份验证需要 API 令牌。
  4. 输入以下 ansible-galaxy 命令,安装 network.offline_migration_sdn_to_ovnk Ansible 集合:

    $ ansible-galaxy collection install network.offline_migration_sdn_to_ovnk
    Copy to Clipboard Toggle word wrap
  5. 验证您系统上是否安装了 network.offline_migration_sdn_to_ovnk Ansible 集合:

    $ ansible-galaxy collection list | grep network.offline_migration_sdn_to_ovnk
    Copy to Clipboard Toggle word wrap

    输出示例

    network.offline_migration_sdn_to_ovnk   1.0.2
    Copy to Clipboard Toggle word wrap

    network.offline_migration_sdn_to_ovnk Ansible 集合保存在 ~/.ansible/collections/ansible_collections/network/offline_migration_sdn_to_ovnk/ 的默认路径中。

  6. playbook/playbook-migration.yml 文件中配置迁移功能:

    # ...
        migration_interface_name: eth0
        migration_disable_auto_migration: true
        migration_egress_ip: false
        migration_egress_firewall: false
        migration_multicast: false
        migration_routing_via_host: true
        migration_ip_forwarding: Global
        migration_cidr: "10.240.0.0/14"
        migration_prefix: 23
        migration_mtu: 1400
        migration_geneve_port: 6081
        migration_ipv4_subnet: "100.64.0.0/16"
    # ...
    Copy to Clipboard Toggle word wrap
    migration_interface_name
    如果您在主接口上使用 NodeNetworkConfigurationPolicy (NNCP)资源,请在 migration-playbook.yml 文件中指定接口名称,以便在迁移过程中在主接口上删除 NNCP 资源。
    migration_disable_auto_migration
    禁用 OpenShift SDN CNI 插件的自动迁移功能到 OVN-Kubernetes 插件。如果禁用功能的自动迁移,还必须将 migration_egress_ipmigration_egress_firewallmigration_multicast 参数设置为 false。如果您需要启用功能的自动迁移,请将 参数设置为 false
    migration_routing_via_host
    设置为 true,以配置本地网关模式或 false,来为集群中的节点配置共享网关模式。默认值为 false。在本地网关模式中,流量通过主机网络堆栈路由。在共享网关模式中,流量不会通过主机网络堆栈路由。
    migration_ip_forwarding
    如果您配置了本地网关模式,如果您需要节点的主机网络充当与 OVN-Kubernetes 相关的流量的路由器,请将 IP 转发设置为 Global
    migration_cidr
    为集群指定无类别域间路由(CIDR) IP 地址块。您不能使用任何与 10064.0.0/16 CIDR 块重叠的 CIDR 块,因为 OVN-Kubernetes 网络供应商在内部使用此块。
    migration_prefix
    确保指定了一个前缀值,这是集群中每个节点的 CIDR 块的片段。
    migration_mtu
    可选参数,在迁移过程后将特定的最大传输单元(MTU)设置为集群网络。
    migration_geneve_port
    为 OVN-Kubernetes 设置 Geneve 端口的可选参数。默认端口为 6081
    migration_ipv4_subnet
    可选参数,用于为 OVN-Kubernetes 内部设置 IPv4 地址范围。参数的默认值为 100.64.0.0/16
  7. 要运行 playbooks/playbook-migration.yml 文件,请输入以下命令:

    $ ansible-playbook -v playbooks/playbook-migration.yml
    Copy to Clipboard Toggle word wrap

24.6.2. 迁移到 OVN-Kubernetes 网络插件

作为集群管理员,您可以将集群的网络插件更改为 OVN-Kubernetes。在迁移过程中,您必须重新引导集群中的每个节点。

重要

在进行迁移时,集群不可用,工作负载可能会中断。仅在服务中断可以接受时才执行迁移。

先决条件

  • 您已在网络策略隔离模式下使用 OpenShift SDN CNI 网络插件配置集群。
  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 您有最新的 etcd 数据库备份。
  • 您可以手动重新引导每个节点。
  • 您检查集群是否处于已知良好状态,且没有任何错误。
  • 您创建了一条安全组规则,允许所有云平台上所有节点的端口 6081 上用户数据报协议(UDP)数据包。
  • 已删除 Webhook。或者,您可以为每个 webhook 设置超时值,这在流程中详细介绍。如果您没有完成这些任务之一,您的集群可能无法调度 pod。

流程

  1. 如果您没有删除 Webhook,请通过创建 ValidatingWebhookConfiguration 自定义资源,然后指定 timeoutSeconds 参数的超时值,将每个 webhook 的超时值设置为 3 秒:

    oc patch ValidatingWebhookConfiguration <webhook_name> --type='json' \ 
    1
    
    -p '[{"op": "replace", "path": "/webhooks/0/timeoutSeconds", "value": 3}]'
    Copy to Clipboard Toggle word wrap
    1
    其中 <webhook_name> 是 webhook 的名称。
  2. 要备份集群网络的配置,请输入以下命令:

    $ oc get Network.config.openshift.io cluster -o yaml > cluster-openshift-sdn.yaml
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令,验证 OVN_SDN_MIGRATION_TIMEOUT 环境变量是否已设置,并等于 0s

    #!/bin/bash
    
    if [ -n "$OVN_SDN_MIGRATION_TIMEOUT" ] && [ "$OVN_SDN_MIGRATION_TIMEOUT" = "0s" ]; then
        unset OVN_SDN_MIGRATION_TIMEOUT
    fi
    
    #loops the timeout command of the script to repeatedly check the cluster Operators until all are available.
    
    co_timeout=${OVN_SDN_MIGRATION_TIMEOUT:-1200s}
    timeout "$co_timeout" bash <<EOT
    until
      oc wait co --all --for='condition=AVAILABLE=True' --timeout=10s && \
      oc wait co --all --for='condition=PROGRESSING=False' --timeout=10s && \
      oc wait co --all --for='condition=DEGRADED=False' --timeout=10s;
    do
      sleep 10
      echo "Some ClusterOperators Degraded=False,Progressing=True,or Available=False";
    done
    EOT
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令,从 Cluster Network Operator (CNO) 配置对象中删除配置:

    $ oc patch Network.operator.openshift.io cluster --type='merge' \
    --patch '{"spec":{"migration":null}}'
    Copy to Clipboard Toggle word wrap
  5. .通过完成以下步骤,删除 NodeNetworkConfigurationPolicy (NNCP)自定义资源(CR)定义 OpenShift SDN 网络插件的主网络接口:

    1. 输入以下命令检查现有 NNCP CR 是否将主接口绑定到集群:

      $ oc get nncp
      Copy to Clipboard Toggle word wrap

      输出示例

      NAME          STATUS      REASON
      bondmaster0   Available   SuccessfullyConfigured
      Copy to Clipboard Toggle word wrap

      Network Manager 将绑定的主接口的连接配置文件存储在 /etc/NetworkManager/system-connections 系统路径中。

    2. 从集群中删除 NNCP:

      $ oc delete nncp <nncp_manifest_filename>
      Copy to Clipboard Toggle word wrap
  6. 要为迁移准备所有节点,请运行以下命令在 CNO 配置对象上设置 migration 字段:

    $ oc patch Network.operator.openshift.io cluster --type='merge' \
      --patch '{ "spec": { "migration": { "networkType": "OVNKubernetes" } } }'
    Copy to Clipboard Toggle word wrap
    注意

    此步骤不会立即部署 OVN-Kubernetes。相反,指定 migration 字段会触发 Machine Config Operator(MCO)将新机器配置应用到集群中的所有节点,以准备 OVN-Kubernetes 部署。

    1. 运行以下命令检查重启是否已完成:

      $ oc get mcp
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,检查所有集群 Operator 是否可用:

      $ oc get co
      Copy to Clipboard Toggle word wrap
    3. 另外:您可以禁用将几个 OpenShift SDN 功能自动迁移到 OVN-Kubernetes 等效功能:

      • 出口 IP
      • 出口防火墙
      • 多播

      要为之前记录的 OpenShift SDN 功能禁用配置自动迁移,请指定以下键:

      $ oc patch Network.operator.openshift.io cluster --type='merge' \
        --patch '{
          "spec": {
            "migration": {
              "networkType": "OVNKubernetes",
              "features": {
                "egressIP": <bool>,
                "egressFirewall": <bool>,
                "multicast": <bool>
              }
            }
          }
        }'
      Copy to Clipboard Toggle word wrap

      其中:

      bool:指定是否启用功能的迁移。默认值是 true

  7. 可选: 您可以自定义 OVN-Kubernetes 的以下设置,以满足您的网络基础架构要求:

    • 最大传输单元 (MTU)。在为这个可选步骤自定义 MTU 前请考虑以下几点:

      • 如果您使用默认 MTU,并且要在迁移期间保留默认 MTU,则可以忽略这一步。
      • 如果您使用自定义 MTU,并且要在迁移过程中保留自定义 MTU,则必须在此步骤中声明自定义 MTU 值。
      • 如果要在迁移过程中更改 MTU 值,此步骤将无法正常工作。相反,您必须首先按照"选择集群 MTU"的说明进行操作。然后,您可以通过执行此步骤并声明自定义 MTU 值来保留自定义 MTU 值。

        注意

        OpenShift-SDN 和 OVN-Kubernetes 具有不同的覆盖(overlay)开销。MTU 值应遵循在 "MTU 值选择" 页面中找到的准则来选择。

    • Geneve(Generic Network Virtualization Encapsulation)覆盖网络端口
    • OVN-Kubernetes IPv4 内部子网

    要自定义之前记录的设置之一,请输入以下命令。如果您不需要更改默认值,请从补丁中省略该键。

    $ oc patch Network.operator.openshift.io cluster --type=merge \
      --patch '{
        "spec":{
          "defaultNetwork":{
            "ovnKubernetesConfig":{
              "mtu":<mtu>,
              "genevePort":<port>,
              "v4InternalSubnet":"<ipv4_subnet>"
        }}}}'
    Copy to Clipboard Toggle word wrap

    其中:

    mtu
    Geneve 覆盖网络的 MTU。这个值通常是自动配置的;但是,如果集群中的节点没有都使用相同的 MTU,那么您必须将此值明确设置为比最小节点 MTU 的值小 100
    port
    Geneve 覆盖网络的 UDP 端口。如果没有指定值,则默认为 6081。端口不能与 OpenShift SDN 使用的 VXLAN 端口相同。VXLAN 端口的默认值为 4789
    ipv4_subnet
    OVN-Kubernetes 内部使用的 IPv4 地址范围。您必须确保 IP 地址范围没有与 OpenShift Container Platform 安装使用的任何其他子网重叠。IP 地址范围必须大于可添加到集群的最大节点数。默认值为 100.64.0.0/16

    更新 mtu 字段的 patch 命令示例

    $ oc patch Network.operator.openshift.io cluster --type=merge \
      --patch '{
        "spec":{
          "defaultNetwork":{
            "ovnKubernetesConfig":{
              "mtu":1200
        }}}}'
    Copy to Clipboard Toggle word wrap

  8. 当 MCO 更新每个机器配置池中的机器时,它会逐一重启每个节点。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:

    $ oc get mcp
    Copy to Clipboard Toggle word wrap

    成功更新的节点具有以下状态: UPDATED=trueUPDATING=falseDEGRADED=false

    注意

    默认情况下,MCO 会一次在一个池中更新一个机器,从而导致迁移总时间随着集群大小的增加而增加。

  9. 确认主机上新机器配置的状态:

    1. 要列出机器配置状态和应用的机器配置名称,请输入以下命令:

      $ oc describe node | egrep "hostname|machineconfig"
      Copy to Clipboard Toggle word wrap

      输出示例

      kubernetes.io/hostname=master-0
      machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/reason:
      machineconfiguration.openshift.io/state: Done
      Copy to Clipboard Toggle word wrap

      验证以下语句是否正确:

      • machineconfiguration.openshift.io/state 字段的值为 Done
      • machineconfiguration.openshift.io/currentConfig 字段的值等于 machineconfiguration.openshift.io/desiredConfig 字段的值。
    2. 要确认机器配置正确,请输入以下命令:

      $ oc get machineconfig <config_name> -o yaml | grep ExecStart
      Copy to Clipboard Toggle word wrap

      这里的 <config_name>machineconfiguration.openshift.io/currentConfig 字段中机器配置的名称。

      机器配置必须包括以下对 systemd 配置的更新:

      ExecStart=/usr/local/bin/configure-ovs.sh OVNKubernetes
      Copy to Clipboard Toggle word wrap
    3. 如果节点一直处于 NotReady 状态,检查机器配置守护进程 pod 日志并解决所有错误。

      1. 运行以下命令列出 pod:

        $ oc get pod -n openshift-machine-config-operator
        Copy to Clipboard Toggle word wrap

        输出示例

        NAME                                         READY   STATUS    RESTARTS   AGE
        machine-config-controller-75f756f89d-sjp8b   1/1     Running   0          37m
        machine-config-daemon-5cf4b                  2/2     Running   0          43h
        machine-config-daemon-7wzcd                  2/2     Running   0          43h
        machine-config-daemon-fc946                  2/2     Running   0          43h
        machine-config-daemon-g2v28                  2/2     Running   0          43h
        machine-config-daemon-gcl4f                  2/2     Running   0          43h
        machine-config-daemon-l5tnv                  2/2     Running   0          43h
        machine-config-operator-79d9c55d5-hth92      1/1     Running   0          37m
        machine-config-server-bsc8h                  1/1     Running   0          43h
        machine-config-server-hklrm                  1/1     Running   0          43h
        machine-config-server-k9rtx                  1/1     Running   0          43h
        Copy to Clipboard Toggle word wrap

        配置守护进程 pod 的名称使用以下格式: machine-config-daemon-<seq><seq> 值是一个随机的五个字符的字母数字序列。

      2. 使用以下命令,输出在上一个输出中显示的第一个机器配置守护进程 pod 的 pod 日志:

        $ oc logs <pod> -n openshift-machine-config-operator
        Copy to Clipboard Toggle word wrap

        其中 pod 是机器配置守护进程 pod 的名称。

      3. 解决上一命令输出中显示的日志中的任何错误。
  10. 要启动迁移,请使用以下命令配置 OVN-Kubernetes 网络插件:

    • 要指定网络供应商而不更改集群网络 IP 地址块,请输入以下命令:

      $ oc patch Network.config.openshift.io cluster \
        --type='merge' --patch '{ "spec": { "networkType": "OVNKubernetes" } }'
      Copy to Clipboard Toggle word wrap
    • 要指定不同的集群网络 IP 地址块,请输入以下命令:

      $ oc patch Network.config.openshift.io cluster \
        --type='merge' --patch '{
          "spec": {
            "clusterNetwork": [
              {
                "cidr": "<cidr>",
                "hostPrefix": <prefix>
              }
            ],
            "networkType": "OVNKubernetes"
          }
        }'
      Copy to Clipboard Toggle word wrap

      其中 cidr 是 CIDR 块,prefix 是集群中每个节点的 CIDR 块的分片。您不能使用任何与 10064.0.0/16 CIDR 块重叠的 CIDR 块,因为 OVN-Kubernetes 网络供应商在内部使用此块。

      重要

      您无法在迁移过程中更改服务网络地址块。

  11. 在继续执行后续步骤前,验证 Multus 守护进程集的 rollout 是否已完成:

    $ oc -n openshift-multus rollout status daemonset/multus
    Copy to Clipboard Toggle word wrap

    Multus pod 的名称采用 multus-<xxxxx> 的形式,其中 <xxxxx>是由字母组成的随机序列。pod 可能需要一些时间才能重启。

    输出示例

    Waiting for daemon set "multus" rollout to finish: 1 out of 6 new pods have been updated...
    ...
    Waiting for daemon set "multus" rollout to finish: 5 of 6 updated pods are available...
    daemon set "multus" successfully rolled out
    Copy to Clipboard Toggle word wrap

  12. 要完成更改网络插件,请重新引导集群中的每个节点。您可以使用以下方法之一重新引导集群中的节点:

    重要

    以下脚本同时重新引导集群中的所有节点。这可能导致集群不稳定。另一种选择是,每次只手动重新引导一个节点。逐一重新引导节点会导致,在具有多个节点的集群中出现大量停机时间。

    在重新引导节点前,集群 Operator 无法正常工作。

    • 使用 oc rsh 命令,您可以使用类似如下的 bash 脚本:

      #!/bin/bash
      readarray -t POD_NODES <<< "$(oc get pod -n openshift-machine-config-operator -o wide| grep daemon|awk '{print $1" "$7}')"
      
      for i in "${POD_NODES[@]}"
      do
        read -r POD NODE <<< "$i"
        until oc rsh -n openshift-machine-config-operator "$POD" chroot /rootfs shutdown -r +1
          do
            echo "cannot reboot node $NODE, retry" && sleep 3
          done
      done
      Copy to Clipboard Toggle word wrap
    • 通过 ssh 命令,您可以使用类似如下的 bash 脚本:该脚本假设您已将 sudo 配置为不提示输入密码。

      #!/bin/bash
      
      for ip in $(oc get nodes  -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}')
      do
         echo "reboot node $ip"
         ssh -o StrictHostKeyChecking=no core@$ip sudo shutdown -r -t 3
      done
      Copy to Clipboard Toggle word wrap
  13. 确认迁移成功完成:

    1. 要确认网络插件是 OVN-Kubernetes,请输入以下命令。status.networkType 的值必须是 OVNKubernetes

      $ oc get network.config/cluster -o jsonpath='{.status.networkType}{"\n"}'
      Copy to Clipboard Toggle word wrap
    2. 要确认集群节点处于 Ready 状态,请输入以下命令:

      $ oc get nodes
      Copy to Clipboard Toggle word wrap
    3. 要确认您的 pod 不在错误状态,请输入以下命令:

      $ oc get pods --all-namespaces -o wide --sort-by='{.spec.nodeName}'
      Copy to Clipboard Toggle word wrap

      如果节点上的 pod 处于错误状态,请重新引导该节点。

    4. 要确认所有集群 Operator 没有处于异常状态,请输入以下命令:

      $ oc get co
      Copy to Clipboard Toggle word wrap

      每个集群 Operator 的状态必须是: AVAILABLE="True"PROGRESSING="False"DEGRADED="False"。如果 Cluster Operator 不可用或降级,请检查集群 Operator 的日志以了解更多信息。

  14. 只有在迁移成功且集群处于良好状态时完成以下步骤:

    1. 要从 CNO 配置对象中删除迁移配置,请输入以下命令:

      $ oc patch Network.operator.openshift.io cluster --type='merge' \
        --patch '{ "spec": { "migration": null } }'
      Copy to Clipboard Toggle word wrap
    2. 要删除 OpenShift SDN 网络供应商的自定义配置,请输入以下命令:

      $ oc patch Network.operator.openshift.io cluster --type='merge' \
        --patch '{ "spec": { "defaultNetwork": { "openshiftSDNConfig": null } } }'
      Copy to Clipboard Toggle word wrap
    3. 要删除 OpenShift SDN 网络供应商命名空间,请输入以下命令:

      $ oc delete namespace openshift-sdn
      Copy to Clipboard Toggle word wrap
    4. 成功迁移操作后,输入以下命令从 network.config 自定义资源中删除 network.openshift.io/network-type-migration- 注解:

      $ oc annotate network.config cluster network.openshift.io/network-type-migration-
      Copy to Clipboard Toggle word wrap

后续步骤

  • 可选:在集群迁移后,您可以将 IPv4 单堆栈集群转换为支持 IPv4 和 IPv6 地址系列的双网络集群网络。如需更多信息,请参阅"协调 IPv4/IPv6 双栈网络"。

24.6.4. 了解 OVN-Kubernetes 中外部 IP 行为的更改

当从 OpenShift SDN 迁移到 OVN-Kubernetes (OVN-K)时,使用外部 IP 的服务可能会因为网络策略强制而在命名空间中无法访问。

在 OpenShift SDN 中,外部 IP 默认可在命名空间间访问。但是,在 OVN-K 中,网络策略严格强制执行多租户隔离,从而防止访问通过外部 IP 从其他命名空间公开的服务。

为确保访问,请考虑以下替代方案:

  • 使用入口或路由 :使用外部 IP 公开服务,在保持安全控制时配置入口或路由来允许外部访问。
  • 调整 NetworkPolicy 自定义资源(CR):修改 NetworkPolicy CR 以明确允许从所需命名空间中访问,并确保允许流量访问指定的服务端口。如果没有明确允许到所需端口的流量,访问可能仍然被阻止,即使允许命名空间。
  • 使用 LoadBalancer 服务:如果适用,部署 LoadBalancer 服务而不是依赖于外部 IP。有关配置 "NetworkPolicy 和 external IP in OVN-Kubernetes" 的更多信息。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat