Kubernetes弹性伸缩全场景解读(九)- 弹性负载kubernetes-elastic-workload发布

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

前言

弹性伸缩是Kubernetes中比较常用的功能。在Kubernetes中,弹性是分为两个层次的,一个是调度层(Pod)弹性,一个是资源层(Node)弹性。通常会通过HPA、CronHPA、VPA等模型进行Pod的横向或者纵向的伸缩,再通过cluster-autoscaler或者virtual-kubelet进行资源层伸缩。两层之间是通过无法调度的Pod进行解耦,这样设计的好处是两层职责明确,坏处是解耦后相互结合的策略过于简单,一旦当我们需要更精细的调度策略就无能为力了,因为在Kubernetes中最小的生命周期管理单元是一个Pod,而传统的Kubernetes负载控制器(例如:Deployment、StatefulSet)管理的Pod是共享相同的调度策略的。因此,当你希望控制一个负载在不同资源上的细粒度分配时,就无能为力了。然而这种场景又是在弹性伸缩中经常遇到的。因此,为了解决应用负载弹性场景下精细化调度的诉求,kubernetes-elastic-workload应运而生了。

弹性伸缩精细化调度的问题分析

假设:有一个应用经过容量规划,预计最多有4个副本运行在ECS上,平时低峰时保留2个副本,超过4个副本的场景弹性伸缩到虚拟节点,防止干扰其他正常容量规划的应用。

在Kubernetes中,任何一种负载都要解决两个问题,一个是调度问题,一个是生命周期管理问题。要想实现上面描述的场景,我们核心要解决的问题是两个:

  1. 如何控制副本到达一个数目后,调度策略的变化。
  2. 如何在生命周期管理时,优先处理某些Pod。

弹性负载kubernetes-elastic-workload介绍

接下来,我们针对上面的问题介绍下弹性负载的使用方式与解决方法。

# 一个简单的应用,默认使用2副本
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: nginx-deployment-basic
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9 
        ports:
        - containerPort: 80

那么这个场景如何用弹性负载表达呢?

# 弹性负载定义
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: ElasticWorkload
metadata:
  name: elasticworkload-sample
spec:
  sourceTarget:
    name: nginx-deployment-basic
    kind: Deployment
    apiVersion: apps/v1
    min: 2
    max: 4
  replicas: 6
  elasticUnit:
  - name: virtual-kubelet
    labels:
      virtual-kubelet: "true"
    annotations:
      virtual-kubelet: "true"
    nodeSelector:
      type: "virtual-kubelet"
    tolerations:
    - key: "virtual-kubelet.io/provider"
      operator: "Exists"
    # min: 0 每个单元也可以指定自己的上下限
    # max: 10

上面就是这个场景的弹性负载定义,弹性负载的使用方式特别像HPA,他是通过外部挂载的方式使用,对原有的业务无侵入。一个典型的弹性负载主要分为两个部分:

  1. SourceTarget部分主要定义原始负载的类型、副本数目可变化的范围。
  2. elasticUnit部分是一个数组,定义弹性单元的调度策略,如果有多个弹性单元,则按照模板的顺序定义。

在上面的例子中,SourceTarget的副本上下限位2-4,表示当ElasticWorkload的replicas为2-4个副本时,会分配到sourceTarget,当超过4个副本时,会分为给弹性单元virtual-kubelet,而在弹性单元virtual-kubelet中可以定义这个单元所独有的调度策略,包含labelannotationnodeSelectoraffinitytoleration等。

image-20200507224446848

简单的理解就是,弹性负载会监听原始负载,并根据弹性单元设定的调度策略,克隆并生成弹性单元的负载,并且根据弹性负载中副本的变化,动态的分配原始负载和弹性单元上面的副本数目。执行弹性负载模板后,我们可以通过命令行查看当前的状态,其中status中的每个单元的Desired Replicas表示弹性负载的分配副本数目。

kubectl describe ew elasticworkload-sample   # same as kubectl get elasticworkload

Name:         elasticworkload-sample
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  autoscaling.alibabacloud.com/v1beta1
Kind:         ElasticWorkload
Metadata:
  Creation Timestamp:  2020-05-06T03:43:41Z
  Generation:          27
  Resource Version:    20635284
  Self Link:           /apis/autoscaling.alibabacloud.com/v1beta1/namespaces/default/elasticworkloads/elasticworkload-sample
  UID:                 0e9205ff-38b8-43b7-9076-ffa130f26ef4
Spec:
  Elastic Unit:
    Annotations:
      Virtual - Kubelet:  true
    Labels:
      Virtual - Kubelet:  true
    Name:                 demo
    Node Selector:
      Type:  virtual-kubelet
    Tolerations:
      Key:       virtual-kubelet.io/provider
      Operator:  Exists
  Replicas:      6
  Source Target:
    API Version:  apps/v1
    Kind:         Deployment
    Max:          2
    Min:          0
    Name:         nginx-deployment-basic
Status:
  Elastic Units Status:
    Desired Replicas:  4
    Name:              nginx-deployment-basic-unit-virtual-kubelet
    Update Timestamp:  2020-05-07T12:38:27Z
  Replicas:            6
  Selector:            app=nginx
  Source Target:
    API Version:       apps/v1
    Desired Replicas:  2
    Kind:              Deployment
    Name:              nginx-deployment-basic
    Update Timestamp:  2020-05-07T12:38:27Z
Events:                <none>

