×

迁移工具包 for Containers (MTC) 1.4.0 或更高版本可用直接迁移。

直接迁移包含两个部分

  • 直接卷迁移

  • 直接镜像迁移

直接迁移允许直接从源集群到目标集群迁移持久卷和内部镜像,无需中间复制存储库(对象存储)。

先决条件

  • 公开参与迁移的两个集群(源集群和目标集群)的内部注册表以进行外部流量。

  • 确保远程源集群和目标集群可以使用 OpenShift Container Platform 路由在端口 443 上进行通信。

  • 在源和目标 MTC 集群中配置公开的注册表路由;通过指定spec.exposedRegistryPath字段或从 MTC UI 进行此操作。

    • 如果目标集群与主机集群相同(存在迁移控制器的地方),则无需为该特定 MTC 集群配置公开的注册表路由。

    • spec.exposedRegistryPath仅对于直接镜像迁移是必需的,而对于直接卷迁移则不是。

  • 确保MigPlan自定义资源 (CR) 中的两个规范标志indirectImageMigrationindirectVolumeMigration设置为false才能执行直接迁移。这些标志的默认值为false

MTC 的直接迁移功能使用 Rsync 实用程序。

直接卷迁移的 Rsync 配置

MTC 中的直接卷迁移 (DVM) 使用 Rsync 在源和目标持久卷 (PV) 之间同步文件,使用两个 PV 之间的直接连接。

Rsync 是一个命令行工具,允许您将文件和目录传输到本地和远程目标。

DVM 使用的rsync命令针对按预期运行的集群进行了优化。

MigrationController CR 公开了以下变量以在直接卷迁移中配置rsync_options

变量 类型 默认值 描述

rsync_opt_bwlimit

int

未设置

设置为正整数时,--bwlimit=<int>选项将添加到 Rsync 命令。

rsync_opt_archive

bool

true

在 Rsync 命令中设置--archive选项。

rsync_opt_partial

bool

true

在 Rsync 命令中设置--partial选项。

rsync_opt_delete

bool

true

在 Rsync 命令中设置--delete选项。

rsync_opt_hardlinks

bool

true

在 Rsync 命令中设置--hard-links选项。

rsync_opt_info

string

COPY2

DEL2

REMOVE2

SKIP2

FLIST2

PROGRESS2

STATS2

启用 Rsync Pod 中的详细日志记录。

rsync_opt_extras

string

为任何其他任意选项保留。

  • 通过上述变量设置的选项对所有迁移都是全局的。一旦 Operator 成功协调MigrationController CR,配置将对所有未来的迁移生效。任何正在进行的迁移都可以使用更新的设置,具体取决于它当前处于哪个步骤。因此,建议在运行迁移之前应用这些设置。用户可以根据需要随时更新设置。

  • 谨慎使用rsync_opt_extras变量。使用此变量传递的任何选项都将附加到rsync命令中。指定多个选项时,请确保添加空格。指定选项中的任何错误都可能导致迁移失败。但是,您可以根据需要多次更新MigrationController CR 以进行未来的迁移。

  • 自定义rsync_opt_info标志可能会对 MTC 中的进度报告功能产生不利影响。但是,删除进度报告可能会提高性能。只有当观察到 Rsync 操作的性能不可接受时,才应使用此选项。

DVM 使用的默认配置已在各种环境中进行了测试。如果集群运行良好且性能良好,则它适用于大多数生产用例。如果默认设置不起作用且 Rsync 操作失败,则应使用这些配置变量。

Rsync Pod 的资源限制配置

MigrationController CR 公开了以下变量以配置 Rsync 的资源使用要求和限制

变量 类型 默认值 描述

source_rsync_pod_cpu_limits

string

1

源 Rsync Pod 的 CPU 限制

source_rsync_pod_memory_limits

string

1Gi

源 Rsync Pod 的内存限制

source_rsync_pod_cpu_requests

string

400m

源 Rsync Pod 的 CPU 请求

source_rsync_pod_memory_requests

string

1Gi

源 Rsync Pod 的内存请求

target_rsync_pod_cpu_limits

string

1

目标 Rsync Pod 的 CPU 限制

target_rsync_pod_cpu_requests

string

400m

目标 Rsync Pod 的 CPU 请求

target_rsync_pod_memory_limits

string

1Gi

目标 Rsync Pod 的内存限制

target_rsync_pod_memory_requests

string

1Gi

目标 Rsync Pod 的内存请求

Rsync Pod 的补充组配置

如果持久卷声明 (PVC) 使用共享存储,则可以通过向 Rsync Pod 定义添加补充组来配置对存储的访问,以便 Pod 允许访问。

变量 类型 默认值 描述

src_supplemental_groups

string

未设置

