将一个已有的集群A(host集群或者是单集群)作为 member 集群纳管到一个新的 host 集群B下,需要保留原集群A中的 账户、企业空间、权限控制数据,具体操作如下:

1. 创建好新的 host 集群B

https://kubesphere.com.cn/docs/multicluster-management/enable-multicluster/agent-connection/#%E5%87%86%E5%A4%87-host-%E9%9B%86%E7%BE%A4

2. 导出集群A中的数据

导出集群A中的账户数据

kubectl get users -o yaml > users.yaml

按需导出集群A中的企业空间

kubectl get workspacetemplates > workspacetemplates.yaml

导出集群A中的权限控制控制数据

kubectl get globalroles -o yaml > globalroles.yaml
kubectl get globalrolebindings -o yaml > globalrolebindings.yaml
# 以下资源可选择性导出
# 导出指定 workspace 下的权限控制数据 kubectl get workspaceroles -l kubesphere.io/workspace=<workspace>
kubectl get workspaceroles -o yaml > workspaceroles.yaml
kubectl get workspacerolebindings -o yaml > workspacerolebindings.yaml

3. 将集群A纳管至集群B

将集群A中的 namespace 与 workspace 解绑

kubectl label ns <namespace> kubesphere.io/workspace- && kubectl patch ns <namespace>   -p '{"metadata":{"ownerReferences":[]}}' --type=merge

删除集群A中的 workspace

风险提示:执行此步骤之前必须将 namespace 与 workspace 进行解绑,否则删除 workspace 时会关联删除掉未解绑的 namespace

kubectl delete workspacetemplate --all

将集群A纳管至集群B

https://kubesphere.com.cn/docs/multicluster-management/enable-multicluster/agent-connection/#%E5%87%86%E5%A4%87-member-%E9%9B%86%E7%BE%A4

4. 向集群B导入数据

复制A集群中导出的数据文件到B集群中

导入账户数据

kubectl apply -f users.yaml

按需导入集群企业空间

kubectl apply -f workspacetemplates.yaml

根据实际情况设置集群可见性

https://kubesphere.com.cn/docs/cluster-administration/cluster-settings/cluster-visibility-and-authorization/

风险提示: 不可随意取消某个集群的授权,请注意相关风险。

通过 host 管理界面将集群A中的项目分配到企业空间中

https://kubesphere.com.cn/docs/faq/access-control/add-kubernetes-namespace-to-kubesphere-workspace/

导入权限控制控制数据

kubectl apply -f globalroles.yaml
kubectl apply -f globalrolebindings.yaml
# 以下资源可选择性导入
kubectl apply -f workspaceroles.yaml
kubectl apply -f workspacerolebindings.yaml

@Felixliu 可以考虑把这个教程放到多集群对应的文档中。

1 年 后

如果情况是将一个member集群迁移到一个新的host集群中,需要先将这个member集群从旧的host集群中解绑,再绑定新的host集群。

这样避免一些冲突,例如两个host集群同时会修改workspace的label。

另外导出时建议去掉"ownerReferences",“creationTimestamp”, “resourceVersion”, “uid”, “selfLink”,否则导入会有可能出现error。

kubectl get <resources> -ojson |jq 'del(.items[].metadata["ownerReferences","creationTimestamp", "resourceVersion", "uid", "selfLink"])'|jq 'del(.items[].metadata.annotations."kubectl.kubernetes.io/last-applied-configuration")'|jq 'del(.items[].status)' > <resources>.json