多集群管理最常见的使用场景包括服务流量负载均衡、隔离开发和生产环境、解耦数据处理和数据存储、跨云备份和灾难恢复、灵活分配计算资源、跨区域服务的低延迟访问以及避免厂商锁定等。
多集群管理方案常见的有Kubernetes 集群联邦(Kubernetes Cluster Federation),华为的karmada。这里介绍使用KubeSphere 联邦管理多集群。
集群的工作原理
参考官方文档:https://kubesphere.io/zh/docs/v3.3/multicluster-management/introduction/kubefed-in-kubesphere/
您需要创建一个主集群。主集群实际上是一个启用了多集群功能的 KubeSphere 集群,您可以使用它提供的控制平面统一管理。成员集群是没有中央控制平面的普通 KubeSphere 集群。也就是说,拥有必要权限的租户(通常是集群管理员)能够通过主集群访问控制平面,管理所有成员集群,例如查看和编辑成员集群上面的资源。反过来,如果您单独访问任意成员集群的 Web 控制台,您将无法查看其他集群的任何资源。
只能有一个主集群存在,而多个成员集群可以同时存在。在多集群架构中,主集群和成员集群之间的网络可以直接连接,或者通过代理连接。成员集群之间的网络可以设置在完全隔离的环境中。
启用多集群
环境
主机群:primary:172.16.255.180
成员集群1:member1:172.16.255.181
成员集群2:member2:172.16.255.182
部署集群略。
storageClass使用的是local-path。部署过程略。
集群间可以互相通信,所以选择直接连接。KubeSphere 的组件 Tower 用于代理连接。Tower 是一种通过代理在集群间建立网络连接的工具。如果主集群无法直接访问成员集群,您可以暴露主集群的代理服务地址,这样可以让成员集群通过代理连接到主集群。
部署kubesphere
主集群primary
wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/kubesphere-installer.yaml
sed -i 's/Always/IfNotPresent/g' kubesphere-installer.yaml
kubectl apply -f kubesphere-installer.yaml
wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/cluster-configuration.yaml
sed -i 's/storageClass: ""/storageClass: "fast"/g' cluster-configuration.yaml
# 设置为主机群
sed -i 's/clusterRole: none/clusterRole: host/g' cluster-configuration.yaml
# 设置主机群名称
sed -i '/clusterRole/a\ hostClusterName: primary' cluster-configuration.yaml
kubectl apply -f cluster-configuration.yaml
这里只启用了多集群和应用商店的组件,其他都是默认的。后面也可以再启动其他可插拔组件。
成员集群member
主机群部署好后,查看主机群的jwtSecret
,这个必须一致,主机群才能管理成员集群。
kubectl -n kubesphere-system get cm kubesphere-config -o yaml | grep -v "apiVersion" | grep jwtSecret
wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/kubesphere-installer.yaml
sed -i 's/Always/IfNotPresent/g' kubesphere-installer.yaml
kubectl apply -f kubesphere-installer.yaml
wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/cluster-configuration.yaml
sed -i 's/storageClass: ""/storageClass: "fast"/g' cluster-configuration.yaml
# 设置为成员集群
sed -i 's/clusterRole: none/clusterRole: member/g' cluster-configuration.yaml
# 设置主机群名称
sed -i 's/jwtSecret: ""/jwtSecret: "7PagYXfuwv2FmhIrgrFBjuIZTMblXHLc"/g' cluster-configuration.yaml
kubectl apply -f cluster-configuration.yaml
成员集群是没有Tower和kubefed-controller-manager组件的。
导入成员集群
以admin用户登录主机群,点击添加集群。
获取member集群的kubeconfig
cat $HOME/.kube/config
点击创建,集群加入成功。
查看集群
登录member集群的kubesphere,查看集群,可以看到只有自己的集群。
移除member集群
点击member集群右侧的三个点,点击移除集群。
集群被移除后,集群中原有的资源不会被自动清除。
集群被移除后,集群中原有的多集群配置数据不会被自动清除,卸载 KubeSphere 或删除关联资源时会导致用户数据丢失。
使用如下命令清理:
for ns in $(kubectl get ns --field-selector status.phase!=Terminating -o jsonpath='{.items[*].metadata.name}'); do kubectl label ns $ns kubesphere.io/workspace- && kubectl patch ns $ns --type merge -p '{"metadata":{"ownerReferences":[]}}'; done
也可以使用下面的命令移除不健康的集群:
kubectl delete cluster <cluster name>
集群可见性和授权
在 KubeSphere 中,您可以通过授权将一个集群分配给多个企业空间,让企业空间资源都可以在该集群上运行。同时,一个企业空间也可以关联多个集群。拥有必要权限的企业空间用户可以使用分配给该企业空间的集群来创建多集群项目。
添加用户
使用admin用户,添加企业空间
使用test用户登录,添加企业空间
提示未发现可用的集群,需要授权。
授权
点击一个集群,查看集群详细信息,选择集群设置,选择集群可见性,编辑可见性。
也可以选择公开集群,这样所有平台用户都可以访问该集群,并在该集群上创建和调度资源。
验证
使用test用户登录查看集群。
添加多集群项目
点击企业空间,选择项目,点击多集群项目选项卡,再点击创建。
在memberjiqu集群中查看nginx ns已创建。
创建nginx应用
点击nginx多集群项目,点击工作负载,创建。
可以选择部署的集群和副本数。
设置镜像。
不同集群可以设置不同的容器设置,端口设置和环境变量。
点击创建,查看nginx应用。