草庐IT

Karmada v1.3:更优雅 更精准 更高效

华为云开发者社区 2023-03-28 原文
摘要:最新发布的1.3版本中,Karmada重新设计了应用跨集群故障迁移功能,实现了基于污点的故障驱逐机制,并提供平滑的故障迁移过程,可以有效保障服务迁移过程的连续性(不断服)。

本文分享自华为云社区《Karmada v1.3:更优雅 更精准 更高效》,作者:云容器大未来。

Karmada是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容Kubernetes原生API的能力,Karmada可以平滑迁移单集群工作负载,并且仍可保持与Kubernetes周边生态工具链协同。

在最新发布的1.3版本中,Karmada重新设计了应用跨集群故障迁移功能,实现了基于污点的故障驱逐机制,并提供平滑的故障迁移过程,可以有效保障服务迁移过程的连续性(不断服)。

本版本新增加的特性:

  • 增加了面向多集群的资源代理新特性,通过该代理平台业务方可以在不感知多集群的情况下,以单集群访问姿势直接操纵部署在多集群的工作负载;
  • 提供针对集群资源建模能力,通过自定义的集群资源模型,调度器可以更精准地进行资源调度;
  • 提供基于Bootstrap令牌来注册Pull模式集群的能力,不仅可以简化集群注册过程,还可以方便地进行权限控制;

此外,基于生产环境的用户反馈,本版本还进行了诸多性能优化,系统运行过程中CPU和内存资源需求大大降低,详细的性能测试报告稍后发布。

与之前版本一样,v1.3与前面的版本仍然保持兼容,前面版本的用户仍可以平滑升级。

新特性概览

基于污点的优雅驱逐

当集群被判定为故障,并且故障时间超过宽限期(默认5分钟)之后,Karmada将为故障集群添加“NoExecute”污点,随后新引入的taint-manager控制器将开始驱逐该故障集群上的工作负载,接着调度器重新调度被驱逐的工作负载至新的可用集群,如果用户开启了GracefulEviction特性,被驱逐的工作负载并不会被立即删除,而是延迟到新的工作负载运行之后,可以保障驱逐过程中业务不中断。

整体故障迁移过程可以表示成:”集群故障判定” → “负载预驱逐” → “重新调度” → “清理冗余负载”。

此处,无论故障判定还是驱逐,用户都可以参过参数来控制:

  • --failover-eviction-timeout,指定从调度结果中删除故障集群的宽限期,默认5分钟
  • --default-not-ready-toleration-seconds,指定默认情况下添加到尚未具有notReady:NoExecute容忍的传播策略上的容忍时间,默认600秒
  • --default-unreachable-toleration-seconds,指定默认情况下添加到尚未具有unreachable:NoExecute容忍的传播策略上的容忍时间,默认600秒
  • --graceful-eviction-timeout,指定自工作负载已移动到优雅驱逐任务以来,等待优雅驱逐控制器执行最终删除的超时时间,默认时长10分钟

跨多群集资源的全局代理

Karmada在1.2版本中新增了一个“karmada-search”组件,该组件为选装组件,用于缓存集群中部署的资源对象和事件,并通过搜索API对外提供检索服务。

1.3版本中,我们在该组件中引入了一个新的代理功能,允许用户以访问单集群的方式访问多集群中的资源,无论资源是否由Karmada管理,利用代理功能,用户可以统一通过Karmada控制面来操作成员集群中的资源。

用户可以使用ResourceRegistry API来指定缓存的资源类型以及数据源(目标集群),例如以下配置表示从member1 和member2两个集群中缓存Pod与Node资源:

apiVersion: search.karmada.io/v1alpha1
kind: ResourceRegistry
metadata:
     name: proxy-sample
     spec:
         targetCluster:
        clusterNames:
        - member1
        - member2
        resourceSelectors:
        - apiVersion: v1
         kind: Pod
        - apiVersion: v1
         kind: Node

将该配置提交给karmada-apiserver之后,便可使用URL:/apis/search.karmada.io/v1alpha1/proxying/karmada/proxy/api/v1/namespaces/default/pods来进行集群资源访问。该URL中/apis/search.karmada.io/v1alpha1/proxying/karmada/proxy为固定前缀,后面部分与Kubernetes原生API路径完全一致。

关于该特性的更多信息可以参考:https://karmada.io/docs/userguide/globalview/proxy-global-resource/

基于自定义集群资源模型的调度

在集群调度的过程中,karmada-scheduler会基于一系列的因素来做调度决策,其中一个不可或缺的因素就是集群的可用资源。之前的版本中,Karmada采用了一种通用的资源模型ResourceSummary来抽象集群的可用情况,如下所示:

resourceSummary:
   allocatable:
      cpu: "1024"
      memory: 4096Mi
      pods: "110"
   allocated:
      cpu: "512"
      memory: 2048Mi
      pods: "64"

