• k8s容器定时伸缩(CronHPA)


    一、了解容器定时伸缩(CronHPA)

            容器定时水平伸缩(CronHPA)是容器水平伸缩(HPA)的一种补充,对于有明显的周期性负载,可以通过容器定时水平伸缩(CronHPA)的方式提供预弹的能力,减少流量毛刺的冲击,主要用在瞬间大量请求,比如活动、抽奖、秒杀等等,可以提前把环境准备好,大量的请求过来后能够应对自如。

    二、安装使用CronHPA

    1、下载相关资源

    git clone https://github.com/AliyunContainerService/kubernetes-cronhpa-controller.git
    

    2、安装CRD

    1. cd kubernetes-cronhpa-controller
    2. 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集群

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. apiVersion: apps/v1
    5. kind: Deployment
    6. metadata:
    7. labels:
    8. app: website
    9. name: website
    10. namespace: xxxxx
    11. spec:
    12. replicas: 2
    13. selector:
    14. matchLabels:
    15. app: website
    16. template:
    17. metadata:
    18. creationTimestamp: null
    19. labels:
    20. app: website
    21. spec:
    22. imagePullSecrets:
    23. - name: dockerhub
    24. containers:
    25. - name: website
    26. image: xxxxx/xxxxx:v1
    27. resources:
    28. requests:
    29. cpu: 0.1
    30. memory: 50Mi
    31. limits:
    32. cpu: 0.2
    33. memory: 1000Mi
    34. ports:
    35. - containerPort: 8888
    36. name: website
    37. ---
    38. apiVersion: v1
    39. kind: Service
    40. metadata:
    41. name: website
    42. namespace: xxxxx
    43. spec:
    44. type: NodePort
    45. selector:
    46. app: website
    47. ports:
    48. - nodePort: 888
    49. port: 8888
    50. protocol: TCP
    51. targetPort: 8888
    52. sessionAffinity: None
    53. 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文件

    1. apiVersion: autoscaling.alibabacloud.com/v1beta1
    2. kind: CronHorizontalPodAutoscaler
    3. metadata:
    4. labels:
    5. controller-tools.k8s.io: "1.0"
    6. name: website
    7. namespace: mark
    8. spec:
    9. scaleTargetRef:
    10. apiVersion: apps/v1
    11. kind: Deployment
    12. name: website ##绑定上面用devployment创建的项目website
    13. jobs:
    14. - name: "websitenum1"
    15. schedule: "00 */3 * * * *" ##这里比crontab多了一位“秒”
    16. targetSize: 6 #每隔15分缩减pod为6
    17. - name: "websitenum2"
    18. schedule: "00 43 7 * * *" #每天743增加pod为5
    19. targetSize: 5

    3、查看cronthpa状态

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

     

  • 相关阅读:
    阿拉伯糖偶联核苷酸,UDP-b-L-arabinopyranose disodium salt,UDP-β-L-Ara.2Na
    唯愿山城无恙-烟火寻常--爱摸鱼的美工(五)
    C语言题解 | 消失的数字&轮转数组
    [线程与网络] 网络编程与通信原理(四):深入理解传输层UDP与TCP协议
    ②⑩ 【MySQL Log】详解MySQL日志:错误日志、二进制日志、查询日志、慢查询日志
    项目介绍,项目架构和微服务划分
    NginX + PostgreSQL + uWSGI + Django
    《JavaScript设计模式》笔记 - - - 超全设计模式概览
    低代码会使初级码农失业吗?
    Redis缓存穿透-热点缓存并发重建-缓存与数据库双写不一致-缓存雪崩
  • 原文地址:https://blog.csdn.net/icanflyingg/article/details/126426020