spec:
src_supplemental_groups: "1000,2000"
target_supplemental_groups: "2000,3000"
迁移工具包 for Containers (MTC) 1.4.0 或更高版本可用直接迁移。
直接迁移包含两个部分
直接卷迁移
直接镜像迁移
直接迁移允许直接从源集群到目标集群迁移持久卷和内部镜像,无需中间复制存储库(对象存储)。
公开参与迁移的两个集群(源集群和目标集群)的内部注册表以进行外部流量。
确保远程源集群和目标集群可以使用 OpenShift Container Platform 路由在端口 443 上进行通信。
在源和目标 MTC 集群中配置公开的注册表路由;通过指定spec.exposedRegistryPath
字段或从 MTC UI 进行此操作。
|
确保MigPlan
自定义资源 (CR) 中的两个规范标志indirectImageMigration
和indirectVolumeMigration
设置为false
才能执行直接迁移。这些标志的默认值为false
。
MTC 的直接迁移功能使用 Rsync 实用程序。
MTC 中的直接卷迁移 (DVM) 使用 Rsync 在源和目标持久卷 (PV) 之间同步文件,使用两个 PV 之间的直接连接。
Rsync 是一个命令行工具,允许您将文件和目录传输到本地和远程目标。
DVM 使用的rsync
命令针对按预期运行的集群进行了优化。
MigrationController
CR 公开了以下变量以在直接卷迁移中配置rsync_options
变量 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
int |
未设置 |
设置为正整数时, |
|
bool |
|
在 Rsync 命令中设置 |
|
bool |
|
在 Rsync 命令中设置 |
|
bool |
|
在 Rsync 命令中设置 |
|
bool |
|
在 Rsync 命令中设置 |
|
string |
|
启用 Rsync Pod 中的详细日志记录。 |
|
string |
空 |
为任何其他任意选项保留。 |
通过上述变量设置的选项对所有迁移都是全局的。一旦 Operator 成功协调MigrationController
CR,配置将对所有未来的迁移生效。任何正在进行的迁移都可以使用更新的设置,具体取决于它当前处于哪个步骤。因此,建议在运行迁移之前应用这些设置。用户可以根据需要随时更新设置。
谨慎使用rsync_opt_extras
变量。使用此变量传递的任何选项都将附加到rsync
命令中。指定多个选项时,请确保添加空格。指定选项中的任何错误都可能导致迁移失败。但是,您可以根据需要多次更新MigrationController
CR 以进行未来的迁移。
自定义rsync_opt_info
标志可能会对 MTC 中的进度报告功能产生不利影响。但是,删除进度报告可能会提高性能。只有当观察到 Rsync 操作的性能不可接受时,才应使用此选项。
DVM 使用的默认配置已在各种环境中进行了测试。如果集群运行良好且性能良好,则它适用于大多数生产用例。如果默认设置不起作用且 Rsync 操作失败,则应使用这些配置变量。 |
MigrationController
CR 公开了以下变量以配置 Rsync 的资源使用要求和限制
变量 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
string |
|
源 Rsync Pod 的 CPU 限制 |
|
string |
|
源 Rsync Pod 的内存限制 |
|
string |
|
源 Rsync Pod 的 CPU 请求 |
|
string |
|
源 Rsync Pod 的内存请求 |
|
string |
|
目标 Rsync Pod 的 CPU 限制 |
|
string |
|
目标 Rsync Pod 的 CPU 请求 |
|
string |
|
目标 Rsync Pod 的内存限制 |
|
string |
|
目标 Rsync Pod 的内存请求 |
如果持久卷声明 (PVC) 使用共享存储,则可以通过向 Rsync Pod 定义添加补充组来配置对存储的访问,以便 Pod 允许访问。
变量 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
string |
未设置 |
源 Rsync Pod 的补充组的逗号分隔列表 |
|
string |
未设置 |
目标 Rsync Pod 的补充组的逗号分隔列表 |
例如,可以更新MigrationController
CR 以设置之前的数值
spec:
src_supplemental_groups: "1000,2000"
target_supplemental_groups: "2000,3000"
从容器迁移工具包 (MTC) 1.4.3 版本开始,引入了一种重试失败 Rsync 操作的新功能。
默认情况下,迁移控制器会重试 Rsync,直到所有数据成功从源卷传输到目标卷,或者达到指定的重试次数。默认重试限制设置为20
。
对于较大的卷,20
次重试可能不足。
可以使用MigrationController
CR 中的以下变量来增加重试限制
apiVersion: migration.openshift.io/v1alpha1
kind: MigrationController
metadata:
name: migration-controller
namespace: openshift-migration
spec:
[...]
rsync_backoff_limit: 40
在此示例中,重试限制增加到40
。
OpenShift Container Platform 环境默认启用PodSecurityAdmission
控制器。此控制器要求集群管理员通过命名空间标签强制执行 Pod 安全标准。集群中的所有工作负载都应运行以下 Pod 安全标准级别之一:Privileged
、Baseline
或Restricted
。每个集群都有其自身的默认策略设置。
为了保证在所有环境中都能成功传输数据,容器迁移工具包 (MTC) 1.7.5 对 Rsync Pod 做了更改,包括默认情况下以非 root 用户身份运行 Rsync Pod。这确保即使对于不需要较高权限的工作负载,也能进行数据传输。之所以进行此更改,是因为最好以尽可能低的权限级别运行工作负载。
尽管在大多数情况下以非 root 用户身份运行 Rsync Pod 都可以正常工作,但在源端以 root 用户身份运行工作负载时,数据传输可能会失败。MTC 提供两种方法来手动覆盖数据传输的默认非 root 操作
配置所有迁移,以便在目标集群上以 root 身份运行 Rsync Pod。
在每次迁移中,在目标集群上以 root 身份运行 Rsync Pod。
在这两种情况下,都必须在迁移之前,在运行具有较高权限的工作负载的任何命名空间的源端设置以下标签:enforce
、audit
和warn
。
要了解有关 Pod 安全准入和设置标签值的更多信息,请参阅控制 Pod 安全准入同步。
默认情况下,Rsync 以非 root 身份运行。
在目标集群上,可以将MigrationController
CR 配置为以 root 身份运行 Rsync。
按如下所示配置MigrationController
CR
apiVersion: migration.openshift.io/v1alpha1
kind: MigrationController
metadata:
name: migration-controller
namespace: openshift-migration
spec:
[...]
migration_rsync_privileged: true
此配置将应用于所有将来的迁移。
在目标集群上,您可以配置MigMigration
CR 以 root 或非 root 身份运行 Rsync,并使用以下非 root 选项
作为特定用户 ID (UID)
作为特定组 ID (GID)
要以 root 身份运行 Rsync,请根据此示例配置MigMigration
CR
apiVersion: migration.openshift.io/v1alpha1
kind: MigMigration
metadata:
name: migration-controller
namespace: openshift-migration
spec:
[...]
runAsRoot: true
要以特定用户 ID (UID) 或特定组 ID (GID) 身份运行 Rsync,请根据此示例配置MigMigration
CR
apiVersion: migration.openshift.io/v1alpha1
kind: MigMigration
metadata:
name: migration-controller
namespace: openshift-migration
spec:
[...]
runAsUser: 10010001
runAsGroup: 3
对于在容器迁移工具包 (MTC) 中创建的每个MigCluster
资源,都会在 MigCluster 资源所代表的集群上的迁移运算符命名空间中创建一个名为migration-cluster-config
的ConfigMap
。
migration-cluster-config
允许您配置特定于 MigCluster 的值。迁移运算符管理migration-cluster-config
。
可以使用MigrationController
CR 中公开的变量来配置ConfigMap
中的每个值
变量 | 类型 | 必需 | 描述 |
---|---|---|---|
|
string |
否 |
用于阶段 Pod 的镜像(仅适用于 IndirectVolumeMigration) |
|
string |
否 |
用于迁移注册表的镜像 |
|
string |
否 |
数据传输的端点类型( |
|
string |
否 |
用于 Rsync Pod 的镜像(仅适用于 DirectVolumeMigration) |
|
bool |
否 |
是否以特权方式运行 Rsync Pod |
|
bool |
否 |
是否以超级特权容器 ( |
|
string |
否 |
集群的子域名 |
|
int |
否 |
迁移注册表部署的准备就绪超时(以秒为单位) |
|
int |
否 |
迁移注册表部署的存活性超时(以秒为单位) |
|
string |
否 |
验证 MigCluster 中公开注册表的子路径(例如 /v2) |
spc_t
尝试使用容器迁移工具包 (MTC) 迁移具有与其关联的大量卷的命名空间时,rsync-server
可能会冻结,没有任何进一步的信息来排除问题。
在运行直接卷迁移 (DVM) 的rsync-server
所在的节点的 kubelet 日志中搜索无法附加或挂载 pod 的卷……等待条件超时
错误。
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
要解决此问题,请使用MigrationController
自定义资源 (CR) 在源和目标MigClusters
中都将migration_rsync_super_privileged
参数设置为true
。
apiVersion: migration.openshift.io/v1alpha1
kind: MigrationController
metadata:
name: migration-controller
namespace: openshift-migration
spec:
migration_rsync_super_privileged: true (1)
azure_resource_group: ""
cluster_name: host
mig_namespace_limit: "10"
mig_pod_limit: "100"
mig_pv_limit: "100"
migration_controller: true
migration_log_reader: true
migration_ui: true
migration_velero: true
olm_managed: true
restic_timeout: 1h
version: 1.8.3
1 | migration_rsync_super_privileged 参数的值指示是否将 Rsync Pod 作为超级特权容器 (spc_t selinux context ) 运行。有效设置为true 或false 。 |