CCE 支持定时伸缩部署
一、定时、周期伸缩介绍
对于某些可预知的业务情形,可提前设置好定时伸缩任务,在业务波峰来临之前扩容工作容器,可以减少运维人员的工作量。目前CCE支持对Deployment、StatefulSet设置定时伸缩任务,同时支持定时伸缩与HPA结合使用,极大扩展了弹性伸缩的应用场景。
二、使用手册
前提:创建CCE集群,集群版本>1.13.x
在已经创建的CCE集群中,按照如下步骤:
1、创建CRD yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: cronhpas.cce.io
spec:
group: cce.io
version: v1
names:
kind: CronHPA
listKind: CronHPAList
plural: cronhpas
singular: cronhpa
scope: Namespaced
2、创建cronHPA_controller的相关资源
apiVersion: v1
kind: ServiceAccount
metadata:
name: cce-cronhpa-controller
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cce-cronhpa-controller
namespace: kube-system
subjects:
- kind: ServiceAccount
name: cce-cronhpa-controller
namespace: kube-system
roleRef:
kind: ClusterRole
name: cce-cronhpa-controller
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cce-cronhpa-controller
namespace: kube-system
rules:
- apiGroups:
- ""
resources:
- deployments
- statefulsets
- events
verbs:
- '*'
- apiGroups: ["extensions", "apps"]
resources:
- deployments
- deployments/scale
- statefulsets
- replicasets
verbs:
- '*'
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- '*'
- apiGroups:
- apiextensions.k8s.io
resources:
- customresourcedefinitions
verbs:
- '*'
- apiGroups:
- cce.io
resources:
- '*'
verbs:
- '*'
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: cron-hpa-controller
namespace: kube-system
labels:
app: cron-hpa-controller
spec:
replicas: 1
selector:
matchLabels:
app: cron-hpa-controller
template:
metadata:
labels:
app: cron-hpa-controller
spec:
serviceAccountName: cce-cronhpa-controller
containers:
- name: cron-hpa-controller
image: hub.baidubce.com/jpaas-public/cce-cronhpa-controller:latest
imagePullPolicy: Always
command:
- ./usr/local/bin/cce-cronhpa-controller
resources:
limits:
memory: 512Mi
cpu: 200m
requests:
memory: 200Mi
cpu: 100m
volumeMounts:
- name: host-time
mountPath: /etc/localtime
readOnly: true
volumes:
- name: host-time
hostPath:
path: /etc/localtime
此时cronHPA部署环境搭建完毕,接下来可以创建相应的实例资源
3、创建cronHPA资源与其引用的子资源
引用的子对象为deployment
这里会创建CronHPA、Deployment两个资源
apiVersion: apps/v1
kind: Deployment
metadata:
name: cronhpa-test
spec:
replicas: 1
selector:
matchLabels:
name: cronhpa-test
template:
metadata:
name: cronhpa-test
labels:
name: cronhpa-test
spec:
containers:
- name: nginx
image: hub.baidubce.com/jpaas-public/nginx-alpine-go
ports:
- containerPort: 80
---
apiVersion: cce.io/v1
kind: CronHPA
metadata:
name: cronhpa-sample
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: cronhpa-test
excludeDates:
- "*/2 * * * *"
crons:
- name: "scale-down"
schedule: "*/1 * * * *"
targetSize: 2
runOnce: true
- name: "scale-up"
schedule: "*/2 * * * *"
targetSize: 3
runOnce: false
scaleTargetRef: 非空,字段标识该CronHPA指定的资源对象,即伸缩对象,可以是deployment、statefulset。
excludeDates:一个cron字符串数组,该cron表达式组根据当前时间、LastScheduleTime进行计算下次不执行伸缩的时间集,从而实现日期过滤功能(注:这里多个cron的关系是或,即每一个cron代表一个过滤时间)
crons:字段下是cron任务的集合
cron: name:字符串,非空。作为该cron的唯一标识(设置cron name必须保证在同一个crons数组中的所有cron的name均不同)。
targetSize:int32,非空。设置为用户期望的引用子资源的副本数。
schedule:字符串,非空。该cron表达式组根据当前时间、LastScheduleTime进行下次执行伸缩的时间
runOnce: 布尔类型,可以为空(默认值false),为true时表示该cron是否需要只执行一次
注意:多个cron可能会在同一时刻操作同一个资源对象,此时会选择targetSize最大的cron任务执行,以保证业务不受影响。
引用的子对象为HorizontalPodAutoscaler
这里会创建CronHPA、HorizontalPodAutoscaler、Deployment三个资源。
注意:此种情况主要是为了解决CronHPA与HPA引用同一个Deployment情况,用户不应该让CronHPA与HPA引用同一个Deployment,而是CronHPA引用HPA,HPA引用Deployment,这样可以对同一个Deployment同时使用CronHPA与HPA。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hpa-deploy
labels:
app: hpa-deploy
spec:
replicas: 5
selector:
matchLabels:
app: hpa-deploy
template:
metadata:
labels:
app: hpa-deploy
spec:
containers:
- name: hpa-deploy
image: hub.baidubce.com/jpaas-public/hpa:hpa-example
resources:
limits:
cpu: 100m
memory: 300Mi
requests:
cpu: 10m
memory: 30Mi
ports:
- containerPort: 80
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: cronhpa-hpa-test
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-deploy
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
---
apiVersion: cce.io/v1
kind: CronHPA
metadata:
name: cronhpa-hpa-sample
namespace: default
spec:
scaleTargetRef:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
name: cronhpa-hpa-test
crons:
- name: "scale-up"
schedule: "*/1 * * * *"
targetSize: 11
scaleTargetRef:在这种情况下是 kind为HorizontalPodAutoscaler
其他字段的含义与deployment相同
此种情况主要是为了兼容HPA 与 定时伸缩组件,让二者能够引用用一个资源对象,目前百度云支持如下的冲突解决,兼容情况。
HPA(MIN/MAX) | cronHPA(targetSize) | deploy(currentSize) | result | solution |
---|---|---|---|---|
5/10 | 4 | 5 | hpa(4/10) deployment 5 | 定时低于当前,保留当前副本定时低于HPA下限,修改HPA下限 |
5/10 | 11 | 5 | hpa(11/11) deployment 11 | 定时高于当前,保留定时副本定时高于HPA上限,修改HPA上限 |
1/5 | 2 | 2 | hpa(1/5) deployment 2 | 定时和当前一致,无需变更 |
1/5 | 2 | 3 | hpa(1/5) deployment 3 | 当前高于定时,保留当前副本 |
1/5 | 3 | 2 | hpa(3/5) deployment 3 | 定时高于当前,保留定时副本定时高于HPA下限,修改HPA下限 |
兼容思想只有一个,就是维持deploy最大副本的情况,并且可以让deploy持续处于最大副本的状态。
三、常用案例
cron设置格式
1、每月每天每小时的第 0 分钟执行一次: 0 * * * *
2、在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次: 0 6-12/3 12
3、周一到周五每天下午 5:00执行一次: 0 17 * * 1-5
4、每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行: 20 0-23/2 * * *
四、FAQ
1、controller同步的时间粒度
CronHPA controller每隔1分钟同步一次集群内所有的CronHPA的资源。(cron的粒度最小是分钟)
2、是否支持controller多副本
支持
3、为什么设置的cron任务未生效
在kube-system命令空间下查看cce-cronhpa-controller 组件是否正常工作 查看cce-cronhpa-controller 组件的日志,是否有报“too many missed start time (> 100)” ,错误,可能是controller积累太多历史任务未处理。 提工单解决