$ podman login registry.redhat.io
您可以通过执行以下步骤,在受限网络环境中的 OpenShift Container Platform 3 和 4 上安装容器迁移工具包 (MTC)
创建镜像操作符目录。
此过程会创建一个 `mapping.txt` 文件,其中包含 `registry.redhat.io` 镜像和镜像注册表镜像之间的映射。安装源集群上的操作符需要 `mapping.txt` 文件。
使用 Operator Lifecycle Manager 在 OpenShift Container Platform 4.17 目标集群上安装容器迁移工具包操作符。
默认情况下,MTC Web 控制台和 `Migration Controller` Pod 在目标集群上运行。您可以配置 `Migration Controller` 自定义资源清单,以在源集群或远程集群上运行 MTC Web 控制台和 `Migration Controller` Pod。
从命令行界面在 OpenShift Container Platform 3 源集群上安装 *旧版* 容器迁移工具包操作符。
配置用作复制存储库的对象存储。
要卸载 MTC,请参阅卸载 MTC 并删除资源。
您必须安装与您的 OpenShift Container Platform 版本兼容的容器迁移工具包 (MTC) 运算符。
运行 MTC 控制器和 GUI 的集群。
迁移的源集群或目标集群,运行 Velero。控制集群使用 Velero API 与远程集群通信以驱动迁移。
您必须使用兼容的 MTC 版本来迁移您的 OpenShift Container Platform 集群。为了使迁移成功,您的源集群和目标集群都必须使用相同版本的 MTC。
MTC 1.7 支持从 OpenShift Container Platform 3.11 迁移到 4.17。
MTC 1.8 仅支持从 OpenShift Container Platform 4.14 及更高版本迁移。
详情 | OpenShift Container Platform 3.11 | OpenShift Container Platform 4.14 或更高版本 |
---|---|---|
稳定版 MTC 版本 |
MTC v.1.7.z |
MTC v.1.8.z |
安装 |
如本指南所述 |
使用 OLM 安装,发布渠道 `release-v1.8` |
存在一些边缘情况,网络限制会阻止 OpenShift Container Platform 4 集群连接到参与迁移的其他集群。例如,当将本地 OpenShift Container Platform 3.11 集群迁移到云中的 OpenShift Container Platform 4 集群时,OpenShift Container Platform 4 集群可能无法连接到 OpenShift Container Platform 3.11 集群。在这种情况下,可以将 OpenShift Container Platform 3.11 集群指定为控制集群,并将工作负载推送到远程 OpenShift Container Platform 4 集群。
您可以使用 Operator Lifecycle Manager 在 OpenShift Container Platform 4.17 上安装容器迁移工具包运算符。
您必须以所有集群上的 `cluster-admin` 权限的用户身份登录。
您必须从本地注册表中的镜像创建运算符目录。
在 OpenShift Container Platform Web 控制台中,单击**运算符** → **OperatorHub**。
使用**按关键字筛选**字段查找**容器迁移工具包运算符**。
选择**容器迁移工具包运算符**,然后单击**安装**。
单击**安装**。
在**已安装的运算符**页面上,**容器迁移工具包运算符**将显示在 `openshift-migration` 项目中,状态为**成功**。
单击**容器迁移工具包运算符**。
在**提供的 API**下,找到**迁移控制器**图块,然后单击**创建实例**。
单击**创建**。
单击**工作负载** → **Pod** 以验证 MTC Pod 是否正在运行。
您可以在 OpenShift Container Platform 3 上手动安装旧版容器迁移工具包运算符。
您必须以所有集群上的 `cluster-admin` 权限的用户身份登录。
您必须能够访问 `registry.redhat.io`。
您必须安装 `podman`。
您必须创建一个镜像流密钥并将其复制到集群中的每个节点。
您必须拥有一个具有网络访问权限的 Linux 工作站,以便可以从 `registry.redhat.io` 下载文件。
您必须创建运算符目录的镜像。
您必须从 OpenShift Container Platform 4.17 上的镜像运算符目录安装容器迁移工具包运算符。
使用您的 Red Hat 客户门户凭据登录 `registry.redhat.io`
$ podman login registry.redhat.io
通过输入以下命令下载 `operator.yml` 文件
podman cp $(podman create registry.redhat.io/rhmtc/openshift-migration-legacy-rhel8-operator:v1.7):/operator.yml ./
通过输入以下命令下载 `controller.yml` 文件
podman cp $(podman create registry.redhat.io/rhmtc/openshift-migration-legacy-rhel8-operator:v1.7):/controller.yml ./
通过运行以下命令获取运算符镜像映射
$ grep openshift-migration-legacy-rhel8-operator ./mapping.txt | grep rhmtc
`mapping.txt` 文件在您镜像运算符目录时创建。输出显示 `registry.redhat.io` 镜像和您的镜像注册表镜像之间的映射。
registry.redhat.io/rhmtc/openshift-migration-legacy-rhel8-operator@sha256:468a6126f73b1ee12085ca53a312d1f96ef5a2ca03442bcb63724af5e2614e8a=<registry.apps.example.com>/rhmtc/openshift-migration-legacy-rhel8-operator
更新 `operator.yml` 文件中 `ansible` 和 `operator` 容器的 `image` 值以及 `REGISTRY` 值
containers:
- name: ansible
image: <registry.apps.example.com>/rhmtc/openshift-migration-legacy-rhel8-operator@sha256:<468a6126f73b1ee12085ca53a312d1f96ef5a2ca03442bcb63724af5e2614e8a> (1)
...
- name: operator
image: <registry.apps.example.com>/rhmtc/openshift-migration-legacy-rhel8-operator@sha256:<468a6126f73b1ee12085ca53a312d1f96ef5a2ca03442bcb63724af5e2614e8a> (1)
...
env:
- name: REGISTRY
value: <registry.apps.example.com> (2)
1 | 指定您的镜像注册表和运算符镜像的 `sha256` 值。 |
2 | 指定您的镜像注册表。 |
登录到您的 OpenShift Container Platform 源集群。
创建容器迁移工具包运算符对象
$ oc create -f operator.yml
namespace/openshift-migration created
rolebinding.rbac.authorization.k8s.io/system:deployers created
serviceaccount/migration-operator created
customresourcedefinition.apiextensions.k8s.io/migrationcontrollers.migration.openshift.io created
role.rbac.authorization.k8s.io/migration-operator created
rolebinding.rbac.authorization.k8s.io/migration-operator created
clusterrolebinding.rbac.authorization.k8s.io/migration-operator created
deployment.apps/migration-operator created
Error from server (AlreadyExists): error when creating "./operator.yml":
rolebindings.rbac.authorization.k8s.io "system:image-builders" already exists (1)
Error from server (AlreadyExists): error when creating "./operator.yml":
rolebindings.rbac.authorization.k8s.io "system:image-pullers" already exists
1 | 您可以忽略 `Error from server (AlreadyExists)` 消息。它们是由容器迁移工具包运算符为早期版本的 OpenShift Container Platform 4 创建资源造成的,这些资源在后续版本中提供。 |
创建 `MigrationController` 对象
$ oc create -f controller.yml
验证 MTC Pod 是否正在运行
$ oc get pods -n openshift-migration
对于 OpenShift Container Platform 4.1 和更早版本,您必须在安装容器迁移工具包运算符后在 `MigrationController` 自定义资源 (CR) 清单中配置代理,因为这些版本不支持集群范围的 `proxy` 对象。
对于 OpenShift Container Platform 4.2 到 4.17,MTC 继承集群范围的代理设置。如果要覆盖集群范围的代理设置,可以更改代理参数。
直接卷迁移 (DVM) 在 MTC 1.4.2 中引入。DVM 仅支持一个代理。如果目标集群也在代理之后,则源集群无法访问目标集群的路由。
如果要从代理后面的源集群执行 DVM,则必须配置一个在传输层工作的 TCP 代理,并透明地转发 SSL 连接,而无需使用自己的 SSL 证书对其进行解密和重新加密。Stunnel 代理就是这种代理的一个示例。
您可以通过 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 连接的代理后面。中间人模式下的 HTTP/HTTPS 代理不起作用。现有的集群范围代理可能不支持此行为。因此,DVM 的代理设置有意与 MTC 中的常规代理配置不同。
您可以通过在 OpenShift 路由上运行源集群和目标集群之间的 Rsync 来启用 DVM。流量使用 Stunnel(一个 TCP 代理)进行加密。在源集群上运行的 Stunnel 与目标 Stunnel 建立 TLS 连接,并通过加密通道传输数据。
OpenShift 中的集群范围 HTTP/HTTPS 代理通常在中间人模式下配置,在该模式下它们与外部服务器协商自己的 TLS 会话。但是,这与 Stunnel 不兼容。Stunnel 要求其 TLS 会话不受代理影响,本质上使代理成为一个透明的隧道,它只是按原样转发 TCP 连接。因此,您必须使用 TCP 代理。
迁移控制器使用SPDY协议在远程Pod中执行命令。如果远程集群位于不支持SPDY协议的代理或防火墙之后,则迁移控制器将无法执行远程命令。迁移将失败并显示错误消息Upgrade request required
。解决方法:使用支持SPDY协议的代理。
除了支持SPDY协议外,代理或防火墙还必须将Upgrade
HTTP标头传递到API服务器。客户端使用此标头与API服务器打开WebSocket连接。如果Upgrade
标头被代理或防火墙阻止,则迁移将失败并显示错误消息Upgrade request required
。解决方法:确保代理转发Upgrade
标头。
OpenShift支持使用NetworkPolicy或EgressFirewalls(基于集群使用的网络插件)来限制进出Pod的流量。如果参与迁移的任何源命名空间使用此类机制来限制Pod的网络流量,则这些限制可能会无意中阻止迁移期间到Rsync Pod的流量。
在源集群和目标集群上运行的Rsync Pod必须通过OpenShift路由相互连接。可以配置现有的NetworkPolicy或EgressNetworkPolicy对象,以自动将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
EgressNetworkPolicy
对象或Egress Firewalls是OpenShift构建,旨在阻止离开集群的出站流量。
与NetworkPolicy
对象不同,Egress Firewall 在项目级别工作,因为它适用于命名空间中的所有Pod。因此,Rsync Pod的唯一标签不会仅将Rsync Pod从限制中豁免。但是,您可以将源或目标集群的CIDR范围添加到策略的“允许”规则中,以便可以在两个集群之间建立直接连接。
根据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
默认情况下,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]
当您的PVC使用共享存储时,您可以通过向Rsync Pod定义中添加补充组来配置对该存储的访问,以便Pod允许访问。
变量 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
字符串 |
未设置 |
源Rsync Pod的补充组的逗号分隔列表 |
|
字符串 |
未设置 |
目标Rsync Pod的补充组的逗号分隔列表 |
可以更新MigrationController
CR 以设置这些补充组的值。
spec:
src_supplemental_groups: "1000,2000"
target_supplemental_groups: "2000,3000"
您必须以所有集群上的 `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)
1 | 用于直接卷迁移的Stunnel 代理 URL。 |
2 | 要排除代理的目的地域名、域名、IP 地址或其他网络 CIDR 的逗号分隔列表。 |
用.
作为域名前缀仅匹配子域名。例如,.y.com
匹配x.y.com
,但不匹配y.com
。使用*
绕过所有目的地的代理。如果您扩展了安装配置中未包含在networking.machineNetwork[].cidr
字段定义的网络中的工作程序,则必须将其添加到此列表中,以防止连接问题。
如果未设置httpProxy
或httpsProxy
字段,则忽略此字段。
将清单保存为migration-controller.yaml
。
应用更新后的清单
$ oc replace -f migration-controller.yaml -n openshift-migration
有关更多信息,请参阅配置集群范围的代理。
对于受限网络环境,唯一受支持的选项是多云对象网关 (Multicloud Object Gateway)。
MTC支持文件系统和快照数据复制方法,用于将数据从源集群迁移到目标集群。您可以选择适合您的环境并受您的存储提供商支持的方法。
尽管 MCG 运算符已弃用,但 MCG 插件仍然可用于 OpenShift Data Foundation。要下载插件,请浏览至下载 Red Hat OpenShift Data Foundation并下载适合您操作系统的 MCG 插件。 |
您必须使用相应的Red Hat OpenShift Data Foundation 部署指南部署 OpenShift Data Foundation。
断开连接的环境(在 Red Hat OpenShift Data Foundation 文档中)。
您可以卸载容器迁移工具包 (MTC) 并删除其资源以清理集群。
删除 |
您必须以具有cluster-admin
权限的用户身份登录。
删除所有集群上的MigrationController
自定义资源 (CR)
$ oc delete migrationcontroller <migration_controller>
使用 Operator Lifecycle Manager 在 OpenShift Container Platform 4 上卸载容器迁移工具包运算符。
通过运行以下命令删除所有集群上的集群范围资源
migration
自定义资源定义 (CRD)
$ oc delete $(oc get crds -o name | grep 'migration.openshift.io')
velero
CRD
$ oc delete $(oc get crds -o name | grep 'velero')
migration
集群角色
$ oc delete $(oc get clusterroles -o name | grep 'migration.openshift.io')
migration-operator
集群角色
$ oc delete clusterrole migration-operator
velero
集群角色
$ oc delete $(oc get clusterroles -o name | grep 'velero')
migration
集群角色绑定
$ oc delete $(oc get clusterrolebindings -o name | grep 'migration.openshift.io')
migration-operator
集群角色绑定
$ oc delete clusterrolebindings migration-operator
velero
集群角色绑定
$ oc delete $(oc get clusterrolebindings -o name | grep 'velero')