1.7. 迁移 OVN 数据
本文档论述了如何将 OVN 北向和南向数据库从原始 OpenStack 部署移到 OpenShift 集群中运行的 ovsdb-server 实例。
1.7.1. rationale 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
虽然可能会说,podified Neutron ML2/OVN 驱动程序和 OVN northd 服务会在启动时重建数据库,但重建可能会非常耗时。以下流程允许加快数据迁移,避免因 OpenFlow 表内容不完整而造成不必要的数据平面中断。
1.7.2. 先决条件 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
确保前面的 Adoption 步骤已成功执行。
- 此时必须已创建了 OpenStackControlPlane 资源。
- 原始集群的 NetworkAttachmentDefinition CRD 已被定义。具体来说,定义了 openstack/internalapi 网络。
- Poded MariaDB 和 RabbitMQ 可能已在运行。Neutron 和 OVN 尚未运行。
- 原始 OVN 旧或等于 poded 版本。
- 原始 Neutron 服务器和 OVN 北北服务已停止。
之间必须有网络路由:
- 采用主机和原始 OVN。
- 采用主机和容器集化 OVN。
1.7.3. 变量 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
定义以下步骤中使用的 shell 变量。这些值只是说明,使用适合您环境的值:
STORAGE_CLASS_NAME=crc-csi-hostpath-provisioner
OVSDB_IMAGE=registry.redhat.io/rhosp-dev-preview/openstack-ovn-base-rhel9:18.0
SOURCE_OVSDB_IP=172.17.1.49
SOURCE_OVSDB_IP 的实际值可以从 puppet 生成的配置中获取:
grep -rI 'ovn_[ns]b_conn' /var/lib/config-data/puppet-generated/
1.7.4. 流程 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
- 准备 OVN DB 复制目录和采用帮助程序 pod (选择存储请求以适合 OVN 数据库大小)
oc apply -f - <<EOF
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ovn-data
spec:
storageClassName: $STORAGE_CLASS_NAME
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Pod
metadata:
name: ovn-copy-data
annotations:
openshift.io/scc: anyuid
labels:
app: adoption
spec:
containers:
- image: $OVSDB_IMAGE
command: [ "sh", "-c", "sleep infinity"]
name: adoption
volumeMounts:
- mountPath: /backup
name: ovn-data
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ALL
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
volumes:
- name: ovn-data
persistentVolumeClaim:
claimName: ovn-data
EOF
- 等待 pod 上线
oc wait --for=condition=Ready pod/ovn-copy-data --timeout=30s
- 备份 OVN 数据库。
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"
- 在导入前启动 pod 指定的 OVN 数据库服务。
oc patch openstackcontrolplane openstack --type=merge --patch '
spec:
ovn:
enabled: true
template:
ovnDBCluster:
ovndbcluster-nb:
dbType: NB
storageRequest: 10G
networkAttachment: internalapi
ovndbcluster-sb:
dbType: SB
storageRequest: 10G
networkAttachment: internalapi
'
- 等待 OVN DB pod 进入 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 服务网络上获取 pod 指定的 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}')
- 为备份文件升级数据库架构。
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"
- 将数据库备份恢复到 pod 指定的 OVN 数据库服务器。
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"
- 检查 pod 指定的 OVN 数据库是否包含来自备份的对象,例如:
oc exec -it ovsdbserver-nb-0 -- ovn-nbctl show
oc exec -it ovsdbserver-sb-0 -- ovn-sbctl list Chassis
-
最后,您可以启动
ovn-northd服务,该服务会将 OVN 北向和南向数据库保持同步。
oc patch openstackcontrolplane openstack --type=merge --patch '
spec:
ovn:
enabled: true
template:
ovnNorthd:
networkAttachment: internalapi
'
- 使用 OVN 数据库备份删除 ovn-data pod 和持久性卷声明(在删除前进行快照)
oc delete pod ovn-copy-data
oc delete pvc ovn-data