Karmada v1.6 发布!跨集群弹性伸缩
作者:华为云云原生团队
Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。
在最新发布的v1.6版本中,Karmada新增了应用跨集群弹性伸缩的能力,将单集群HPA的能力扩展到多集群,从此应用不仅能够跨集群部署以提高可用性,还可以根据业务流量在多个集群中同时实现动态伸缩。
本版本其他新增特性:
-
在集群(级)故障迁移基础上,新增了应用(级)故障迁移能力,用户可以为每个应用配置故障探测逻辑以及迁移策略,应用故障后可以被迁移到其他集群。 -
定义了云提供商需要实现的多集群 Ingress
共享接口,通过实现接口,控制器可以以可插拔的方式与任意云提供商的进行集成,使 Karmada 能够使用并管理云上的LoadBalancer
服务。 -
提供了 Karmada Operator
来管理Karmada的安装部署、升级和卸载。相较于已有的CLI和Helm chart安装部署方式,Karmada Operator
通过声明式API语义来提供Karmada全生命周期管理和运维。 -
进一步增强了CRD资源的支持,Karmada资源解释器中内置了知名项目(包括 Argo Workflow、Flux CD、Kyverno、OpenKruise)的CRD解析逻辑,从此用户在Karmada中使用这些项目时可以免去或减轻配置负担。 -
提供 Karmada 在线演示平台,可让用户在云上快速体验核心功能。
新特性概览
FederatedHPA
FederatedHPA
, 解决如下场景难题:
无法统筹多个集群的资源,跨集群弹性伸缩业务;
多个子集群HPA分散管理,冗余且复杂度较高,无法统一高效配置和管理;
如单集群扩容发生故障,无法在其他集群扩容实例,存在断服风险;
无法统一限制多个集群资源使用量,以限制某业务的资源消耗和费用消耗。
FederatedHPA
工作原理和单集群的HPA相似,Karmada 通过聚合多个子集群的监控指标来决策副本的伸缩,PropagationPolicy
或 ClusterPropagationPolicy
中的调度策略,伸缩的副本能够应用到多个集群中。
Karmada FederatedHPA API 语义与单集群HPA非常类似。以下是根据CPU使用率弹性伸缩Deployment
的示例:
apiVersion: autoscaling.karmada.io/v1alpha1
kind: FederatedHPA
metadata:
name: nginx-fhpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 40
---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: nginx-propagation
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx
placement:
clusterAffinity:
clusterNames:
- member1
- member2
replicaScheduling:
replicaDivisionPreference: Weighted
replicaSchedulingType: Divided
weightPreference:
dynamicWeight: AvailableReplicas
上面的示例配置期望跨集群业务的平均CPU负载维持在40%,如果CPU负载为超过40%,扩容的实例数将按 member1
,member2
集群中 的可用资源拆分调度,实现跨集群扩容。
关于 FederatedHPA
的更多信息,请参考:https://karmada.io/docs/next/userguide/autoscaling/federatedhpa
应用的故障迁移
在多云架构的众多优势中,故障迁移无疑是其中重要的一环,当一家云供应商出现故障时,企业希望能使用另一家云供应商承接服务,实现服务的平稳不中断。尤其是对于无状态的计算任务而言,多云间的故障迁移有着广阔的应用场景。
Karmada关注应用在多集群的高可用部署,积极探索多云环境下的故障迁移,并从集群和应用两个视角来思考这一问题。从集群的视角出发,控制面的故障往往会引发以集群为维度的故障域的不可用,在Karmada中,当集群发生故障或是用户不希望在某个集群上继续运行工作负载时,集群状态将被标记为不可用,并被添加上相应地污点。Taint-manager
检测到集群故障后,会从这些故障集群中驱逐工作负载,被驱逐的工作负载将被调度至其他适合的集群,从而达成故障迁移的目的。
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: nginx-propagation
spec:
failover:
application:
decisionConditions:
tolerationSeconds: 120
purgeMode: Never
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx
placement:
clusterAffinity:
clusterNames:
- member1
- member2
- member3
spreadConstraints:
- maxGroups: 1
minGroups: 1
spreadByField: cluster
上面的例子配置期望在备选的集群范围中选择一个最优集群,如果应用处于不健康的状态持续120s后,Karmada会自动将该应用迁移至另一个可选的集群中。
关于应用的故障迁移的更多信息,请参考:
https://karmada.io/docs/next/userguide/failover/application-failover
MCI Provider
为了实现多集群的统一流量入口,我们在 MulitClusterIngress API
的基础上,提供了 MultiClusterIngress
对象的共享接口。用户可以通过实现这些接口,将 MultiClusterIngress
后端 Service
的 Pod
地址注册到云提供商的 LoadBalancer
服务上。此外,用户还可以在 MultiClusterIngress
对象上定义各种策略,如蓝绿发布、金丝雀发布等。
让我们以用户的角度来看待这个处理流程:
首先,运维人员在 Karmada 控制面上部署了一组应用,其中包括两个不同版本的 Service
(v1 和 v2),并创建了分发策略,将这些应用分发到成员集群 A 和 B 中。
接下来,运维人员在 Karmada 控制面上创建了 MultiClusterIngress
资源,并将这两个版本的 Service
设置为其后端multicluster-cloud-provider-xxx
是某一云提供商在引入 multicluster-cloud-provider
仓库后的具体实现,它会监听 MultiClusterIngress
资源的创建或更新,并将其后端服务的 IP 地址注册到 LoadBalancer
实例中。
最后,当一切就绪后,用户可以通过不同的域名访问 LoadBalancer
,将请求转发到不同版本的 Pod
中。用户可以在 MultiClusterIngress
上设置不同的策略,以实现多种七层访问策略。
Karmada Operator
Helm charts
或者YAML等方式安装karmada-operator
组件,并提交Karmada CR
来安装一个Karmada实例。下面给出了一个在test
命名空间下安装Karmada的例子,配置采用默认值。
kubectl get po -n test
karmada-demo-aggregated-apiserver-587bc5c697-v27vb 1/1 Running 0 12s
karmada-demo-apiserver-55968d9f8c-mp8hf 1/1 Running 0 35s
karmada-demo-controller-manager-64455f7fd4-stls6 1/1 Running 0 5s
karmada-demo-etcd-0 1/1 Running 0 37s
karmada-demo-kube-controller-manager-584f978bbd-fftwq 1/1 Running 0 5s
karmada-demo-scheduler-6d77b7547-hgz8n 1/1 Running 0 5s
karmada-demo-webhook-6f5944f5d8-bpkqz 1/1 Running 0 5s
关于karmada-operator的更多信息请参考:https://github.com/karmada-io/karmada/blob/master/operator/README.md
内置支持知名项目CRD资源
Karmada对CRD提供了深度支持的能力,通过资源解释器框架,Karmada允许用户自定义任意资源的解析逻辑,在之前的版本中,资源解释器框架内置了Kubernetes常用资源的解释逻辑,本版本中资源解释器构建了内置第三方开源项目CRD
的能力,并内置了Argo Workflow、Flux CD
、Kyverno
、OpenKruise
项目的多个CRD
,从此用户在Karmada中使用这些项目时可以免去或减轻配置负担。
Karmada在线演示平台
为了帮助用户更快的体验 Karmada,在 1.6 版本周期内,我们借助 killercoda,在线上提供了4个核心场景供用户快速体验,包括:
-
利用 CLI,在 K8s 集群中安装 Karmada,并加入子集群实现统一管理。 -
利用复制策略分发工作负载,实现业务高可用跨集群部署。 -
利用拆分策略分发工作负载,实现业务高可用跨集群部署。 -
模拟集群故障,体验优雅迁移,保障业务连续性。
体验链接请查看:https://killercoda.com/karmada
版本升级
Karmada v1.6 版本 API兼容v1.5版本 API,v1.5版本的用户仍然可以平滑升级到v1.6版本。可参考升级文档:https://karmada.io/docs/next/administrator/upgrading/v1.5-v1.6
致谢贡献者
Karmada v1.6 版本包含了来自42位贡献者的数百次代码提交,在此对各位贡献者表示由衷的感谢:
贡献者GitHub ID:
- @7sunarni @liangyuanpeng@sunbinnnnn @a7i@lifeiguanchen @tedli @bhavyastar@lixingchenDaoCloud@Vacant2333
- @callmeoldprince@lonelyCZ@WenchuanZhao@calvin0327 @LronDC @whitewindmills @chaunceyjiang@lxtywypc@WulixuanS
- @duanmengkk@mkloveyy@wzshiming @fredgate@my-git9 @xigang @HassanTanveer@neteric @XiShanYongYe-Chang
- @helen-frank @Nikko-Adrian-Pacleb@yanfeng1992 @ibalajiarun@niuyueyang1996@yanggangtony@ikaven1024@Poor12
- @yike21@jwcesign@RainbowMango@zach593@learner0810@realnumber666@zishen
参考链接
Release Notes:https://github.com/karmada-io/karmada/releases/tag/v1.6.0
FederatedHPA使用文档:https://karmada.io/docs/next/userguide/autoscaling/federatedhpa
FederatedHPA设计文档:https://github.com/karmada-io/karmada/blob/master/docs/proposals/hpa/federatedhpa-v2.md
应用的故障迁移:https://karmada.io/docs/next/userguide/failover/application-failover
Karmada Operator:https://github.com/karmada-io/karmada/blob/master/operator/README.md
Karmada 1.6升级文档:https://karmada.io/docs/next/administrator/upgrading/v1.5-v1.6
附:Karmada社区技术交流地址
- 点赞
- 收藏
- 关注作者
评论(0)