Kubernetes弹性伸缩全场景解读(八) - 定时伸缩组件支持运维模式

简介: ## 前言 定时伸缩(cronhpa)是很多开发者在解决负载周期性时最常用的方法,通过类似crontab的语法可以在一个时间点定时触发伸缩活动。crontab的语义表达是很强大的,但是也存在语法复杂,执行计划容易被打断等问题。为了解决上述的问题,定时伸缩(cronhpa)提供了运维模式,支持通过运维页面来查看底层排队的定时任务,同时也提供了API接口用于开发者自研的平台接入与集成。 #

前言

定时伸缩(cronhpa)是很多开发者在解决负载周期性时最常用的方法,通过类似crontab的语法可以在一个时间点定时触发伸缩活动。crontab的语义表达是很强大的,但是也存在语法复杂,执行计划容易被打断等问题。为了解决上述的问题,定时伸缩(cronhpa)提供了运维模式,支持通过运维页面来查看底层排队的定时任务,同时也提供了API接口用于开发者自研的平台接入与集成。

定时伸缩组件运维模式介绍

当通过ACK的应用目录或者开源社区的模板下发最新版本定时伸缩组件(cronhpa)后,默认在8000端口就已经开启了运维模式。我们先给定时伸缩组件(cronhpa)创建一个svc用来访问运维页面。

apiVersion: v1
kind: Service
metadata:
  name: kubernetes-cronhpa-controller
  namespace: kube-system
spec:
    ports:
    - port: 80
      protocol: TCP
      targetPort: 8000
  selector:
    app: ack-kubernetes-cronhpa-controller
  sessionAffinity: None
  type: ClusterIP

此时,在本地我们可以通过执行kubectl proxy --port=8080启动proxy模式,再在本地浏览器中输入http://localhost:8080/api/v1/namespaces/kube-system/services/kubernetes-cronhpa-controller/proxy/ 即可访问运维管理页面。

image.png

让我们来解析下这个页面中展现的字段和使用的方式。

  • CronHPA:定时伸缩CRD的名字。
  • Namespace:定时伸缩CRD的命名空间。
  • Id:伸缩任务的唯一Id,这个Id的作用是唯一决定一个任务的信息。

image.png

当CRD中出现了JobId与底层CronEngine中的Id不匹配的情况,说明CRD中的任务没有及时被下发到底层的定时执行引擎中,此时就需要特别关注下定时伸缩(cronhpa)组件稳定性的问题了。

  • Pre:上一次任务执行的时间,如果这个数值是初始时间(0001-01-01 00:00:00 +0000 UTC)说明任务还没有被执行过。
  • Next:下一次任务执行的时间,用来确认定时引擎中是否已经有正确排队的任务。

通常情况下,我们只需要通过页面大盘确认下发的作业已经存在,并且Pre/Next这两个字段是正常的状态,基本就可以确认定时任务可以正常执行了。如果开发者有自己的运维管理系统,可以使用API的方式进行接入。接口地址:http://localhost:8080/api/v1/namespaces/kube-system/services/kubernetes-cronhpa-controller/proxy/api.json

