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

前语

弹性弹性是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等。

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

简略的了解便是,弹性负载会监听原始负载,并依据弹性单元设定的调度战略,克隆并生成弹性单元的负载,而且依据弹性负载中副本的改变,动态的分配原始负载和弹性单元上面的副本数目。履行弹性负载模板后,咱们能够经过命令行检查当时的状况,其间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即可。
Kubernetes弹性弹性全场景解读(九)- 弹性负载kubernetes-elastic-workload发布

无需修正参数,点击创立即可。

最终

弹性负载所能处理的问题还远不止文中说到的这些,假如咱们从更笼统的视点来看到弹性负载,实际上,弹性负载首要是处理了精密化调度和操控器次序的问题,因而开发者能够根据弹性负载在例如毛病康复、可用区容灾等等场景下进行进一步的开发和运用。鄙人一篇文章中,咱们会来介绍弹性负载的弹性战略,怎么经过弹性战略的设置完成容灾