多集群管理

各种组织跨不同的云厂商或者在不同的基础设施上运行和管理多个 Kubernetes 集群的做法非常普遍。由于每个 Kubernetes 集群都是一个相对独立的单元,因此在多集群的场景下,需要多集群管理解决方案。

KubeSphere 的多集群管理为用户提供统一的控制平面,将应用程序及其副本分发到位于公有云或本地环境的多个集群。KubeSphere 还拥有跨多个集群的集中监控、日志系统、事件和审计日志等。

多集群架构

kubesphere集群搭建 kubesphere多集群管理_云原生

使用 KubeSphere 的中央控制平面管理多个集群之前,需要创建一个主集群。主集群是安装了 KubeSphere 设置角色为 Host 的集群,可以使用它提供的控制平面统一管理,只能有一个主集群存在。而多个成员集群可以同时存在,成员集群是安装了 KubeSphere 设置角色为 Member 的集群。主集群和成员集群之间的网络可以直接连接,或者通过代理连接。

启用多集群

设置主集群

可以在安装 KubeSphere 之前或者之后将一个集群指定为主集群

  1. 安装 KubeSphere 之前
# 设置安装配置文件 cluster-configuration.yaml 中的如下信息
multicluster:
  clusterRole: host     # 设置为主集群
  1. 安装 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 之前或者之后将一个集群指定为成员集群

  1. 安装 KubeSphere 之前
# 设置安装配置文件 cluster-configuration.yaml 中的如下信息
# 设置 jwtSecret,从主集群中查询得来
authentication:
  jwtSecret: gfIwilcc0WjNGKJ5DLeksf2JKfcLgTZU
……
multicluster:
  clusterRole: menber     # 设置为成员集群
  1. 安装 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 地址。

kubesphere集群搭建 kubesphere多集群管理_配置文件_02

  1. 点击创建,然后等待集群初始化完成。
代理连接

当成员集群部署在私有环境下,kube-apiserver 地址无法被直接访问,但主集群可以暴露代理服务并由成员集群访问,适用此连接方法

  1. 设置代理服务地址
  2. 执行以下命令来检查服务。
kubectl -n kubesphere-system get svc
  1. 命令输出结果可能如下所示。在此示例中,可以看出 NodePort30092
NAME       TYPE            CLUSTER-IP      EXTERNAL-IP     PORT(S)                   AGE
tower      LoadBalancer    10.233.63.191   <pending>       8080:30092/TCP            16h
  1. 由于 EXTERNAL-IP 处于 pending 状态,需要手动设置代理地址。例如,如果公有 IP 地址为 139.198.120.120,则需要将公网 IP 的端口,如30092 转发到 NodeIP:NodePort。由于我们的环境没有公网的 LoadBalancer,因此就默认把这个地址设置为 NodeIP:NodePort
  2. 修改配置文件中代理地址(直接用 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
  1. 保存配置并稍等片刻,或者可以运行以下命令手动重启 ks-apiserver 使修改立即生效
kubectl -n kubesphere-system rollout restart deployment ks-apiserver
  1. admin 身份登录 KubeSphere 控制台,转到集群管理页面点击添加集群。
  2. 在导入集群页面输入要导入的集群的基本信息。也可以点击右上角的编辑模式以 YAML 格式查看并编辑基本信息。编辑完成后,点击下一步。
  3. 在连接方式,选择集群连接代理,然后点击创建。主集群会为后面需要部署在成员集群上的代理组件生成相应Deployment 的 YAML 文件
  4. 根据上一步生成的文件内容,在成员集群中创建一个 agent.yaml 文件,然后将内容复制并粘贴到该文件中。在该节点上执行 kubectl create -f agent.yaml 然后等待代理启动并运行。确保成员集群可以访问代理地址。
  5. 待集群代理启动并运行,会看到成员集群已经导入主集群。

移除成员集群

  1. 点击左上角的平台管理,选择集群管理。
  2. 在成员集群区域,点击要从中央控制平面移除的集群右侧的三个点图标,点击解绑集群。
  3. 在弹出的移除集群对话框,请仔细阅读风险提示信息。如果您仍然想移除成员集群,输入集群名称,点击确定以移除成员集群。

启用多集群下创建项目和工作负载

创建项目

在启用多集群的情况下,当创建项目时,可以选择创建项目或多集群项目

kubesphere集群搭建 kubesphere多集群管理_集群管理_03

  1. 项目
  2.   需要指定某个集群,只在该集群下创建项目,非多集群模式下相同管理

  3. 多集群项目

kubesphere集群搭建 kubesphere多集群管理_kubesphere集群搭建_04

  1.   多集群项目只是逻辑上的项目,实际上是在多个集群下创建相同名称的 namespace,从主集群控制台可以进行统一管理

  2. Host 集群中


  3. Menber 集群中

创建工作负载

单集群项目下的负载创建没有变化,此处不再赘述,多集群项目下的负载创建如下:

  1. 需要指定副本在不同集群的分配情况,以副本数量或权重的方式分配
  2. 新增集群差异化设置,可以为不同集群上设置不同的容器设置、端口设置和环境变量设置
  3. 点击创建,会在不同集群下的同名 namespace 下分别创建副本

多集群项目配置管理

首先由企业空间目录进入项目,路径:http://hostIP:30880/workspaces/system-workspace/projects,查看多集群项目

kubesphere集群搭建 kubesphere多集群管理_集群管理_05

在多集群项目下创建配置字典(configmap)

kubesphere集群搭建 kubesphere多集群管理_集群管理_06

分别进入两个集群的终端中查看:

可以看到,在两个集群中,同名的 namespace,下都有刚刚创建的配置字典

kubesphere集群搭建 kubesphere多集群管理_配置文件_07

kubesphere集群搭建 kubesphere多集群管理_集群管理_08

在主集群控制台,编辑配置字典

kubesphere集群搭建 kubesphere多集群管理_云原生_09

编辑后分别在两个集群终端查看字典内容,可以看到两个集群中的配置同步更新。

kubesphere集群搭建 kubesphere多集群管理_kubesphere集群搭建_10

kubesphere集群搭建 kubesphere多集群管理_配置文件_11

创建多集群配置文件后,单独更新任何一个集群中的配置都是不生效的,因此此时的配置本质上是多集群配置资源 FederatedConfigmap 类型的资源管理的,规定了创建的 configmap 需要应用到哪几个集群中,以及配置的值

kubesphere集群搭建 kubesphere多集群管理_kubesphere集群搭建_12

多集群管理注意事项

  • 主集群和成员集群必须都安装 KubeSphere
  • 主集群和成员集群必须完成时间同步,最好由同一 NTP 服务管理
  • 主集群和成员集群必须设置正确的集群角色,并且在主集群和成员集群上的 jwtSecret 也相同。
  • 建议成员集群在导入主集群之前是干净环境,即没有创建任何资源。
  • 建议在主集群控制台创建资源,不建议登录成员集群控制台去创建资源,因为部分资源(例如:企业空间)将不会同步到主集群进行管理
  • 不建议您将主集群转换为成员集群,或将成员集群转换成主集群,如果一个成员集群曾经被导入进主集群,将该成员集群从先前的主集群解绑后,再导入进新的主集群时必须使用相同的集群名称,否则会导致环境中资源错乱无法使用
  • 只需在主集群上启用应用商店,就可以直接在成员集群上使用与应用商店相关的功能
  • 对于除应用商店外的其他可插拔组件,当在主集群上启用时,仍然需要在成员集群上手动启用相同组件以实现相同的功能