4.6. 迁移 OVN 数据


将 OVN 数据库中的数据从原始 Red Hat OpenStack Platform 部署迁移到 Red Hat OpenShift Container Platform (RHOCP)集群中运行的 ovsdb-server 实例。

先决条件

  • OpenStackControlPlane 资源已创建。
  • 定义原始集群的 NetworkAttachmentDefinition 自定义资源(CR)。具体来说,定义了 internalapi 网络。
  • 原始网络服务(neutron)和 OVN northd 未运行。
  • control plane 服务和采用的集群之间存在网络弹性。
  • 云迁移到带有 Open Virtual Networking (ML2/OVN)机制驱动程序的 Modular Layer 2 插件。
  • 定义以下 shell 变量:将示例值替换为您的环境正确的值:

    STORAGE_CLASS=local-storage
    OVSDB_IMAGE=registry.redhat.io/rhoso/openstack-ovn-base-rhel9:18.0
    SOURCE_OVSDB_IP=172.17.0.100 # For IPv4
    SOURCE_OVSDB_IP=[fd00:bbbb::100] # For IPv6

    SOURCE_OVSDB_IP 的 IP 地址值更新为与剩余的 RHOSP 17 控制器虚拟机关联的内部Api IP 地址。使用以下命令检索 IP 地址:

$ $CONTROLLER_SSH ip a s enp4s0
** Select the non /32 IP address
注意

如果您使用断开连接的环境 director Operator 部署,请使用 OVSDB_IMAGE=registry.redhat.io/rhoso/openstack-ovn-base-rhel9@sha256:967046c6bdb8f55c236085b5c5f9667f0dbb9f3ac52a6560dd36a6bfac051e1f。如需更多信息,请参阅使用 director Operator 在 Red Hat OpenShift Container Platform 集群中部署 overcloud 中的 配置 airgapped 环境

