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

    要获取设置 SOURCE_OVSDB_IP 的值,请查询 Controller 节点中的 puppet-generated 配置:

    $ grep -rI 'ovn_[ns]b_conn' /var/lib/config-data/puppet-generated/
    Copy to Clipboard Toggle word wrap

流程

  1. 为 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:
      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
        k8s.v1.cni.cncf.io/networks: internalapi
      labels:
        app: adoption
    spec:
      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
    Copy to Clipboard Toggle word wrap
  2. 等待 pod 就绪:

    $ oc wait --for=condition=Ready pod/ovn-copy-data --timeout=30s
    Copy to Clipboard Toggle word wrap
  3. 如果 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
    Copy to Clipboard Toggle word wrap
  4. 备份 OVN 数据库:

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

      $ oc exec ovn-copy-data -- bash -c "ovsdb-client backup tcp:$SOURCE_OVSDB_IP:6641 > /backup/ovs-nb.db"
      $ oc exec ovn-copy-data -- bash -c "ovsdb-client backup tcp:$SOURCE_OVSDB_IP:6642 > /backup/ovs-sb.db"
      Copy to Clipboard Toggle word wrap
    • 如果您随处启用 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"
      Copy to Clipboard Toggle word wrap
  5. 在导入前启动 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
    '
    Copy to Clipboard Toggle word wrap
  6. 等待 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
    Copy to Clipboard Toggle word wrap
  7. 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}')
    Copy to Clipboard Toggle word wrap
  8. 如果您使用 IPv6,请将地址调整为 ovsdb channel 工具期望的格式:

    PODIFIED_OVSDB_NB_IP=[$PODIFIED_OVSDB_NB_IP]
    PODIFIED_OVSDB_SB_IP=[$PODIFIED_OVSDB_SB_IP]
    Copy to Clipboard Toggle word wrap
  9. 升级备份文件的数据库模式:

    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"
      Copy to Clipboard Toggle word wrap
    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"
      Copy to Clipboard Toggle word wrap
  10. 将数据库备份恢复到新的 OVN 数据库服务器:

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

      $ oc exec ovn-copy-data -- bash -c "ovsdb-client restore tcp:$PODIFIED_OVSDB_NB_IP:6641 < /backup/ovs-nb.db"
      $ oc exec ovn-copy-data -- bash -c "ovsdb-client restore tcp:$PODIFIED_OVSDB_SB_IP:6642 < /backup/ovs-sb.db"
      Copy to Clipboard Toggle word wrap
    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"
      Copy to Clipboard Toggle word wrap
  11. 通过针对新的数据库服务器运行以下命令来检查数据是否已成功迁移,例如:

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

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

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

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

  14. 删除 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
    Copy to Clipboard Toggle word wrap
    注意

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

  15. 停止采用的 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
        for i in {1..3}; do
            SSH_CMD=CONTROLLER${i}_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
    done
    
    echo "Checking systemd OpenStack services"
    for service in ${ServicesToStop[*]}; do
        for i in {1..3}; do
            SSH_CMD=CONTROLLER${i}_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
    done
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat