k8s容器定时伸缩(CronHPA)
容器定时水平伸缩(CronHPA)是容器水平伸缩(HPA)的一种补充,对于有明显的周期性负载,可以通过容器定时水平伸缩(CronHPA)的方式提供预弹的能力,减少流量毛刺的冲击,主要用在瞬间大量请求,比如活动、抽奖、秒杀等等,可以提前把环境准备好,大量的请求过来后能够应对自如。
一、了解容器定时伸缩(CronHPA)
容器定时水平伸缩(CronHPA)是容器水平伸缩(HPA)的一种补充,对于有明显的周期性负载,可以通过容器定时水平伸缩(CronHPA)的方式提供预弹的能力,减少流量毛刺的冲击,主要用在瞬间大量请求,比如活动、抽奖、秒杀等等,可以提前把环境准备好,大量的请求过来后能够应对自如。
二、安装使用CronHPA
1、下载相关资源
git clone https://github.com/AliyunContainerService/kubernetes-cronhpa-controller.git
2、安装CRD
cd kubernetes-cronhpa-controller
kubectl apply -f config/crds/autoscaling.alibabacloud.com_cronhorizontalpodautoscalers.yaml
3、安装 ClusterRole
kubectl apply -f config/rbac/rbac_role.yaml
4、安装ClusterRolebinding and ServiceAccount
kubectl apply -f config/rbac/rbac_role_binding.yaml
5、查看api-resources
kubectl api-resources |grep cronhpa
6、安装aubernetes-cronhpa-controller
kubectl apply -f config/deploy/deploy.yaml
7、验证安装信息
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"
三、部署项目
1、这是我准备的一个java项目,已经通过Dockerfile打包好发送到harbor仓库
现在我们发布到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
2、设置kube-controller-manager时区
这里的机制了解一下,如果写了两条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
3、设置cronhpa.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
3、查看cronthpa状态
可以看到已经定时运行了指定pod
更多推荐
所有评论(0)