当我们下发弹性负载的模板后,可以查看Pod的情况。可以发现弹性负载克隆出了新的Deployment与Pod,并且Deployment的Pod副本数目是根据上述的规则进行动态分配的。

 kubectl get pod -o wide

 NAME                                               READY   STATUS    RESTARTS   AGE    IP             NODE                     NOMINATED NODE   READINESS GATES
nginx-deployment-basic-7ff9955f89-djxwv            1/1     Running   0          138m   172.20.1.151   cn-hangzhou.10.0.5.212   <none>           <none>
nginx-deployment-basic-7ff9955f89-hrw2z            1/1     Running   0          138m   172.20.1.27    cn-hangzhou.10.0.5.208   <none>           <none>
nginx-deployment-basic-unit-demo-8bb586568-4f8xt   1/1     Running   0          138m   10.1.76.63     virtual-node-eci-1       <none>           <none>
nginx-deployment-basic-unit-demo-8bb586568-bl5pd   1/1     Running   0          138m   10.1.76.65     virtual-node-eci-0       <none>           <none>
nginx-deployment-basic-unit-demo-8bb586568-ndbp8   1/1     Running   0          138m   10.1.76.64     virtual-node-eci-0       <none>           <none>
nginx-deployment-basic-unit-demo-8bb586568-vx9jx   1/1     Running   0          138m   10.1.76.62     virtual-node-eci-2       <none>           <none>

此外,弹性负载也支持与HPA配合使用,可以将HPA作用在弹性负载上,如下图,弹性负载会根据HPA的状态动态调整每个单元的副本分布,例如如果当前是从6个副本缩容到4个副本,那么会优先将弹性单元的副本进行缩容。

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: elastic-workload-demo
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: ElasticWorkload
    name: elasticworkload-sample
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

总结一下,首先弹性负载是通过克隆和覆写调度策略的方式生成多个Deployment,实现了调度策略的管理。其次,通过上层的副本计算,调整原始负载和弹性单元的副本分配,实现了针对一部分Pod的优先处理。从而解决了上述的问题。

弹性负载的安装与使用

弹性负载在阿里云容器服务控制台已经默认集成,可以通过应用市场进行安装,在应用目录中搜索ack-kubernetes-elastic-workload即可。
image

无需修改参数,点击创建即可。

最后

弹性负载所能解决的问题还远不止文中提到的这些,如果我们从更抽象的角度来看到弹性负载,实际上,弹性负载主要是解决了精细化调度和控制器顺序的问题,因此开发者可以基于弹性负载在例如故障恢复、可用区容灾等等场景下进行进一步的开发和使用。在下一篇文章中,我们会来介绍弹性负载的弹性策略,如何通过弹性策略的设置实现容灾。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
存储 Kubernetes API
在K8S中,etcd 适应的场景?
在K8S中,etcd 适应的场景?
|
2月前
|
运维 Kubernetes 大数据
Kubernetes 的架构问题之在Serverless Container场景下尚不支持资源超售如何解决
Kubernetes 的架构问题之在Serverless Container场景下尚不支持资源超售如何解决
59 0
|
2月前
|
弹性计算 Kubernetes 算法
AHPA:Kubernetes弹性伸缩的预言家,揭秘未来资源使用的神秘面纱!
【8月更文挑战第8天】在云原生应用中,Kubernetes已成为部署标准。面对不断扩大的集群与应用规模,有效资源管理和弹性伸缩成为关键。AHPA(自适应历史感知预测算法)作为先进的预测技术,通过分析历史数据预测资源需求并自动调整Kubernetes资源分配。以一个在线零售平台为例,通过AHPA识别流量周期性变化,在节假日高峰期前自动增加Pod数量,保证服务稳定;而在平峰期减少Pod数量,节省资源。AHPA为Kubernetes提供了智能化的弹性伸缩方案,提高了应用稳定性和资源利用率。
58 7
|
2月前
|
Rust Kubernetes 前端开发
在kubernetes上运行WASM负载
在kubernetes上运行WASM负载
38 4
|
2月前
|
存储 缓存 Kubernetes
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)
|
2月前
|
存储 Kubernetes 监控
在K8S中,K8S本身优势、适应场景及其特点有什么?
在K8S中,K8S本身优势、适应场景及其特点有什么?
|
2月前
|
存储 Kubernetes 负载均衡
在K8S中,etcd适应的场景有哪些?
在K8S中,etcd适应的场景有哪些?
|
4月前
|
Kubernetes 网络协议 Cloud Native
Kubernetes网络问题排查分享两则(1)——calico特定场景下的网络性能问题
在对Kubernetes项目[kosmos](https://github.com/kosmos-io/kosmos)与Calico网络性能进行对比测试时,发现kosmos在跨集群容器网络的性能显著优于Calico的集群内网络(约6Gbit/s对比2.9Gbit/s)。物理机网络测试达到9.38Gbit/s,显示Calico有68%的性能损耗。问题定位到网卡的checksum/offload参数,尝试用`ethtool`调整后虽短暂提升,但随后恢复原状。转载自:https://mp.weixin.qq.com/s/XsQZCSqZAXJK46zqc7IpLw
|
4月前
|
Kubernetes 安全 测试技术
超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?
超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?
|
4月前
|
Kubernetes 容器 Perl
K8s是什么?k8s应用场景是什么?
K8s是什么?k8s应用场景是什么?

相关产品

  • 容器服务Kubernetes版