但是ResourceSummary机械地累加了集群中所有节点的资源,忽视了节点上的碎片资源,这会导致资源需求较大的Pod无法准确地调度到合适的集群。同时它也忽视了不同用户的集群中节点可分配的资源不完全相同的特点。

1.3版本中Karmada引入了一种新的方式——自定义集群资源模型,来抽象集群的可用资源情况,旨在使调度器调度集群的结果更精确。用户可以启用--CustomizedClusterResourceModeling的特性开关来启用这一特性,开启后,在集群被Karmada所纳管后,Karmada会自动地为集群设置默认的资源模型,这一资源模型将集群中的各个节点分为不同等级的模型,默认的资源模型将根据CPU和内存这两项资源指标把节点分为9个不同的等级,如下所示:

resourceModels:
- grade: 0
ranges:
- max: "1"
min: "0"
name: cpu
- max: 4Gi
min: "0"
name: memory
- grade: 1
ranges:
- max: "2"
min: "1"
name: cpu
- max: 16Gi
min: 4Gi
name: memory
.....
- grade: 8
ranges:
- max: "9223372036854775807"
min: "128"
name: cpu
- max: "9223372036854775807"
min: 1Ti
name: memory

Cluster-status-controller将会收集集群内的节点、Pod信息计算对应模型节点的数量,与此同时,karmada-scheduler根据将要调度的实例资源请求比较不同集群中满足要求的节点数,并将实例调度到满足要求的节点更多的集群。

同时,在一些场景下,默认的集群资源模型不能满足用户特定集群的需求,现在用户可以通过kubectl edit cluster命令自定义地设置集群的资源模型,使资源模型能够更好地拟合集群的资源拓扑。

基于Bootstrap令牌的集群注册

1.3版本中,对于 Pull 模式下的集群,我们提供了一种通过命令行向 Karmada 控制面注册的方式。现在通过karmadactl token命令我们可以轻松的创建Bootstrap启动令牌的token,token的默认有效时长是24小时。

$ karmadactl token create --print-register-command --kubeconfig /etc/karmada/karmada-apiserver.config

 

# The example output is shown below
karmadactl register 10.10.x.x:32443 --token t2jgtm.9nybj0526mjw1jbf --discovery-token-ca-cert-hash sha256:f5a5a43869bb44577dba582e794c3e3750f2050d62f1b1dc80fd3d6a371b6ed4

通过karmadactl register命令可以在不复制成员集群kubeconfig的情况下非常轻松地完成包括部署karmada-agent在内的注册过程,增强了控制面以Pull模式纳管成员集群的易用性和安全性。

$ karmadactl register 10.10.x.x:32443 --token t2jgtm.9nybj0526mjw1jbf --discovery-token-ca-cert-hash sha256:f5a5a43869bb44577dba582e794c3e3750f2050d62f1b1dc80fd3d6a371b6ed4

# The example output is shown below
[preflight] Running pre-flight checks
[prefligt] All pre-flight checks were passed
[karmada-agent-start] Waiting to perform the TLS Bootstrap
[karmada-agent-start] Waiting to construct karmada-agent kubeconfig
[karmada-agent-start] Waiting the necessary secret and RBAC
[karmada-agent-start] Waiting karmada-agent Deployment
W0825 11:03:12.167027 29336 check.go:52] pod: karmada-agent-5d659b4746-wn754 not ready. status: ContainerCreating
......
I0825 11:04:06.174110 29336 check.go:49] pod: karmada-agent-5d659b4746-wn754 is ready. status: Running

cluster(member3) is joined successfully

版本升级

我们验证了从karmada 1.2版本到1.3版本的升级路径,升级过程平滑,可参考升级文档:https://karmada.io/docs/administrator/upgrading/v1.2-v1.3

致谢贡献者

Karmada v1.3版本包含了来自51位贡献者的数百次代码提交,在此对各位贡献者表示由衷的感谢:

贡献者GitHub ID:

@AllenZMC

@calvin0327

@carlory

@CharlesQQ

@Charlie17Li

@chaunceyjiang

@cutezhangq

@dapengJacky

@dddddai

@duanmengkk

@Fish-pro

@Garrybest

@gy95

@halfrost

@hanweisen

@huntsman-li

@ikaven1024

@joengjyu

@JoshuaAndrew

@kerthcet

@kevin-wangzefeng

@kinzhi

@likakuli

@lonelyCZ

@luoMonkeyKing

@maoyangLiu

@mathlsj

@mikeshng

@Momeaking

@mrlihanbo

@my-git9

@nuclearwu

@Poor12

@prodanlabs

@RainbowMango

@suwliang3

@TheStylite

@wawa0210

@weilaaa

@windsonsea

@wlp1153468871

