容器定时水平伸缩(CronHPA)是容器水平伸缩(HPA)的一种补充,对于有明显的周期性负载,可以通过容器定时水平伸缩(CronHPA)的方式提供预弹的能力,减少流量毛刺的冲击,主要用在瞬间大量请求,比如活动、抽奖、秒杀等等,可以提前把环境准备好,大量的请求过来后能够应对自如。
git clone https://github.com/AliyunContainerService/kubernetes-cronhpa-controller.git
- cd kubernetes-cronhpa-controller
- kubectl apply -f config/crds/autoscaling.alibabacloud.com_cronhorizontalpodautoscalers.yaml
kubectl apply -f config/rbac/rbac_role.yaml
4、安装ClusterRolebinding and ServiceAccount kubectl apply -f config/rbac/rbac_role_binding.yaml

kubectl api-resources |grep cronhpa

kubectl apply -f config/deploy/deploy.yaml

kubectl get deploy kubernetes-cronhpa-controller -n kube-system -o wide

通过kubectl api-versions查看有autoscaling.alibabacloud.com/v1beta1之后就不会提示
error: unable to recognize "xxxxx-Cronhpa.yaml": no matches for kind "CronHorizontalPodAutoscaler" in version "autoscaling.alibabacloud.com/v1beta1"
现在我们发布到k8s集群
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- labels:
- app: website
- name: website
- namespace: xxxxx
- spec:
- replicas: 2
- selector:
- matchLabels:
- app: website
- template:
- metadata:
- creationTimestamp: null
- labels:
- app: website
- spec:
- imagePullSecrets:
- - name: dockerhub
- containers:
- - name: website
- image: xxxxx/xxxxx:v1
- resources:
- requests:
- cpu: 0.1
- memory: 50Mi
- limits:
- cpu: 0.2
- memory: 1000Mi
- ports:
- - containerPort: 8888
- name: website
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: website
- namespace: xxxxx
- spec:
- type: NodePort
- selector:
- app: website
- ports:
- - nodePort: 888
- port: 8888
- protocol: TCP
- targetPort: 8888
- sessionAffinity: None
- type: NodePort

这里的机制了解一下,如果写了两条00 */3和00 */4 从上往下执行,当过了3分钟执行一次更改pod为3个,再等4分钟执行一次更改pod为4个,下次执行再次循环
关于 Kubernetes CronJob 调度(重要)
所有 CronJob 调度时间都是基于 kube-controller-manager 的时区。也就是说如果 kube-controller-manager 的时区设置不正确,将无法正确进行调度,尤其是对于在特定时间运行的任务(对于周期性任务没有影响,比如每分钟运行)。
在默认情况下,kube-controller-manager 使用 UTC 时间:
kubectl exec -n kube-system kubernetes-cronhpa-controller-5dbf57c679-lkqbz -- date

如果想要定时任务正确执行,需要设置 kube-controller-manager 的时区,需要修改 /etc/kubernetes/manifests/kube-controller-manager.yaml 文件:
-- 在 volumes 中,添加如下内容
- hostPath:
path: /etc/localtime
name: localtime
-- 在 volumeMounts 中,添加如下内容:
- mountPath: /etc/localtime
name: localtime
readOnly: true
再运行:

kubectl apply -f /etc/kubernetes/manifests/kube-controller-manager.yaml
- apiVersion: autoscaling.alibabacloud.com/v1beta1
- kind: CronHorizontalPodAutoscaler
- metadata:
- labels:
- controller-tools.k8s.io: "1.0"
- name: website
- namespace: mark
- spec:
- scaleTargetRef:
- apiVersion: apps/v1
- kind: Deployment
- name: website ##绑定上面用devployment创建的项目website
- jobs:
- - name: "websitenum1"
- schedule: "00 */3 * * * *" ##这里比crontab多了一位“秒”
- targetSize: 6 #每隔15分缩减pod为6个
- - name: "websitenum2"
- schedule: "00 43 7 * * *" #每天7:43增加pod为5个
- targetSize: 5

可以看到已经定时运行了指定pod

