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 环境。
流程
获取包含 RHOSP Controller 节点的 RHOCP master 节点:
$ oc get vmi -n $<ospdo_namespace> -o jsonpath='{.items[0].metadata.labels.kubevirt\.io/nodeName}'-
将
<ospdo_namespace> 替换为您的 OSPdO 命名空间。
-
将
为 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 节点。
等待 pod 就绪:
$ oc wait --for=condition=Ready -n $OSPDO_NAMESPACE pod/ovn-copy-data --timeout=30s如果 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备份 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"
在导入前启动 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 '等待 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在
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}')如果您使用 IPv6,请将地址调整为
ovsdbchannel 工具期望的格式:PODIFIED_OVSDB_NB_IP=[$PODIFIED_OVSDB_NB_IP] PODIFIED_OVSDB_SB_IP=[$PODIFIED_OVSDB_SB_IP]升级备份文件的数据库模式:
如果您没有在任何位置启用 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"如果您随处启用 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"
将数据库备份恢复到新的 OVN 数据库服务器:
如果您没有在任何位置启用 TLS,请使用以下命令:
如果您随处启用 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"
通过针对新的数据库服务器运行以下命令来检查数据是否已成功迁移,例如:
$ oc exec -it ovsdbserver-nb-0 -- ovn-nbctl show $ oc exec -it ovsdbserver-sb-0 -- ovn-sbctl list Chassis启动 control plane
ovn-northd服务,以便两个 OVN 数据库保持同步:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: ovn: enabled: true template: ovnNorthd: replicas: 1 '如果您在 RHOCP 节点上运行 OVN 网关服务,请启用 control plane
ovn-controller服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: ovn: enabled: true template: ovnController: nicMappings: physNet: NIC1 - 1
physnet是物理网络的名称。NIC是连接到您的物理网络的物理接口的名称。
注意在 RHOCP 节点上运行 OVN 网关,在 Open vSwitch 升级过程中可能会容易出现数据平面停机时间。考虑在专用的
Networkerdata plane 节点上运行 OVN 网关,用于生产环境部署。删除
ovn-datahelper pod 和用于存储 OVN 数据库备份文件的临时PersistentVolumeClaim:$ oc delete --ignore-not-found=true pod ovn-copy-data $ oc delete --ignore-not-found=true pvc ovn-data注意在删除
ovn-datahelper pod 和临时PersistentVolumeClaim前,请考虑为它们执行快照。如需更多信息,请参阅 OpenShift Container Platform 存储概述 中的 关于卷快照。停止采用的 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