@wuyingjun-lucky

@XiShanYongYe-Chang

@xuqianjins

@xyz2277

@yusank

@yy158775

@zgfh

@zhixian82

@zhuwint

@zirain

参考链接

● Release Notes:https://github.com/karmada-io/karmada/releases/tag/v1.3.0

● 集群故障迁移使用指导:https://karmada.io/docs/userguide/failover/#concept

● 多集群资源全局代理使用指导:https://karmada.io/docs/userguide/globalview/proxy-global-resource/

● 集群资源模型使用指导:https://karmada.io/docs/userguide/scheduling/cluster-resources

● 基于Bootstrap令牌的集群注册使用指导:https://karmada.io/docs/userguide/clustermanager/cluster-registration

添加小助手微信k8s2222,进入Karmada社区交流群

 

点击关注,第一时间了解华为云新鲜技术~

有关Karmada v1.3:更优雅 更精准 更高效的更多相关文章

  1. ruby-on-rails - Rails 优雅地处理超时 session ? - 2

    使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p

  2. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

    假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)

  3. ruby-on-rails - 优雅的 Rails : multiple routes, 相同的 Controller Action - 2

    让多条路线去同一条路的最优雅的方式是什么ControllerAction?我有:get'dashboard',to:'dashboard#index'get'dashboard/pending',to:'dashboard#index'get'dashboard/live',to:'dashboard#index'get'dashboard/sold',to:'dashboard#index'这很丑陋。有什么“更优雅”的建议吗?一个类轮的奖励积分。 最佳答案 为什么不只有一个路由和一个Controller操作,并根据传递给它的参数来

  4. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  5. ruby-on-rails - 在 Rails 中更高效地查找或创建多条记录 - 2

    我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr

  6. ruby - 优雅的链式 'or' 用于测试 Ruby 中的相同变量 - 2

    怎样说才是明智的呢?if@thing=="01"or"02"or"03"or"04"or"05"(数字包含在数据类型字符串的列中。) 最佳答案 制作数组并使用.include?if["01","02","03","04","05"].include?(@thing)如果值真的都是连续的,你可以使用像(1..5).include?这样的范围对于字符串,你可以使用:if("01".."05").include?(@thing) 关于ruby-优雅的链式'or'用于测试Ruby中的相同变量,我

  7. ruby - Ruby 中优雅的循环 Elsing - 2

    我必须编写一个Ruby方法:遍历数组,如果其中一个元素符合特定条件则执行Foo。如果没有数组元素符合条件,则执行Bar操作。在任何其他语言中,我会在进入循环之前设置一个bool变量,并在执行Foo时切换它。该变量的值会告诉我是否需要Bar。但这感觉不像Rubyish那样不优雅。谁能提出更好的方法?编辑一些非常好的答案,但由于我本应提及的细节,它们不太有效。Foo所做的事情是对符合条件的数组元素完成的。此外,保证最多有一个元素匹配条件。 最佳答案 是否有任何项目匹配?如果是,则做一些不涉及匹配项目的事情。ifitems.any?{|i

  8. ruby - 在 ruby​​ 中对范围进行排序的最优雅的方法是什么 - 2

    我需要根据起点对Range类型的对象表进行排序。为此,我有以下代码可以正常工作:ranges=@ranges.sortdo|a,b|(a.min)(b.min)end我只是想知道是否有更短、更优雅的方法来做同样的事情。 最佳答案 怎么样:ranges=@ranges.sort_by(&:min)或者如果您实际上指的是起点而不是最小值,因为可能存在诸如(5..3)的范围:ranges=@ranges.sort_by(&:first) 关于ruby-在ruby​​中对范围进行排序的最优雅的方

  9. ruby-on-rails - 优雅地处理嵌套哈希中的空白值 - 2

    这个问题在这里已经有了答案:HowtoavoidNoMethodErrorformissingelementsinnestedhashes,withoutrepeatednilchecks?(16个答案)关闭7年前。我确定我以前见过一个优雅的解决方案,但我找不到它:我有一个RailsController,它可能有也可能没有以下哈希元素:myhash[:parent_field]在该父字段中,子元素也可以为空。我目前正在通过(非常丑陋的)方法检查:if(!myhash[:parent_field]||!myhash[:parent_field][:child_field]||myhash

  10. Ruby:Ruby 中优雅的数组初始化和返回 - 2

    我有一个方法:defdeltas_to_board_locations(deltas,x,y)board_coords=[]deltas.each_slice(2)do|slice|board_coords其中deltas是一个数组,x,y是fixnums。有没有办法去掉第一行和最后一行,让方法更优雅?喜欢:defdeltas_to_board_locations(deltas,x,y)deltas.each_slice(2)do|slice|board_coords 最佳答案 deltas.each_slice(2).flat_m

随机推荐