一、了解容器定时伸缩(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

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