7.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) 会继承集群范围的代理设置。如果要覆盖集群范围的代理设置,可以更改代理参数。
7.4.1. 直接卷迁移
MTC 1.4.2 中引入了直接卷迁移(DVM)。DVM 只支持一个代理。如果目标集群也位于代理后面,则源集群无法访问目标集群的路由。
如果要从代理后面的源集群执行 DVM,您必须配置一个 TCP 代理,该代理可在传输层进行透明处理,并在不使用自己的 SSL 证书的情况下转发 SSL 连接。Stunnel 代理是此类代理的示例。
7.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 中常见的代理配置不同。
7.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 代理。
7.4.1.3. 已知问题
迁移失败并显示 Upgrade request required
错误
迁移控制器使用 SPDY 协议在远程 pod 中执行命令。如果远程集群位于代理或不支持 SPDY 协议的防火墙后,迁移控制器将无法执行远程命令。迁移失败并显示出错信息 Upgrade request required
。临时解决方案: 使用支持 SPDY 协议的代理。
除了支持 SPDY 协议外,代理或防火墙还必须将 Upgrade
HTTP 标头传递给 API 服务器。客户端使用此标头打开与 API 服务器的 websocket 连接。如果代理或防火墙阻止 Upgrade
标头,则迁移会失败,并显示出错信息 Upgrade request required
。临时解决方案:确保代理转发 Upgrade
标头。
7.4.2. 为迁移调优网络策略
OpenShift 支持根据集群使用的网络插件,限制使用 NetworkPolicy 或 EgressFirewalls 的流量。如果任何涉及迁移的源命名空间使用此类机制将网络流量限制到 pod,限制可能会在迁移过程中停止到 Rsync pod 的流量。
在源和目标集群上运行的 rsync pod 必须通过 OpenShift Route 相互连接。可将现有的 NetworkPolicy 或 EgressNetworkPolicy 对象配置为从这些流量限制自动排除 Rsync pod。
7.4.2.1. NetworkPolicy 配置
7.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
7.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
7.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
7.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]
7.4.2.4. 为 Rsync pod 配置补充组
当 PVC 使用共享存储时,您可以通过将 supplemental 组添加到 Rsync pod 定义来配置对存储的访问,以便 pod 允许访问:
变量 | 类型 | Default(默认) | 描述 |
---|---|---|---|
| string | 未设置 | 用于源 Rsync pod 的以逗号分隔的补充组列表 |
| string | 未设置 | 目标 Rsync pod 的,以逗号分隔的补充组列表 |
用法示例
可以更新 MigrationController
CR,以便为这些补充组设置值:
spec: src_supplemental_groups: "1000,2000" target_supplemental_groups: "2000,3000"
7.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
如需更多信息,请参阅配置集群范围代理。