12.4. 常见问题和关注
本节介绍在迁移过程中可能导致问题的常见问题。
12.4.1. 直接卷迁移未完成 复制链接链接已复制到粘贴板!
如果直接卷迁移未完成,则目标集群可能没有与源集群相同的 node-selector
注解。
MTC 在迁移命名空间时会保留所有注解,以保持安全性上下文约束和调度要求。在直接卷迁移过程中,MTC 在从源集群迁移的命名空间中在目标集群上创建 Rsync 传输 pod。如果目标集群命名空间没有与源集群命名空间相同的注解,则无法调度 Rsync 传输 pod。Rsync pod 处于 Pending
状态。
您可以执行以下步骤识别并解决这个问题。
流程
检查
MigMigration
CR 的状态:oc describe migmigration <pod> -n openshift-migration
$ oc describe migmigration <pod> -n openshift-migration
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出包括以下状态消息:
输出示例
Some or all transfer pods are not running for more than 10 mins on destination cluster
Some or all transfer pods are not running for more than 10 mins on destination cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在源集群中,获取迁移的命名空间的详情:
oc get namespace <namespace> -o yaml
$ oc get namespace <namespace> -o yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定迁移的命名空间。
在目标集群中,编辑迁移的命名空间:
oc edit namespace <namespace>
$ oc edit namespace <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将缺少的
openshift.io/node-selector
注解添加到迁移的命名空间中,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 再次运行迁移计划。
12.4.2. 错误信息和解决方案 复制链接链接已复制到粘贴板!
本节论述了您可能会在 Migration Toolkit for Containers(MTC)中遇到的常见错误消息,以及如何解决其底层原因。
12.4.2.1. 首次访问 MTC 控制台时显示的 CA 证书错误 复制链接链接已复制到粘贴板!
如果在第一次尝试访问 MTC 控制台时显示 CA 证书错误
信息,则可能的原因是在一个集群中使用自签名的 CA 证书。
要解决这个问题,进入出错信息中显示的 oauth-authorization-server
URL 并接受证书。要永久解决这个问题,将证书添加到网页浏览器的信任存储中。
如果您接受证书后显示 Unauthorized
信息,进入 MTC 控制台并刷新网页。
12.4.2.2. MTC 控制台中的 OAuth 超时错误 复制链接链接已复制到粘贴板!
如果在接受自签名证书后,MTC 控制台中显示 connection has timed out
,其原因可能是:
- 对 OAuth 服务器的网络访问中断
- 对 OpenShift Container Platform 控制台的网络访问中断
-
代理配置中阻断了对
oauth-authorization-server
URL 的访问。详情请查看因为 OAuth 超时错误而无法访问 MTC 控制台。
要确定超时的原因:
- 使用浏览器 web 检查器检查 MTC 控制台网页。
-
检查
Migration UI
pod 日志中的错误。
12.4.2.3. 由未知颁发机构签名的证书错误 复制链接链接已复制到粘贴板!
如果您使用自签名证书来为 MTC 保护集群或复制仓库,则证书验证可能会失败,出错信息如下:Certificate signed by unknown authority
。
您可以创建自定义 CA 证书捆绑包文件,并在添加集群或复制存储库时将其上传到 MTC web 控制台。
流程
从远程端点下载 CA 证书,并将其保存为 CA 捆绑包文件:
echo -n | openssl s_client -connect <host_FQDN>:<port> \ | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <ca_bundle.cert>
$ echo -n | openssl s_client -connect <host_FQDN>:<port> \
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <ca_bundle.cert>
12.4.2.4. 在 Velero pod 日志中有备份存储位置错误 复制链接链接已复制到粘贴板!
如果 Velero
Backup
自定义资源包含对不存在的备份存储位置(BSL)的引用,Velero
pod 日志可能会显示以下错误消息:
oc logs <Velero_Pod> -n openshift-migration
$ oc logs <Velero_Pod> -n openshift-migration
输出示例
level=error msg="Error checking repository for stale locks" error="error getting backup storage location: BackupStorageLocation.velero.io \"ts-dpa-1\" not found" error.file="/remote-source/src/github.com/vmware-tanzu/velero/pkg/restic/repository_manager.go:259"
level=error msg="Error checking repository for stale locks" error="error getting backup storage location: BackupStorageLocation.velero.io \"ts-dpa-1\" not found" error.file="/remote-source/src/github.com/vmware-tanzu/velero/pkg/restic/repository_manager.go:259"
您可以忽略这些错误消息。缺少 BSL 不会导致迁移失败。
12.4.2.5. Velero pod 日志中的 Pod 卷备份超时错误 复制链接链接已复制到粘贴板!
如果因为 Restic 超时造成迁移失败,以下错误会在 Velero
pod 日志中显示。
level=error msg="Error backing up item" backup=velero/monitoring error="timed out waiting for all PodVolumeBackups to complete" error.file="/go/src/github.com/heptio/velero/pkg/restic/backupper.go:165" error.function="github.com/heptio/velero/pkg/restic.(*backupper).BackupPodVolumes" group=v1
level=error msg="Error backing up item" backup=velero/monitoring error="timed out waiting for all PodVolumeBackups to complete" error.file="/go/src/github.com/heptio/velero/pkg/restic/backupper.go:165" error.function="github.com/heptio/velero/pkg/restic.(*backupper).BackupPodVolumes" group=v1
restic_timeout
的默认值为一小时。您可以为大型迁移增加这个参数值,请注意,高的值可能会延迟返回出错信息。
流程
-
在 OpenShift Container Platform web 控制台中导航至 Operators
Installed Operators。 - 点 Migration Toolkit for Containers Operator。
- 在 MigrationController 标签页中点 migration-controller。
在 YAML 标签页中,更新以下参数值:
spec: restic_timeout: 1h
spec: restic_timeout: 1h
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 有效单元是
h
(小时)、m
(分钟)和s
(秒),例如3h30m15s
。
- 点击 Save。
12.4.2.6. MigMigration 自定义资源中的 Restic 验证错误 复制链接链接已复制到粘贴板!
如果迁移使用文件系统数据复制方法的持久性卷时数据验证失败,在 MigMigration
CR 中会显示以下错误。
输出示例
数据验证错误不会导致迁移过程失败。
您可以检查 Restore
CR,以识别数据验证错误的来源。
流程
- 登录到目标集群。
查看
Restore
CR:oc describe <registry-example-migration-rvwcm> -n openshift-migration
$ oc describe <registry-example-migration-rvwcm> -n openshift-migration
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出会标识出带有
PodVolumeRestore
错误的持久性卷。输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看
PodVolumeRestore
CR:oc describe <migration-example-rvwcm-98t49>
$ oc describe <migration-example-rvwcm-98t49>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出中标识了记录错误的
Restic
pod。输出示例
completionTimestamp: 2020-05-01T20:49:12Z errors: 1 resticErrors: 1 ... resticPod: <restic-nr2v5>
completionTimestamp: 2020-05-01T20:49:12Z errors: 1 resticErrors: 1 ... resticPod: <restic-nr2v5>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看
Restic
pod 日志以查找错误:oc logs -f <restic-nr2v5>
$ oc logs -f <restic-nr2v5>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
12.4.2.7. 从启用了 root_squash 的 NFS 存储中迁移时的 Restic 权限错误 复制链接链接已复制到粘贴板!
如果您要从 NFS 存储中迁移数据,并且启用了 root_squash
,Restic
会映射到 nfsnobody
,且没有执行迁移的权限。Restic
pod 日志中显示以下错误。
输出示例
backup=openshift-migration/<backup_id> controller=pod-volume-backup error="fork/exec /usr/bin/restic: permission denied" error.file="/go/src/github.com/vmware-tanzu/velero/pkg/controller/pod_volume_backup_controller.go:280" error.function="github.com/vmware-tanzu/velero/pkg/controller.(*podVolumeBackupController).processBackup" logSource="pkg/controller/pod_volume_backup_controller.go:280" name=<backup_id> namespace=openshift-migration
backup=openshift-migration/<backup_id> controller=pod-volume-backup error="fork/exec /usr/bin/restic: permission denied" error.file="/go/src/github.com/vmware-tanzu/velero/pkg/controller/pod_volume_backup_controller.go:280" error.function="github.com/vmware-tanzu/velero/pkg/controller.(*podVolumeBackupController).processBackup" logSource="pkg/controller/pod_volume_backup_controller.go:280" name=<backup_id> namespace=openshift-migration
您可以通过为 Restic 创建补充组并将组 ID 添加到 MigrationController
CR 清单来解决这个问题。
流程
- 在 NFS 存储上为 Restic 创建补充组。
-
在 NFS 目录上设置
setgid
位,以便继承组所有权。 将
restic_supplemental_groups
参数添加到源和目标集群上的MigrationController
CR 清单:spec: restic_supplemental_groups: <group_id>
spec: restic_supplemental_groups: <group_id>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定补充组 ID。
-
等待
Restic
pod 重启,以便应用更改。
当尝试使用 Migration Toolkit for Containers (MTC)迁移命名空间以及与之关联的大量卷时,rsync-server
可能会冻结,且没有提供用于进一步排除此问题的信息。
12.4.3.1. 诊断 Skip SELinux 重新标记临时解决方案 复制链接链接已复制到粘贴板!
在 kubelet 日志中搜索 Unable to attach or mount volumes for pod…timed out waiting for the condition
错误,它来自为 Direct Volume Migration (DVM) 运行 rsync-server
的节点。
kubelet 日志示例
kubenswrapper[3879]: W0326 16:30:36.749224 3879 volume_linux.go:49] Setting volume ownership for /var/lib/kubelet/pods/8905d88e-6531-4d65-9c2a-eff11dc7eb29/volumes/kubernetes.io~csi/pvc-287d1988-3fd9-4517-a0c7-22539acd31e6/mount and fsGroup set. If the volume has a lot of files then setting volume ownership could be slow, see https://github.com/kubernetes/kubernetes/issues/69699 kubenswrapper[3879]: E0326 16:32:02.706363 3879 kubelet.go:1841] "Unable to attach or mount volumes for pod; skipping pod" err="unmounted volumes=[8db9d5b032dab17d4ea9495af12e085a], unattached volumes=[crane2-rsync-server-secret 8db9d5b032dab17d4ea9495af12e085a kube-api-access-dlbd2 crane2-stunnel-server-config crane2-stunnel-server-secret crane2-rsync-server-config]: timed out waiting for the condition" pod="caboodle-preprod/rsync-server" kubenswrapper[3879]: E0326 16:32:02.706496 3879 pod_workers.go:965] "Error syncing pod, skipping" err="unmounted volumes=[8db9d5b032dab17d4ea9495af12e085a], unattached volumes=[crane2-rsync-server-secret 8db9d5b032dab17d4ea9495af12e085a kube-api-access-dlbd2 crane2-stunnel-server-config crane2-stunnel-server-secret crane2-rsync-server-config]: timed out waiting for the condition" pod="caboodle-preprod/rsync-server" podUID=8905d88e-6531-4d65-9c2a-eff11dc7eb29
kubenswrapper[3879]: W0326 16:30:36.749224 3879 volume_linux.go:49] Setting volume ownership for /var/lib/kubelet/pods/8905d88e-6531-4d65-9c2a-eff11dc7eb29/volumes/kubernetes.io~csi/pvc-287d1988-3fd9-4517-a0c7-22539acd31e6/mount and fsGroup set. If the volume has a lot of files then setting volume ownership could be slow, see https://github.com/kubernetes/kubernetes/issues/69699
kubenswrapper[3879]: E0326 16:32:02.706363 3879 kubelet.go:1841] "Unable to attach or mount volumes for pod; skipping pod" err="unmounted volumes=[8db9d5b032dab17d4ea9495af12e085a], unattached volumes=[crane2-rsync-server-secret 8db9d5b032dab17d4ea9495af12e085a kube-api-access-dlbd2 crane2-stunnel-server-config crane2-stunnel-server-secret crane2-rsync-server-config]: timed out waiting for the condition" pod="caboodle-preprod/rsync-server"
kubenswrapper[3879]: E0326 16:32:02.706496 3879 pod_workers.go:965] "Error syncing pod, skipping" err="unmounted volumes=[8db9d5b032dab17d4ea9495af12e085a], unattached volumes=[crane2-rsync-server-secret 8db9d5b032dab17d4ea9495af12e085a kube-api-access-dlbd2 crane2-stunnel-server-config crane2-stunnel-server-secret crane2-rsync-server-config]: timed out waiting for the condition" pod="caboodle-preprod/rsync-server" podUID=8905d88e-6531-4d65-9c2a-eff11dc7eb29
12.4.3.2. 使用 Skip SELinux 重新标记临时解决方案解决 复制链接链接已复制到粘贴板!
要解决这个问题,使用 MigrationController
自定义资源(CR)在源和目标 MigClusters
中将 migration_rsync_super_privileged
参数设置为 true
。
MigrationController CR 示例
- 1
migration_rsync_super_privileged
参数的值指示是否将 Rsync Pod 作为 超级特权容器 运行 (spc_t selinux context
)。有效设置为true
或false
。