简介:阿里云开源的云原生利用自动化治理套件、CNCF Sandbox 我的项目 — OpenKruise,明天公布 v0.10.0 新版本,这也会是 OpenKruise v1.0 之前的最初一个 minor 版本。本文将带你一览 v0.10.0 的新变动,其中新增的 WorkloadSpread、PodUnavailableBudget 等大颗粒个性后续还将有转文具体介绍其设计实现原理。
作者 | 酒祝
背景
阿里云开源的云原生利用自动化治理套件、CNCF Sandbox 我的项目 — OpenKruise,明天公布 v0.10.0 新版本,这也会是 OpenKruise v1.0 之前的最初一个 minor 版本。
本文将带你一览 v0.10.0 的新变动,其中新增的 WorkloadSpread、PodUnavailableBudget 等大颗粒个性后续还将有转文具体介绍其设计实现原理。
新性能概览
1. WorkloadSpread:旁路的利用弹性拓扑治理能力
在利用部署运维的场景下,有着多种多样的拓扑打散以及弹性的诉求。其中最常见、最根本的,就是按某种或几种拓扑程度打散,比方:
- 利用部署须要按 node 维度打散,防止重叠(进步容灾能力)
- 利用部署须要按 AZ(available zone)维度打散(进步容灾能力)
这些根本的诉求,通过 Kubernetes 原生提供的 pod affinity、topology spread constraints 等能力目前都可能满足了。但在理论的生产场景下,还有着太多更加简单的分区与弹性需要,以下举一些理论的例子:
按 zone 打散时,须要指定在不同 zone 中部署的比例数,比方某个利用在 zone a、b、c 中部署的 Pod 数量比例为 1 : 1 : 2 等(因为一些事实的起因比方该利用在多个 zone 中的流量不平衡等
存在多个 zone 或不同机型的拓扑,利用扩容时,优先部署到某个 zone 或机型上,当资源有余时再部署到另一个 zone 或机型上(往后以此类推);利用缩容时,要按反向程序,优先缩容前面 zone 或机型上的 Pod(往前以此类推)
存在多个根底的节点池和弹性的节点池,利用部署时须要固定数量或比例的 Pod 部署在根底节点池,其余的都扩到弹性节点池
对于这些例子,过来个别只能将一个利用拆分为多个 Workload(比方 Deployment)来部署,能力解决利用在不同拓扑下采纳不同比例数量、扩缩容优先级、资源感知、弹性抉择等场景的根本问题,但还是须要 PaaS 层深度定制化,来反对对一个利用多个 Workload 的精细化治理。
针对这些问题,在 Kruise v0.10.0 版本中新增了 WorkloadSpread 资源,目前它反对配合 Deployment、ReplicaSet、CloneSet 这些 Workload 类型,来治理它们上司 Pod 的分区与弹性拓扑。
以下是一个简化的例子:
apiVersion: apps.kruise.io/v1alpha1
kind: WorkloadSpread
metadata:
name: workloadspread-demo
spec:
targetRef:
apiVersion: apps/v1 | apps.kruise.io/v1alpha1
kind: Deployment | CloneSet
name: workload-xxx
subsets:
- name: subset-a
requiredNodeSelectorTerm:
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- zone-a
maxReplicas: 10 | 30%
- name: subset-b
requiredNodeSelectorTerm:
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- zone-b
创立这个 WorkloadSpread 能够通过 targetRef 关联到一个 Workload 对象上,而后这个 Workload 在扩容 pod 的过程中,Pod 会被 Kruise 按上述策略注入对应的拓扑规定。这是一种旁路的注入和治理形式,自身不会干预 Workload 对 Pod 的扩缩容、公布治理。
留神:WorkloadSpread 对 Pod 缩容的优先级管制是通过 Pod Deletion Cost 来实现的:
- 如果 Workload 类型是 CloneSet,则曾经反对了这个 feature,能够实现缩容优先级
- 如果 Workload 类型是 Deployment/ReplicaSet,则要求 Kubernetes version >= 1.21,且在 1.21 中要在 kube-controller-manager 上开启 PodDeletionCost 这个 feature-gate
应用 WorkloadSpread 性能,须要在 装置 / 降级 Kruise v0.10.0 的时候关上 WorkloadSpread 这个 feature-gate。
上述例子仅为最简化配置,更多应用阐明请参考 官网文档,具体的实现原理咱们将会在后续的文章中与大家分享。
2. PodUnavailableBudget:利用可用性防护
在诸多 Voluntary Disruption 场景中 Kubernetes 原生提供的 Pod Disruption Budget(PDB)通过限度同时中断的 Pod 数量,来保障利用的高可用性。
但还有很多场景中,即使有 PDB 防护仍然将会导致业务中断、服务降级,比方:
- 利用 owner 通过 Deployment 正在进行版本升级,与此同时集群管理员因为机器资源利用率过低正在进行 node 缩容
- 中间件团队利用 SidecarSet 正在原地降级集群中的 sidecar 版本(例如:ServiceMesh envoy),同时 HPA 正在对同一批利用进行缩容
- 利用 owner 和中间件团队利用 CloneSet、SidecarSet 原地降级的能力,正在对同一批 Pod 进行降级
这其实很好了解 — PDB 只能防控通过 Eviction API 来触发的 Pod 驱赶(例如 kubectl drain 驱赶 node 下面的所有 Pod),然而对于 Pod 删除、原地降级 等很多操作是无奈防护的。
在 Kruise v0.10.0 版本中新增的 PodUnavailableBudget(PUB)性能,则是对原生 PDB 的强化扩大。它蕴含了 PDB 本身的能力,并在此基础上减少了对更多 Voluntary Disruption 操作的防护,包含但不限于 Pod 删除、原地降级等。
apiVersion: apps.kruise.io/v1alpha1
kind: PodUnavailableBudget
metadata:
name: web-server-pub
namespace: web
spec:
targetRef:
apiVersion: apps/v1 | apps.kruise.io/v1alpha1
kind: Deployment | CloneSet | StatefulSet | ...
name: web-server
# selector 与 targetRef 二选一配置
# selector:
# matchLabels:
# app: web-server
# 保障的最大不可用数量
maxUnavailable: 60%
# 保障的最小可用数量
# minAvailable: 40%
应用 PodUnavailableBudget 性能,须要在 装置 / 降级 Kruise v0.10.0 的时候关上 feature-gate(两个能够抉择关上一个,也能够都关上):
- PodUnavailableBudgetDeleteGate:拦挡防护 Pod 删除、驱赶等操作
- PodUnavailableBudgetUpdateGate:拦挡防护 Pod 原地降级等更新操作
更多应用阐明请参考 官网文档,具体的实现原理咱们将会在后续的文章中与大家分享。
3. CloneSet 反对按拓扑规定缩容
在 CloneSet 缩容(调小 replicas 数量)的时候,抉择哪些 Pod 删除是有一套固定算法排序的:
- 未调度 < 已调度
- PodPending < PodUnknown < PodRunning
- Not ready < ready
- 较小 pod-deletion cost < 较大 pod-deletion cost
- 较大打散权重 < 较小
- 处于 Ready 工夫较短 < 较长
- 容器重启次数较多 < 较少
- 创立工夫较短 < 较长
其中,“4”是在 Kruise v0.9.0 中开始提供的个性,用于反对用户指定删除程序(WorkloadSpread 就是利用这个性能实现缩容优先级);而“5”则是以后 v0.10.0 提供的个性,即在缩容的时候会参考利用的拓扑打散来排序。
- 如果利用配置了 topology spread constraints,则 CloneSet 缩容时会依照其中的 topology 维度打散来抉择 Pod 删除(比方尽量打平多个 zone 上部署 Pod 的数量)
- 如果利用没有配置 topology spread constraints,则默认状况下 CloneSet 缩容时会依照 node 节点维度打散来抉择 Pod 删除(尽量减少同 node 上的重叠数量)
4. Advanced StatefulSet 反对流式扩容
为了防止在一个新 Advanced StatefulSet 创立后有大量失败的 pod 被创立进去,从 Kruise v0.10.0 版本开始引入了在 scale strategy 中的 maxUnavailable 策略:
apiVersion: apps.kruise.io/v1beta1
kind: StatefulSet
spec:
# ...
replicas: 100
scaleStrategy:
maxUnavailable: 10% # percentage or absolute number
当这个字段被设置之后,Advanced StatefulSet 会保障创立 pod 之后不可用 pod 数量不超过这个限度值。
比如说,下面这个 StatefulSet 一开始只会一次性创立 10 个 pod。在此之后,每当一个 pod 变为 running、ready 状态后,才会再创立一个新 pod 进去。
留神:这个性能只容许在 podManagementPolicy 是 Parallel
的 StatefulSet 中应用。
5. 其余
除了上述内容外,还有一些变动如:
- SidecarSet 新增 imagePullSecrets、injectionStrategy.paused 等字段反对配置 sidecar 镜像拉取 secret 以及暂停注入
- Advanced StatefulSet 反对配合原地降级的镜像提前预热
详见 ChangeLog 文档。
最初
本次的 v0.10.0 会是 OpenKruise v1.0 之前的最初一个 minor 版本,在年底之前 Kruise 将会公布首个 v1.0 大版本,敬请期待!
原文链接
本文为阿里云原创内容,未经容许不得转载。