Karmada(Kubernetes Armada)是一个华为开源的 Kubernetes 管理系统,基于 Kubernetes Federation v1 和 v2 开发,它可以跨多个 Kubernetes 集群和云运行云原生应用程序,而无需对应用程序进行更改。通过直接使用 Kubernetes 原生 API 并提供高级调度功能。Karmada通过PropagationPolicy,Binding与Work的抽象,可以将任意资源同步到匹配的cluster,并通过Policy进行差异化的配置,并进行重载,通过ReplicaSchedulingPolicy配置集群权重,配合hpa,使应用可以在多个集群间伸缩。
Karmada是怎么工作的
Karmada架构图
组件 | 原生 | 说明 |
---|---|---|
etcd | 是 | ETCD存储karmada API对象 |
kube-apiserver | 是 | API Server是所有其他组件都可以与之通信的REST端点 |
kube-controller-manager | 是 | Controller Manager将根据您通过API服务器创建的API对象执行操作 |
karmada-controller-manager | karmada | karmada controller-manager, 监听相关资源,创建ResourceBinding及ClusterResourceBinding,更新work,同步集群间资源 |
karmada-scheduler | karmada | 加载Policy,分析资源,更新work |
karmada-webhook | karmada | karmada资源校验 |
karmada-agent | karmada | 取决于Cluster的同步模式,若是push模式,则不需要部署,否则需要部署到管理的集群中 |
Karmada控制器管理器运行各种控制器,这些控制器监视karmada对象,然后与基础集群的API服务器对话以创建常规的Kubernetes资源。
(1)Cluster Controller:将Kubernetes集群附加到Karmada,以通过创建集群对象来管理集群的生命周期。
(2)Policy Controller:控制器监视PropagationPolicy对象。添加PropagationPolicy对象时,它将选择与resourceSelector匹配的一组资源,并为每个资源对象创建ResourceBinding。
(3)Binding Controller:控制器监视ResourceBinding对象,并使用单个资源清单创建与每个集群相对应的Work对象。
(4)Execution Controller:控制器监视工作对象,当创建工作对象时,它将资源分配给成员集群。
Karmada工作流
Resource template:Karmada使用Kubernetes自己的API定义的Resource template,以使其易于与Kubernetes上已采用的现有工具集成
Propagation Policy::Karmada提供了Propagation(placement) Policy API,以定义多集群调度和传播需求。
- 支持策略1:n映射:工作负载,用户无需在每次创建联合应用程序时都指出调度约束
- 使用默认策略,用户可以仅与K8s API进行交互
Override Policy:Karmada提供独立的Override Policy API,用于专门化与群集相关的配置自动化。例如:
- 根据成员群集区域覆盖镜像
- 根据云提供商覆盖StorageClass
启动流程
创建一个Deployment (kubectl)→ PropagationPolicy(kubectl) → ResourceBinding(controller) → Work(按照集群区分) → 同步资源
创建一个ClusterRole(kubectl) → ClusterPropagationPolicy(kubectl) → ClusterResourceBinding(controller) → Work(按照集群区分) → 同步资源
1、用户通过kukectl或者api 提交一个资源(cluster resource or namespace resource),此时,资源只存在于karmada的etcd中
2、用户通过kukectl或者api 创建PropagationPolicy(或ClusterPropagationPolicy),karmada-controller-manager会监听PropagationPolicy的创建事件,创建ResourceBinding(ClusterResourceBinding),然后创建work,
karmada-controller-manager会监听各个集群的资源,更新work及work status
3、karmada-scheduler监听资源、Policy、Binding、Work等信息,更新Work
karmada部署
安装karmadactl
部署控制端
git clone https://github.com/karmada-io/karmada.git
cd karmada
hack/local-up-karmada.s
该脚本hack/local-up-karmada.sh
将为您执行以下任务:
- 启动Kubernetes集群
karmada-host
以运行karmada控制平面 - 根据当前代码库构建karmada控制平面组件
- 在集群
karmada-host
上部署karmada控制平面组件,包含etcd、kube-apiserver、kube-controller-manager等k8s组件及自身组件karmada-controller-manager、karmada-scheduler、karmada-webhook
此脚本会在kind启动的Kubernetes集群中部署一整套karmada的依赖,包括etcd,apiserver,
这样,karmada就部署完成了
kubectl --kubeconfig ~/.kube/karmada.config config use-context karmada-host
cp ~/.kube/karmada.config ~/.kube/karmada-host.config
kubectl --kubeconfig ~/.kube/karmada.config config use-context karmada-apiserver
alias kmasterkubectl="kubectl --kubeconfig ~/.kube/karmada.config"
alias khostkubectl="kubectl --kubeconfig ~/.kube/karmada-host.config"
分别查看如下:
zxl@zxl:~$ khostkubectl get pod -A #kind 启动的k8s集群
NAMESPACE NAME READY STATUS RESTARTS AGE
karmada-system etcd-0 1/1 Running 0 18h
karmada-system