源 Rsync Pod 的补充组的逗号分隔列表

target_supplemental_groups

string

未设置

目标 Rsync Pod 的补充组的逗号分隔列表

例如,可以更新MigrationController CR 以设置之前的数值

spec:
  src_supplemental_groups: "1000,2000"
  target_supplemental_groups: "2000,3000"

Rsync 重试配置

从容器迁移工具包 (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

以 root 或非 root 用户身份运行 Rsync

OpenShift Container Platform 环境默认启用PodSecurityAdmission控制器。此控制器要求集群管理员通过命名空间标签强制执行 Pod 安全标准。集群中的所有工作负载都应运行以下 Pod 安全标准级别之一:PrivilegedBaselineRestricted。每个集群都有其自身的默认策略设置。

为了保证在所有环境中都能成功传输数据,容器迁移工具包 (MTC) 1.7.5 对 Rsync Pod 做了更改,包括默认情况下以非 root 用户身份运行 Rsync Pod。这确保即使对于不需要较高权限的工作负载,也能进行数据传输。之所以进行此更改,是因为最好以尽可能低的权限级别运行工作负载。

手动覆盖数据传输的默认非 root 操作

尽管在大多数情况下以非 root 用户身份运行 Rsync Pod 都可以正常工作,但在源端以 root 用户身份运行工作负载时,数据传输可能会失败。MTC 提供两种方法来手动覆盖数据传输的默认非 root 操作

  • 配置所有迁移,以便在目标集群上以 root 身份运行 Rsync Pod。

  • 在每次迁移中,在目标集群上以 root 身份运行 Rsync Pod。

在这两种情况下,都必须在迁移之前,在运行具有较高权限的工作负载的任何命名空间的源端设置以下标签:enforceauditwarn

要了解有关 Pod 安全准入和设置标签值的更多信息,请参阅控制 Pod 安全准入同步

将 MigrationController CR 配置为所有迁移的 root 或非 root

默认情况下,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

在目标集群上,您可以配置MigMigration CR 以 root 或非 root 身份运行 Rsync,并使用以下非 root 选项

  • 作为特定用户 ID (UID)

  • 作为特定组 ID (GID)

步骤
  1. 要以 root 身份运行 Rsync,请根据此示例配置MigMigration CR

    apiVersion: migration.openshift.io/v1alpha1
    kind: MigMigration
    metadata:
      name: migration-controller
      namespace: openshift-migration
    spec:
      [...]
      runAsRoot: true
  2. 要以特定用户 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

MigCluster 配置

对于在容器迁移工具包 (MTC) 中创建的每个MigCluster资源,都会在 MigCluster 资源所代表的集群上的迁移运算符命名空间中创建一个名为migration-cluster-configConfigMap

migration-cluster-config允许您配置特定于 MigCluster 的值。迁移运算符管理migration-cluster-config

可以使用MigrationController CR 中公开的变量来配置ConfigMap中的每个值

变量 类型 必需 描述

migration_stage_image_fqin

string

用于阶段 Pod 的镜像(仅适用于 IndirectVolumeMigration)

migration_registry_image_fqin

string

用于迁移注册表的镜像

rsync_endpoint_type

string

数据传输的端点类型(RouteClusterIPNodePort

rsync_transfer_image_fqin

string

用于 Rsync Pod 的镜像(仅适用于 DirectVolumeMigration)

migration_rsync_privileged

bool

是否以特权方式运行 Rsync Pod

migration_rsync_super_privileged

bool

是否以超级特权容器 (spc_t SELinux 上下文) 运行 Rsync Pod

cluster_subdomain

string

集群的子域名

migration_registry_readiness_timeout

int

迁移注册表部署的准备就绪超时(以秒为单位)

migration_registry_liveness_timeout

int

迁移注册表部署的存活性超时(以秒为单位)

exposed_registry_validation_path

string

验证 MigCluster 中公开注册表的子路径(例如 /v2)

直接迁移已知问题

在 OpenShift Container Platform 上运行的工作负载上自动应用跳过 SELinux 重新标记变通方法与spc_t

尝试使用容器迁移工具包 (MTC) 迁移具有与其关联的大量卷的命名空间时,rsync-server可能会冻结,没有任何进一步的信息来排除问题。

诊断是否需要跳过 SELinux 重新标记变通方法

在运行直接卷迁移 (DVM) 的rsync-server所在的节点的 kubelet 日志中搜索无法附加或挂载 pod 的卷……等待条件超时错误。

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

使用跳过 SELinux 重新标记变通方法解决

要解决此问题,请使用MigrationController自定义资源 (CR) 在源和目标MigClusters中都将migration_rsync_super_privileged参数设置为true

MigrationController CR 示例
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) 运行。有效设置为truefalse