容器引擎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: extensions/v1beta1
    kind: Deployment
    metadata:
      name: cronhpa-test
    spec:
      replicas: 1
      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: extensions/v1beta1
          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集群使用Jenkins持续发布
    下一篇
    API参考