3.4. 代理配置
对于 OpenShift Container Platform 4.1 及更早的版本,您必须在安装 Migration Toolkit for Containers Operator 后,在 MigrationController
自定义资源 (CR) 清单中配置代理,因为这些版本不支持集群范围的 proxy
对象。
对于 OpenShift Container Platform 4.2 到 4.12,MTC 的 Migration Toolkit for Containers (MTC) 会继承集群范围的代理设置。如果要覆盖集群范围的代理设置,可以更改代理参数。
3.4.1. 直接卷迁移
MTC 1.4.2 中引入了直接卷迁移(DVM)。DVM 只支持一个代理。如果目标集群也位于代理后面,则源集群无法访问目标集群的路由。
如果要从代理后面的源集群执行 DVM,您必须配置一个 TCP 代理,该代理可在传输层进行透明处理,并在不使用自己的 SSL 证书的情况下转发 SSL 连接。Stunnel 代理是此类代理的示例。
3.4.1.1. DVM 的 TCP 代理设置
您可以通过 TCP 代理在源和目标集群之间设置直接连接,并在 MigrationController
CR 中配置 stunnel_tcp_proxy
变量来使用代理:
apiVersion: migration.openshift.io/v1alpha1 kind: MigrationController metadata: name: migration-controller namespace: openshift-migration spec: [...] stunnel_tcp_proxy: http://username:password@ip:port
直接卷迁移(DVM)只支持代理的基本身份验证。此外,DVM 仅适用于可透明地传输 TCP 连接的代理。在 man-in-the-middle 模式中的 HTTP/HTTPS 代理无法正常工作。现有的集群范围的代理可能不支持此行为。因此,DVM 的代理设置意与 MTC 中常见的代理配置不同。
3.4.1.2. 为什么使用 TCP 代理而不是 HTTP/HTTPS 代理?
您可以通过 OpenShift 路由在源和目标集群之间运行 Rsync 来启用 DVM。流量通过 TCP 代理(Stunnel)加密。在源集群上运行的 Stunnel 会启动与目标 Stunnel 的 TLS 连接,并通过加密频道来传输数据。
OpenShift 中的集群范围 HTTP/HTTPS 代理通常在 man-in-the-middle 模式进行配置,其中它们将自己的 TLS 会话与外部服务器协商。但是,这不适用于 Stunnel。Stunnel 要求代理不处理它的 TLS 会话,基本上使代理成为一个透明的隧道,只需按原样转发 TCP 连接。因此,您必须使用 TCP 代理。
3.4.1.3. 已知问题
迁移失败并显示 Upgrade request required
错误
迁移控制器使用 SPDY 协议在远程 pod 中执行命令。如果远程集群位于代理或不支持 SPDY 协议的防火墙后,迁移控制器将无法执行远程命令。迁移失败并显示出错信息 Upgrade request required
。临时解决方案: 使用支持 SPDY 协议的代理。
除了支持 SPDY 协议外,代理或防火墙还必须将 Upgrade
HTTP 标头传递给 API 服务器。客户端使用此标头打开与 API 服务器的 websocket 连接。如果代理或防火墙阻止 Upgrade
标头,则迁移会失败,并显示出错信息 Upgrade request required
。临时解决方案:确保代理转发 Upgrade
标头。
3.4.2. 为迁移调优网络策略
OpenShift 支持根据集群使用的网络插件,限制使用 NetworkPolicy 或 EgressFirewalls 的流量。如果任何涉及迁移的源命名空间使用此类机制将网络流量限制到 pod,限制可能会在迁移过程中停止到 Rsync pod 的流量。
在源和目标集群上运行的 rsync pod 必须通过 OpenShift Route 相互连接。可将现有的 NetworkPolicy 或 EgressNetworkPolicy 对象配置为从这些流量限制自动排除 Rsync pod。
3.4.2.1. NetworkPolicy 配置
3.4.2.1.1. 来自 Rsync pod 的出口流量
如果源或目标命名空间中的 NetworkPolicy
配置阻止这种类型的流量,您可以使用 Rsync pod 的唯一标签来允许出口流量从它们传递。以下策略允许来自命名空间中 Rsync pod 的所有出口流量:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-egress-from-rsync-pods spec: podSelector: matchLabels: owner: directvolumemigration app: directvolumemigration-rsync-transfer egress: - {} policyTypes: - Egress
3.4.2.1.2. 到 Rsync pod 的入口流量
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-egress-from-rsync-pods spec: podSelector: matchLabels: owner: directvolumemigration app: directvolumemigration-rsync-transfer ingress: - {} policyTypes: - Ingress
3.4.2.2. EgressNetworkPolicy 配置
EgressNetworkPolicy
对象或 Egress Firewalls 是 OpenShift 构造,用于阻止离开集群的出口流量。
与 NetworkPolicy
对象不同,egress Firewall 在项目级别工作,因为它适用于命名空间中的所有 pod。因此,Rsync pod 的唯一标签不会使只有 Rsync pod 的 Rsync pod 冲突。但是,您可以将源集群或目标集群的 CIDR 范围添加到策略的 Allow 规则中,以便可以在两个集群之间设置直接连接。
根据存在 Egress Firewall 的集群,您可以添加其他集群的 CIDR 范围来允许两者间的出口流量:
apiVersion: network.openshift.io/v1 kind: EgressNetworkPolicy metadata: name: test-egress-policy namespace: <namespace> spec: egress: - to: cidrSelector: <cidr_of_source_or_target_cluster> type: Deny
3.4.2.3. 为数据传输选择备用端点
默认情况下,DVM 使用 OpenShift Container Platform 路由作为端点,将 PV 数据传送到目标集群。如果集群拓扑允许,您可以选择其他类型的支持的端点。
对于每个集群,您可以通过在 MigrationController
CR 中适当的 目标集群上设置 rsync_endpoint_type
变量来配置端点:
apiVersion: migration.openshift.io/v1alpha1 kind: MigrationController metadata: name: migration-controller namespace: openshift-migration spec: [...] rsync_endpoint_type: [NodePort|ClusterIP|Route]
3.4.2.4. 为 Rsync pod 配置补充组
当 PVC 使用共享存储时,您可以通过将 supplemental 组添加到 Rsync pod 定义来配置对存储的访问,以便 pod 允许访问:
表 3.2. Rsync pod 的附加组群
变量 | 类型 | 默认值 | 描述 |
---|---|---|---|
| 字符串 | 未设置 | 用于源 Rsync pod 的以逗号分隔的补充组列表 |
| 字符串 | 未设置 | 目标 Rsync pod 的,以逗号分隔的补充组列表 |
用法示例
可以更新 MigrationController
CR,以便为这些补充组设置值:
spec: src_supplemental_groups: "1000,2000" target_supplemental_groups: "2000,3000"
3.4.3. 配置代理
先决条件
-
必须使用在所有集群中具有
cluster-admin
权限的用户登录。
流程
获取
MigrationController
CR 清单:$ oc get migrationcontroller <migration_controller> -n openshift-migration
更新代理参数:
apiVersion: migration.openshift.io/v1alpha1 kind: MigrationController metadata: name: <migration_controller> namespace: openshift-migration ... spec: stunnel_tcp_proxy: http://<username>:<password>@<ip>:<port> 1 noProxy: example.com 2
在域前面加上
.
以仅匹配子域。例如:.y.com
匹配x.y.com
,但不匹配y.com
。使用*
可对所有目的地绕过所有代理。如果您扩展了未包含在安装配置中networking.machineNetwork[].cidr
字段定义的 worker,您必须将它们添加到此列表中,以防止连接问题。如果未设置
httpProxy
和httpsProxy
字段,则此字段将被忽略。-
将清单保存为
migration-controller.yaml
。 应用更新的清单:
$ oc replace -f migration-controller.yaml -n openshift-migration
如需更多信息,请参阅配置集群范围代理。
3.4.4. 以 root 或非 root 身份运行 Rsync
本节仅在使用 OpenShift API 而不是 Web 控制台时应用。
OpenShift 环境默认启用 PodSecurityAdmission
控制器。此控制器要求集群管理员通过命名空间标签强制实施 Pod 安全标准。集群中的所有工作负载都应该运行以下 Pod 安全标准级别之一: Privileged
、Baseline
或 Restricted
。每个集群都有自己的默认策略集。
为了保证在所有环境中成功进行数据传输,MTC 1.7.5 引入了 Rsync pod 中的更改,包括默认以非 root 用户身份运行 Rsync pod。这样可确保即使不一定需要更高特权的工作负载也可以进行数据传输。这个更改是进行的,因为它最适合运行具有最低级别权限的工作负载。
3.4.4.1. 为数据 trannsfer 手动覆盖默认非 root 操作
虽然在大多数情况下,以非 root 用户身份运行 Rsync pod 可以正常工作,但当您以 root 用户身份在源端运行工作负载时,数据传输可能会失败。MTC 提供了为数据传输手动覆盖默认非 root 操作的方法:
- 将所有迁移配置为作为 root 在目标集群上针对所有迁移运行 Rsync pod。
- 对于每个迁移,在目标集群上以 root 用户身份运行 Rsync pod。
在这两种情况下,您必须在迁移前运行具有较高权限的工作负载的命名空间源上设置以下标签: enforce
、audit
和 warn。
要了解更多有关标签的 Pod Security Admission 和设置值的信息,请参阅 控制 pod 安全准入同步。
3.4.4.2. 将所有迁移的 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
此配置将适用于所有将来的迁移。
3.4.4.3. 将 MigMigration CR 配置为每个迁移的根或非 root
在目标集群中,您可以使用以下非 root 选项将 MigMigration
CR 配置为以 root 或非 root 身份运行 Rsync:
- 作为特定用户 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
要将 Rsync 作为特定用户 ID (UID)或特定组 ID (GID)运行,请根据本例配置
MigMigration
CR:apiVersion: migration.openshift.io/v1alpha1 kind: MigMigration metadata: name: migration-controller namespace: openshift-migration spec: [...] runAsUser: 10010001 runAsGroup: 3