[
    {
        "Schedule": {
            "Second": 1073741824,
            "Minute": 10376293541461622783,
            "Hour": 9223372036871553023,
            "Dom": 9223372041149743102,
            "Month": 9223372036854783998,
            "Dow": 9223372036854775935
        },
        "Next": "2021-03-15T18:53:30+08:00",
        "Prev": "2021-03-15T18:52:30+08:00",
        "Job": {
            "TargetRef": {
                "RefName": "nginx-deployment-basic",
                "RefNamespace": "default",
                "RefKind": "Deployment",
                "RefGroup": "apps",
                "RefVersion": "v1"
            },
            "HPARef": {
                "kind": "CronHorizontalPodAutoscaler",
                "apiVersion": "autoscaling.alibabacloud.com/v1beta1",
                "metadata": {
                    "name": "cronhpa-sample",
                    "namespace": "default",
                    "selfLink": "/apis/autoscaling.alibabacloud.com/v1beta1/namespaces/default/cronhorizontalpodautoscalers/cronhpa-sample",
                    "uid": "54dc98fe-b311-4763-8d99-25a93bdf5c74",
                    "resourceVersion": "770255389",
                    "generation": 2,
                    "creationTimestamp": "2021-03-15T10:49:46Z",
                    "labels": {
                        "controller-tools.k8s.io": "1.0"
                    },
                    "annotations": {
                        "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"autoscaling.alibabacloud.com/v1beta1\",\"kind\":\"CronHorizontalPodAutoscaler\",\"metadata\":{\"annotations\":{},\"labels\":{\"controller-tools.k8s.io\":\"1.0\"},\"name\":\"cronhpa-sample\",\"namespace\":\"default\"},\"spec\":{\"jobs\":[{\"name\":\"scale-down\",\"schedule\":\"30 */1 * * * *\",\"targetSize\":1},{\"name\":\"scale-up\",\"schedule\":\"01 */1 * * * *\",\"targetSize\":3}],\"scaleTargetRef\":{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"name\":\"nginx-deployment-basic\"}}}\n"
                    }
                },
                "spec": {
                    "scaleTargetRef": {
                        "apiVersion": "apps/v1",
                        "kind": "Deployment",
                        "name": "nginx-deployment-basic"
                    },
                    "jobs": [
                        {
                            "name": "scale-down",
                            "schedule": "30 */1 * * * *",
                            "targetSize": 1
                        },
                        {
                            "name": "scale-up",
                            "schedule": "01 */1 * * * *",
                            "targetSize": 3
                        }
                    ]
                },
                "status": {
                    "scaleTargetRef": {
                        "apiVersion": "apps/v1",
                        "kind": "Deployment",
                        "name": "nginx-deployment-basic"
                    },
                    "conditions": [
                        {
                            "name": "scale-down",
                            "jobId": "f68e5d16-f92b-4456-89d0-1da3ca36efa4",
                            "schedule": "30 */1 * * * *",
                            "targetSize": 1,
                            "runOnce": false,
                            "state": "Submitted",
                            "lastProbeTime": "2021-03-15T10:49:46Z",
                            "message": ""
                        },
                        {
                            "name": "scale-up",
                            "jobId": "8f611afa-ebde-4903-8c23-b323951b8757",
                            "schedule": "01 */1 * * * *",
                            "targetSize": 3,
                            "runOnce": false,
                            "state": "Submitted",
                            "lastProbeTime": "2021-03-15T10:49:46Z",
                            "message": ""
                        }
                    ]
                }
            },
            "DesiredSize": 1,
            "Plan": "30 */1 * * * *",
            "RunOnce": false
        }
    },
    {
        "Schedule": {
            "Second": 2,
            "Minute": 10376293541461622783,
            "Hour": 9223372036871553023,
            "Dom": 9223372041149743102,
            "Month": 9223372036854783998,
            "Dow": 9223372036854775935
        },
        "Next": "2021-03-15T18:54:01+08:00",
        "Prev": "2021-03-15T18:53:01+08:00",
        "Job": {
            "TargetRef": {
                "RefName": "nginx-deployment-basic",
                "RefNamespace": "default",
                "RefKind": "Deployment",
                "RefGroup": "apps",
                "RefVersion": "v1"
            },
            "HPARef": {
                "kind": "CronHorizontalPodAutoscaler",
                "apiVersion": "autoscaling.alibabacloud.com/v1beta1",
                "metadata": {
                    "name": "cronhpa-sample",
                    "namespace": "default",
                    "selfLink": "/apis/autoscaling.alibabacloud.com/v1beta1/namespaces/default/cronhorizontalpodautoscalers/cronhpa-sample",
                    "uid": "54dc98fe-b311-4763-8d99-25a93bdf5c74",
                    "resourceVersion": "770255389",
                    "generation": 2,
                    "creationTimestamp": "2021-03-15T10:49:46Z",
                    "labels": {
                        "controller-tools.k8s.io": "1.0"
                    },
                    "annotations": {
                        "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"autoscaling.alibabacloud.com/v1beta1\",\"kind\":\"CronHorizontalPodAutoscaler\",\"metadata\":{\"annotations\":{},\"labels\":{\"controller-tools.k8s.io\":\"1.0\"},\"name\":\"cronhpa-sample\",\"namespace\":\"default\"},\"spec\":{\"jobs\":[{\"name\":\"scale-down\",\"schedule\":\"30 */1 * * * *\",\"targetSize\":1},{\"name\":\"scale-up\",\"schedule\":\"01 */1 * * * *\",\"targetSize\":3}],\"scaleTargetRef\":{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"name\":\"nginx-deployment-basic\"}}}\n"
                    }
                },
                "spec": {
                    "scaleTargetRef": {
                        "apiVersion": "apps/v1",
                        "kind": "Deployment",
                        "name": "nginx-deployment-basic"
                    },
                    "jobs": [
                        {
                            "name": "scale-down",
                            "schedule": "30 */1 * * * *",
                            "targetSize": 1
                        },
                        {
                            "name": "scale-up",
                            "schedule": "01 */1 * * * *",
                            "targetSize": 3
                        }
                    ]
                },
                "status": {
                    "scaleTargetRef": {
                        "apiVersion": "apps/v1",
                        "kind": "Deployment",
                        "name": "nginx-deployment-basic"
                    },
                    "conditions": [
                        {
                            "name": "scale-down",
                            "jobId": "f68e5d16-f92b-4456-89d0-1da3ca36efa4",
                            "schedule": "30 */1 * * * *",
                            "targetSize": 1,
                            "runOnce": false,
                            "state": "Submitted",
                            "lastProbeTime": "2021-03-15T10:49:46Z",
                            "message": ""
                        },
                        {
                            "name": "scale-up",
                            "jobId": "8f611afa-ebde-4903-8c23-b323951b8757",
                            "schedule": "01 */1 * * * *",
                            "targetSize": 3,
                            "runOnce": false,
                            "state": "Submitted",
                            "lastProbeTime": "2021-03-15T10:49:46Z",
                            "message": ""
                        }
                    ]
                }
            },
            "DesiredSize": 3,
            "Plan": "01 */1 * * * *",
            "RunOnce": false
        }
    }
]

最后

通过运维页面和API,开发者可以很好地洞悉定时伸缩(cronhpa)组件的底层状态,提供更确切的伸缩保障。如果对于运维模式有更多的建议,请提交到社区

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
存储 弹性计算 调度
基于Knative的LLM推理场景弹性伸缩方案
Knative的基于请求弹性配置与大语言模型(LLM)的推理场景高度契合。此外,它的资源降配特性可以显著帮助用户降低成本。本文详细介绍基于 Knative 的 LLM 推理场景弹性伸缩方案。
|
运维 供应链 前端开发
中小医院云HIS系统源码,系统融合HIS与EMR功能,采用B/S架构与SaaS模式,快速交付并简化运维
这是一套专为中小医院和乡镇卫生院设计的云HIS系统源码,基于云端部署,采用B/S架构与SaaS模式,快速交付并简化运维。系统融合HIS与EMR功能,涵盖门诊挂号、预约管理、一体化电子病历、医生护士工作站、收费财务、药品进销存及统计分析等模块。技术栈包括前端Angular+Nginx,后端Java+Spring系列框架,数据库使用MySQL+MyCat。该系统实现患者管理、医嘱处理、费用结算、药品管控等核心业务全流程数字化,助力医疗机构提升效率和服务质量。
702 4
|
Prometheus Kubernetes 监控
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
663 1
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
331 1
|
Kubernetes 监控 调度
k8s学习--kubernetes服务自动伸缩之垂直伸缩(资源伸缩)VPA详细解释与安装
k8s学习--kubernetes服务自动伸缩之垂直伸缩(资源伸缩)VPA详细解释与安装
781 2
|
Kubernetes 应用服务中间件 nginx
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
433 1
|
Kubernetes Cloud Native 应用服务中间件
Kubernetes 自动伸缩策略:优化资源利用率
【8月更文第29天】在现代云原生环境中,应用的流量往往具有不可预测性。为了应对这种变化,Kubernetes 提供了多种自动伸缩机制来动态调整应用实例的数量和每个实例分配的资源。本文将深入探讨两种主要的自动伸缩工具:水平 Pod 自动伸缩器 (HPA) 和垂直 Pod 伸缩器 (VPA),并提供实际的应用示例。
468 2
|
弹性计算 Kubernetes 算法
AHPA:Kubernetes弹性伸缩的预言家,揭秘未来资源使用的神秘面纱!
【8月更文挑战第8天】在云原生应用中,Kubernetes已成为部署标准。面对不断扩大的集群与应用规模,有效资源管理和弹性伸缩成为关键。AHPA(自适应历史感知预测算法)作为先进的预测技术,通过分析历史数据预测资源需求并自动调整Kubernetes资源分配。以一个在线零售平台为例,通过AHPA识别流量周期性变化,在节假日高峰期前自动增加Pod数量,保证服务稳定;而在平峰期减少Pod数量,节省资源。AHPA为Kubernetes提供了智能化的弹性伸缩方案,提高了应用稳定性和资源利用率。
350 7
|
运维 Kubernetes 监控
云原生时代的运维革新:Kubernetes的自动化之旅
在云原生技术不断演进的今天,Kubernetes已成为容器编排的事实标准。本文将深入探讨Kubernetes如何通过自动化工具和实践,为运维团队提供高效率、高可用性的解决方案,从而推动运维工作向更高效、智能化的方向转型。
286 6

热门文章

最新文章