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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: ## 前言 定时伸缩(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)组件的底层状态,提供更确切的伸缩保障。如果对于运维模式有更多的建议,请提交到社区

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
运维 Kubernetes Go
"解锁K8s二开新姿势!client-go:你不可不知的Go语言神器,让Kubernetes集群管理如虎添翼,秒变运维大神!"
【8月更文挑战第14天】随着云原生技术的发展,Kubernetes (K8s) 成为容器编排的首选。client-go作为K8s的官方Go语言客户端库,通过封装RESTful API,使开发者能便捷地管理集群资源,如Pods和服务。本文介绍client-go基本概念、使用方法及自定义操作。涵盖ClientSet、DynamicClient等客户端实现,以及lister、informer等组件,通过示例展示如何列出集群中的所有Pods。client-go的强大功能助力高效开发和运维。
206 1
|
2月前
|
弹性计算 Kubernetes 算法
AHPA:Kubernetes弹性伸缩的预言家,揭秘未来资源使用的神秘面纱!
【8月更文挑战第8天】在云原生应用中,Kubernetes已成为部署标准。面对不断扩大的集群与应用规模,有效资源管理和弹性伸缩成为关键。AHPA(自适应历史感知预测算法)作为先进的预测技术,通过分析历史数据预测资源需求并自动调整Kubernetes资源分配。以一个在线零售平台为例,通过AHPA识别流量周期性变化,在节假日高峰期前自动增加Pod数量,保证服务稳定;而在平峰期减少Pod数量,节省资源。AHPA为Kubernetes提供了智能化的弹性伸缩方案,提高了应用稳定性和资源利用率。
58 7
|
2月前
|
运维 Kubernetes 监控
云原生时代的运维革新:Kubernetes的自动化之旅
在云原生技术不断演进的今天,Kubernetes已成为容器编排的事实标准。本文将深入探讨Kubernetes如何通过自动化工具和实践,为运维团队提供高效率、高可用性的解决方案,从而推动运维工作向更高效、智能化的方向转型。
67 6
|
2月前
|
Kubernetes 网络协议 Python
运维开发.Kubernetes探针与应用
运维开发.Kubernetes探针与应用
100 2
|
2月前
|
运维 Kubernetes 监控
自动化运维:使用Python脚本实现系统监控云原生技术实践:Kubernetes在现代应用部署中的角色
【8月更文挑战第31天】在现代IT运维管理中,自动化已成为提高效率和准确性的关键。本文将通过一个Python脚本示例,展示如何实现对服务器的自动监控,包括CPU使用率、内存占用以及磁盘空间的实时监测。这不仅帮助运维人员快速定位问题,也减轻了日常监控工作的负担。文章以通俗易懂的语言,逐步引导读者理解并实践自动化监控的设置过程。 【8月更文挑战第31天】本文旨在探索云原生技术的核心—Kubernetes,如何革新现代应用的开发与部署。通过浅显易懂的语言和实例,我们将一窥Kubernetes的强大功能及其对DevOps文化的影响。你将学会如何利用Kubernetes进行容器编排,以及它如何帮助你的
|
2月前
|
运维 Kubernetes 监控
云原生时代的运维革新:Kubernetes 在现代 IT 架构中的角色
随着云计算的不断演进,传统的运维模式已逐渐不能满足快速迭代和弹性伸缩的需求。本文将深入探讨 Kubernetes 作为容器编排工具如何引领运维领域的变革,并展示其在现代 IT 架构中的应用价值。通过实例分析,我们将了解 Kubernetes 如何优化资源管理、自动化部署和提高系统可靠性,同时指出实践中可能遇到的挑战及应对策略。
|
2月前
|
运维 Kubernetes Cloud Native
Kubernetes云原生问题之在托管Kubernetes服务中云服务商和用户的运维责任划分如何解决
Kubernetes云原生问题之在托管Kubernetes服务中云服务商和用户的运维责任划分如何解决
38 0
|
3月前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
2月前
|
弹性计算 运维 Kubernetes
云原生时代的运维革新:Kubernetes在现代IT架构中的角色
随着云计算的日益普及,传统运维模式逐渐不能满足现代企业的需求。本文将深入探讨Kubernetes如何在云原生时代重塑运维工作,包括自动化部署、弹性伸缩、服务发现等关键特性,以及它如何帮助企业实现敏捷性和效率的双重提升。
73 0
|
3月前
|
Java 测试技术 开发者
开发与运维组件问题之开发组件的时候,对于插槽中需要使用到组件上下文的情况如何解决
开发与运维组件问题之开发组件的时候,对于插槽中需要使用到组件上下文的情况如何解决