CCE 支持定时伸缩部署
所有文档

          容器引擎 CCE

          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任务的集合

          cronname:字符串,非空。作为该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设置格式

          image2020-6-1_16-48-42.png

          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积累太多历史任务未处理。 提工单解决

          上一篇
          边缘集群
          下一篇
          CCE 集群节点自动伸缩