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)组件的底层状态,提供更确切的伸缩保障。如果对于运维模式有更多的建议,请提交到社区

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6月前
|
Kubernetes Java 流计算
Flink application on k8s 有没有和 session 模式通过-C 指定额外的 jar 的相同功能啊?
Flink application on k8s 有没有和 session 模式通过-C 指定额外的 jar 的相同功能啊?
89 0
|
11月前
|
弹性计算 资源调度 Kubernetes
Flink三种集群模式,Standalone模式,Flink On YARN,Flink On K8S,这三种模式有啥优缺点,生产环境如何选择呢?
Flink三种集群模式,Standalone模式,Flink On YARN,Flink On K8S,这三种模式有啥优缺点,生产环境如何选择呢?
1006 3
|
3月前
|
Kubernetes 虚拟化 网络架构
在K8S中,flannel有几种模式?
在K8S中,flannel有几种模式?
|
1月前
|
Kubernetes 负载均衡 算法
k8s学习--kube-proxy的三种工作模式详细解释
k8s学习--kube-proxy的三种工作模式详细解释
128 0
|
3月前
|
存储 Kubernetes 前端开发
k8s部署DataEase1.16.0cluster模式
k8s部署DataEase1.16.0cluster模式
|
3月前
|
存储 Kubernetes 安全
在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
|
3月前
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
91 6
|
3月前
|
Kubernetes Linux 容器
K8S中,flannel有几种模式?
K8S中,flannel有几种模式?
|
3月前
|
Kubernetes 负载均衡 监控
在K8S中,kube-proxy的工作模式是什么?
在K8S中,kube-proxy的工作模式是什么?
|
3月前
|
存储 Kubernetes 容器
在k8S中,所支持的存储供应模式有哪些?
在k8S中,所支持的存储供应模式有哪些?
下一篇
无影云桌面