多集群管理
各种组织跨不同的云厂商或者在不同的基础设施上运行和管理多个 Kubernetes 集群的做法非常普遍。由于每个 Kubernetes 集群都是一个相对独立的单元,因此在多集群的场景下,需要多集群管理解决方案。
KubeSphere 的多集群管理为用户提供统一的控制平面,将应用程序及其副本分发到位于公有云或本地环境的多个集群。KubeSphere 还拥有跨多个集群的集中监控、日志系统、事件和审计日志等。
多集群架构
使用 KubeSphere 的中央控制平面管理多个集群之前,需要创建一个主集群。主集群是安装了 KubeSphere 设置角色为 Host 的集群,可以使用它提供的控制平面统一管理,只能有一个主集群存在。而多个成员集群可以同时存在,成员集群是安装了 KubeSphere 设置角色为 Member 的集群。主集群和成员集群之间的网络可以直接连接,或者通过代理连接。
启用多集群
设置主集群
可以在安装 KubeSphere 之前或者之后将一个集群指定为主集群
- 安装 KubeSphere 之前
# 设置安装配置文件 cluster-configuration.yaml 中的如下信息
multicluster:
clusterRole: host # 设置为主集群
- 安装 KubeSphere 之后
# 修改配置文件
kubectl edit cc ks-installer -n kubesphere-system
# 修改配置文件 cluster-configuration.yaml 中的如下信息
multicluster:
clusterRole: host # 设置为主集群
无论是安装前还是安装后,都可以通过下面的命令来检查,如果主集群准备就绪,将看到成功的日志返回。
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
设置成员集群
为了通过主集群管理,您需要使成员集群和主集群的 jwtSecret
相同,先在主集群节点通过下面的命令查询主集群的 jwtSecret
kubectl -n kubesphere-system get cm kubesphere-config -o yaml | grep -v "apiVersion" | grep jwtSecret
类似主集群,也可以在安装 KubeSphere 之前或者之后将一个集群指定为成员集群
- 安装 KubeSphere 之前
# 设置安装配置文件 cluster-configuration.yaml 中的如下信息
# 设置 jwtSecret,从主集群中查询得来
authentication:
jwtSecret: gfIwilcc0WjNGKJ5DLeksf2JKfcLgTZU
……
multicluster:
clusterRole: menber # 设置为成员集群
- 安装 KubeSphere 之后
# 修改配置文件
kubectl edit cc ks-installer -n kubesphere-system
# 修改配置文件 cluster-configuration.yaml 中的如下信息
## 设置 jwtSecret,从主集群中查询得来
authentication:
jwtSecret: gfIwilcc0WjNGKJ5DLeksf2JKfcLgTZU
……
multicluster:
clusterRole: menber # 设置为成员集群
无论是安装前还是安装后,都可以通过下面的命令来检查,如果成员集群准备就绪,将看到成功的日志返回。
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
导入成员集群
直接连接
当成员集群的 kube-apiserver 地址可以被主集群直接访问,或者与主集群在同一私有网络或子网中时,此方法适用
- 以
admin
身份登录主集群 KubeSphere 控制台,转到集群管理页面点击添加集群。 - 在导入集群页面,输入要导入的集群的基本信息。可以点击右上角的编辑模式以 YAML 格式查看并编辑基本信息。编辑完成后,点击下一步。
- 在连接方式,选择直接连接 Kubernetes 集群,复制成员集群 kubeconfig 内容并粘贴至文本框。
- 使用命令 cat $HOME/.kube/config 查看成员集群 kubeconfig 文件
- 确保主集群的任何节点都能访问成员集群 kubeconfig 中的
server
地址。
- 点击创建,然后等待集群初始化完成。
代理连接
当成员集群部署在私有环境下,kube-apiserver 地址无法被直接访问,但主集群可以暴露代理服务并由成员集群访问,适用此连接方法
- 设置代理服务地址
- 执行以下命令来检查服务。
kubectl -n kubesphere-system get svc
- 命令输出结果可能如下所示。在此示例中,可以看出
NodePort
为 30092
:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tower LoadBalancer 10.233.63.191 <pending> 8080:30092/TCP 16h
- 由于
EXTERNAL-IP
处于 pending
状态,需要手动设置代理地址。例如,如果公有 IP 地址为 139.198.120.120
,则需要将公网 IP 的端口,如30092
转发到 NodeIP
:NodePort
。由于我们的环境没有公网的 LoadBalancer,因此就默认把这个地址设置为 NodeIP
:NodePort
- 修改配置文件中代理地址(直接用
NodeIP
:NodePort
代替)
# 修改配置文件
kubectl edit cc ks-installer -n kubesphere-system
# 修改配置文件 cluster-configuration.yaml 中的如下信息
multicluster:
clusterRole: host
# 设置代理地址,本来应该是设置公网地址转发 现在直接设置 NodeIP:NodePort
proxyPublishAddress: http://172.172.30.131:30092
- 保存配置并稍等片刻,或者可以运行以下命令手动重启
ks-apiserver
使修改立即生效
kubectl -n kubesphere-system rollout restart deployment ks-apiserver
- 以
admin
身份登录 KubeSphere 控制台,转到集群管理页面点击添加集群。 - 在导入集群页面输入要导入的集群的基本信息。也可以点击右上角的编辑模式以 YAML 格式查看并编辑基本信息。编辑完成后,点击下一步。
- 在连接方式,选择集群连接代理,然后点击创建。主集群会为后面需要部署在成员集群上的代理组件生成相应Deployment 的 YAML 文件
- 根据上一步生成的文件内容,在成员集群中创建一个
agent.yaml
文件,然后将内容复制并粘贴到该文件中。在该节点上执行 kubectl create -f agent.yaml
然后等待代理启动并运行。确保成员集群可以访问代理地址。 - 待集群代理启动并运行,会看到成员集群已经导入主集群。
移除成员集群
- 点击左上角的平台管理,选择集群管理。
- 在成员集群区域,点击要从中央控制平面移除的集群右侧的三个点图标,点击解绑集群。
- 在弹出的移除集群对话框,请仔细阅读风险提示信息。如果您仍然想移除成员集群,输入集群名称,点击确定以移除成员集群。
启用多集群下创建项目和工作负载
创建项目
在启用多集群的情况下,当创建项目时,可以选择创建项目或多集群项目
- 项目
- 需要指定某个集群,只在该集群下创建项目,非多集群模式下相同管理
- 多集群项目
- 多集群项目只是逻辑上的项目,实际上是在多个集群下创建相同名称的 namespace,从主集群控制台可以进行统一管理
- Host 集群中
- Menber 集群中
创建工作负载
单集群项目下的负载创建没有变化,此处不再赘述,多集群项目下的负载创建如下:
- 需要指定副本在不同集群的分配情况,以副本数量或权重的方式分配
- 新增集群差异化设置,可以为不同集群上设置不同的容器设置、端口设置和环境变量设置
- 点击创建,会在不同集群下的同名 namespace 下分别创建副本
多集群项目配置管理
首先由企业空间目录进入项目,路径:http://hostIP:30880/workspaces/system-workspace/projects,查看多集群项目
在多集群项目下创建配置字典(configmap)
分别进入两个集群的终端中查看:
可以看到,在两个集群中,同名的 namespace,下都有刚刚创建的配置字典
在主集群控制台,编辑配置字典
编辑后分别在两个集群终端查看字典内容,可以看到两个集群中的配置同步更新。
创建多集群配置文件后,单独更新任何一个集群中的配置都是不生效的,因此此时的配置本质上是多集群配置资源 FederatedConfigmap 类型的资源管理的,规定了创建的 configmap 需要应用到哪几个集群中,以及配置的值
多集群管理注意事项
- 主集群和成员集群必须都安装 KubeSphere
- 主集群和成员集群必须完成时间同步,最好由同一 NTP 服务管理
- 主集群和成员集群必须设置正确的集群角色,并且在主集群和成员集群上的
jwtSecret
也相同。 - 建议成员集群在导入主集群之前是干净环境,即没有创建任何资源。
- 建议在主集群控制台创建资源,不建议登录成员集群控制台去创建资源,因为部分资源(例如:企业空间)将不会同步到主集群进行管理
- 不建议您将主集群转换为成员集群,或将成员集群转换成主集群,如果一个成员集群曾经被导入进主集群,将该成员集群从先前的主集群解绑后,再导入进新的主集群时必须使用相同的集群名称,否则会导致环境中资源错乱无法使用
- 只需在主集群上启用应用商店,就可以直接在成员集群上使用与应用商店相关的功能
- 对于除应用商店外的其他可插拔组件,当在主集群上启用时,仍然需要在成员集群上手动启用相同组件以实现相同的功能