Karmada 是一个 Kubernetes 管理系统,使您能够在多个 Kubernetes 集群和云中运行云原生应用程序,而无需更改应用程序。通过使用 Kubernetes 原生 API 并提供先进的调度功能,Karmada 实现了真正的开放式、多云 Kubernetes。

Karmada 名称的由来
Karmada 是由“Kubernetes”和“Armada”组合而来的。Armada 这个词在英语中意味着“舰队”,通常指的是由许多船只组成的大型水面作战力量。在这里,它象征着多个集群的集合,每个集群如同一个强大的船只,共同组成了一个强大的“舰队”(正如 Karmada 的图标是一个舰队一样),协同工作,提高效率和资源利用率。

关于 Karmada 的更多内容,请访问 Karmada 文档

Karmada 组件概述

下图展示的是 Karmada 中的各个组件及其关系。

image
Karmada 中的各个组件及其关系

以下是 Karmada 的主要组件概述以及每个组件的功能说明:

  • karmada-apiserver:扩展了 Kubernetes API 的 Karmada API 服务器,作为 Karmada 控制平面的前端,使 Karmada 能够简单集成 Kubernetes 生态系统,并允许使用kubectl操作 Karmada。

  • karmada-aggregated-apiserver:利用 Kubernetes API 聚合层技术的聚合 API 服务器,提供集群 API 和相关子资源,支持通过 karmada-apiserver 访问成员集群。

  • kube-controller-manager:包含多个控制器的 kube-controller-manager,Karmada 继承了一些来自 Kubernetes 的控制器,以保持用户体验和行为的一致性。

  • karmada-controller-manager:运行多个自定义控制器进程的管理器,这些控制器监视 Karmada 对象并与下层集群的 API 服务器交互,创建常规的 Kubernetes 资源。

  • karmada-scheduler:负责将 k8s 原生 API 资源对象(包括 CRD 资源)调度到成员集群,根据约束和可用资源确定有效的集群放置。

  • karmada-webhook:是 HTTP 回调,处理 Karmada/Kubernetes API 请求的 webhook,可以定义为验证 webhook 和突变 webhook,用于执行自定义策略和修改对象。

  • etcd:作为 Karmada/Kubernetes API 对象的后端存储,提供一致且高可用的键值存储。

  • karmada-agent:在 Pull 模式下部署在每个成员集群上的代理,负责将特定集群注册到 Karmada 控制平面并同步清单和状态。

  • karmada-scheduler-estimator:运行一个精确的集群调度估算器,为调度器提供更精确的集群资源信息。

  • karmada-descheduler:定期检测所有副本,并根据成员集群中实例状态的变化触发重新调度。

  • karmada-search:启动一个聚合服务器,提供全局搜索和多云环境中的资源代理等功能。

  • karmadactl:Karmada 提供的命令行工具,用于与 Karmada 控制平面通信,执行诸如集群加入/退出等操作。

  • kubectl karmada:以 kubectl 插件的形式提供功能,其实现与karmadactl完全相同。

集群注册概述

Karmada 允许用户将多个集群注册到 Karmada 控制平面,以便进行统一管理和调度。集群注册的过程涉及到在 Karmada 控制平面和目标集群之间建立连接。

Karmada 的集群注册,包括了Push模式和Pull模式:

  • Push 模式:Karmada 控制平面直接访问成员集群的kube-apiserver以获取集群状态和部署清单。
  • Pull 模式:控制平面不直接访问成员集群,而是通过一个叫做karmada-agent的额外组件来委派任务。

注册集群 - Push 模式

  • 使用kubectl-karmada命令行工具通过join命令注册集群,通过unjoin命令取消注册。
  • 注册和取消注册时,需要指定 Karmada 的kubeconfig文件和成员集群的kubeconfig
  • 可以通过--cluster-context标志自定义集群上下文。

注册集群 - Pull 模式

  • 使用karmadactl register命令以 Pull 模式注册成员集群。
  • 注册过程中需要在 Karmada 控制平面创建引导令牌,并在成员集群执行注册命令。
  • 成员集群注册后,karmada-agent将在其启动阶段自动完成集群的注册。

集群标识符

  • 每个在 Karmada 注册的集群都会被表示为一个Cluster对象,对象的名称 (.metadata.name) 是注册时使用的名称。
  • 在注册过程中,每个集群都会被分配一个.spec.id中的独特标识符,这主要用于技术上区分每个集群,防止同一个集群被多次以不同的名称注册。