流程

  1. 获取包含 RHOSP Controller 节点的 RHOCP master 节点:

    $ oc get vmi -n $<ospdo_namespace> -o jsonpath='{.items[0].metadata.labels.kubevirt\.io/nodeName}'
    • <ospdo_namespace& gt; 替换为您的 OSPdO 命名空间。
  2. 为 OVN 备份准备临时 PersistentVolume 声明和 helper pod。如果需要,调整大型数据库的存储请求:

    $ oc apply -f - <<EOF
    ---
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: ovn-data-cert
    spec:
      commonName: ovn-data-cert
      secretName: ovn-data-cert
      issuerRef:
        name: rootca-internal
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      namespace: $OSPDO_NAMESPACE
      name: ovn-data
    spec:
      storageClassName: $STORAGE_CLASS
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: ovn-copy-data
      annotations:
        openshift.io/scc: anyuid
      '[{"name": "internalapi-static", "namespace": $<ospdo_namespace>, "ips": ["<internalapi-static-ips>"]}]'
      labels:
        app: adoption
      namespace: $OSPDO_NAMESPACE
    spec:
      nodeName: '{{ <ocp_node_holding_controller> }}' 
    1
    
      containers:
      - image: $OVSDB_IMAGE
        command: [ "sh", "-c", "sleep infinity"]
        name: adoption
        volumeMounts:
        - mountPath: /backup
          name: ovn-data
        - mountPath: /etc/pki/tls/misc
          name: ovn-data-cert
          readOnly: true
      securityContext:
        allowPrivilegeEscalation: false
        capabilities:
          drop: ALL
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      volumes:
      - name: ovn-data
        persistentVolumeClaim:
          claimName: ovn-data
      - name: ovn-data-cert
        secret:
          secretName: ovn-data-cert
    EOF
    1
    <ocp_node_holding_controller > 替换为包含 Controller 节点的 RHOSP 节点。
  3. 等待 pod 就绪:

    $ oc wait --for=condition=Ready -n $OSPDO_NAMESPACE pod/ovn-copy-data --timeout=30s
  4. 如果 podified internalapi cidr 与源 internalapi cidr 不同,请在 Controller 节点上添加 iptables accept 规则:

    $ $CONTROLLER1_SSH sudo iptables -I INPUT -s {PODIFIED_INTERNALAPI_NETWORK} -p tcp -m tcp --dport 6641 -m conntrack --ctstate NEW -j ACCEPT
    $ $CONTROLLER1_SSH sudo iptables -I INPUT -s {PODIFIED_INTERNALAPI_NETWORK} -p tcp -m tcp --dport 6642 -m conntrack --ctstate NEW -j ACCEPT
  5. 备份 OVN 数据库:

    • 如果您没有在任何位置启用 TLS,请运行以下命令:

      $ oc exec -n $OSPDO_NAMESPACE ovn-copy-data -- bash -c "ovsdb-client backup tcp:$SOURCE_OVSDB_IP:6641 > /backup/ovs-nb.db"
      $ oc exec -n $OSPDO_NAMESPACE ovn-copy-data -- bash -c "ovsdb-client backup tcp:$SOURCE_OVSDB_IP:6642 > /backup/ovs-sb.db"
    • 如果您随处启用 TLS,请运行以下命令:

      $ oc exec ovn-copy-data -- bash -c "ovsdb-client backup --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$SOURCE_OVSDB_IP:6641 > /backup/ovs-nb.db"
      $ oc exec ovn-copy-data -- bash -c "ovsdb-client backup --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$SOURCE_OVSDB_IP:6642 > /backup/ovs-sb.db"
  6. 在导入前启动 control plane OVN 数据库服务,禁用 northd

    $ oc patch openstackcontrolplane openstack --type=merge --patch '
    spec:
      ovn:
        enabled: true
        template:
          ovnDBCluster:
            ovndbcluster-nb:
              replicas: 3
              dbType: NB
              storageRequest: 10G
              networkAttachment: internalapi
            ovndbcluster-sb:
              replicas: 3
              dbType: SB
              storageRequest: 10G
              networkAttachment: internalapi
          ovnNorthd:
            replicas: 0
    '
  7. 等待 OVN 数据库服务进入 Running 阶段:

    $ oc wait --for=jsonpath='{.status.phase}'=Running pod --selector=service=ovsdbserver-nb
    $ oc wait --for=jsonpath='{.status.phase}'=Running pod --selector=service=ovsdbserver-sb
  8. clusterIP 服务网络上获取 OVN 数据库 IP 地址:

    PODIFIED_OVSDB_NB_IP=$(oc get svc --selector "statefulset.kubernetes.io/pod-name=ovsdbserver-nb-0" -ojsonpath='{.items[0].spec.clusterIP}')
    PODIFIED_OVSDB_SB_IP=$(oc get svc --selector "statefulset.kubernetes.io/pod-name=ovsdbserver-sb-0" -ojsonpath='{.items[0].spec.clusterIP}')
  9. 如果您使用 IPv6,请将地址调整为 ovsdb channel 工具期望的格式:

    PODIFIED_OVSDB_NB_IP=[$PODIFIED_OVSDB_NB_IP]
    PODIFIED_OVSDB_SB_IP=[$PODIFIED_OVSDB_SB_IP]
  10. 升级备份文件的数据库模式:

    1. 如果您没有在任何位置启用 TLS,请使用以下命令:

      $ oc exec ovn-copy-data -- bash -c "ovsdb-client get-schema tcp:$PODIFIED_OVSDB_NB_IP:6641 > /backup/ovs-nb.ovsschema && ovsdb-tool convert /backup/ovs-nb.db /backup/ovs-nb.ovsschema"
      $ oc exec ovn-copy-data -- bash -c "ovsdb-client get-schema tcp:$PODIFIED_OVSDB_SB_IP:6642 > /backup/ovs-sb.ovsschema && ovsdb-tool convert /backup/ovs-sb.db /backup/ovs-sb.ovsschema"
    2. 如果您随处启用 TLS,请使用以下命令:

      $ oc exec ovn-copy-data -- bash -c "ovsdb-client get-schema --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$PODIFIED_OVSDB_NB_IP:6641 > /backup/ovs-nb.ovsschema && ovsdb-tool convert /backup/ovs-nb.db /backup/ovs-nb.ovsschema"
      $ oc exec ovn-copy-data -- bash -c "ovsdb-client get-schema --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$PODIFIED_OVSDB_SB_IP:6642 > /backup/ovs-sb.ovsschema && ovsdb-tool convert /backup/ovs-sb.db /backup/ovs-sb.ovsschema"
  11. 将数据库备份恢复到新的 OVN 数据库服务器:

    1. 如果您没有在任何位置启用 TLS,请使用以下命令:

    2. 如果您随处启用 TLS,请使用以下命令:

      $ oc exec ovn-copy-data -- bash -c "ovsdb-client restore --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$PODIFIED_OVSDB_NB_IP:6641 < /backup/ovs-nb.db"
      $ oc exec ovn-copy-data -- bash -c "ovsdb-client restore --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$PODIFIED_OVSDB_SB_IP:6642 < /backup/ovs-sb.db"
  12. 通过针对新的数据库服务器运行以下命令来检查数据是否已成功迁移,例如:

    $ oc exec -it ovsdbserver-nb-0 -- ovn-nbctl show
    $ oc exec -it ovsdbserver-sb-0 -- ovn-sbctl list Chassis
  13. 启动 control plane ovn-northd 服务,以便两个 OVN 数据库保持同步:

    $ oc patch openstackcontrolplane openstack --type=merge --patch '
    spec:
      ovn:
        enabled: true
        template:
          ovnNorthd:
            replicas: 1
    '
  14. 如果您在 RHOCP 节点上运行 OVN 网关服务,请启用 control plane ovn-controller 服务:

    $ oc patch openstackcontrolplane openstack --type=merge --patch '
    spec:
      ovn:
        enabled: true
        template:
          ovnController:
            nicMappings:
              physNet: NIC 
    1
    1
    physnet 是物理网络的名称。NIC 是连接到您的物理网络的物理接口的名称。
    注意

    在 RHOCP 节点上运行 OVN 网关,在 Open vSwitch 升级过程中可能会容易出现数据平面停机时间。考虑在专用的 Networker data plane 节点上运行 OVN 网关,用于生产环境部署。

  15. 删除 ovn-data helper pod 和用于存储 OVN 数据库备份文件的临时 PersistentVolumeClaim

    $ oc delete --ignore-not-found=true pod ovn-copy-data
    $ oc delete --ignore-not-found=true pvc ovn-data
    注意

    在删除 ovn-data helper pod 和临时 PersistentVolumeClaim 前,请考虑为它们执行快照。如需更多信息,请参阅 OpenShift Container Platform 存储概述 中的 关于卷快照

  16. 停止采用的 OVN 数据库服务器:

    ServicesToStop=("tripleo_ovn_cluster_north_db_server.service"
                    "tripleo_ovn_cluster_south_db_server.service")
    
    echo "Stopping systemd OpenStack services"
    for service in ${ServicesToStop[*]}; do
            SSH_CMD=CONTROLLER_SSH
            if [ ! -z "${!SSH_CMD}" ]; then
                echo "Stopping the $service in controller $i"
                if ${!SSH_CMD} sudo systemctl is-active $service; then
                    ${!SSH_CMD} sudo systemctl stop $service
                fi
            fi
    done
    
    echo "Checking systemd OpenStack services"
    for service in ${ServicesToStop[*]}; do
            SSH_CMD=CONTROLLER_SSH
            if [ ! -z "${!SSH_CMD}" ]; then
                if ! ${!SSH_CMD} systemctl show $service | grep ActiveState=inactive >/dev/null; then
                    echo "ERROR: Service $service still running on controller $i"
                else
                    echo "OK: Service $service is not running on controller $i"
                fi
            fi
    done
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部