Kubernetes 弹性伸缩全场景解析 (四)- 让核心组件充满弹性

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: #### 前言 在本系列的前三篇中,我们介绍了弹性伸缩的整体布局以及HPA的一些原理,HPA的部分还遗留了一些内容需要进行详细解析。在准备这部分内容的期间,会穿插几篇弹性伸缩组件的最佳实践。今天我们要讲解的是 **cluster-proportional-autoscaler** 。

前言

在本系列的前三篇中,我们介绍了弹性伸缩的整体布局以及HPA的一些原理,HPA的部分还遗留了一些内容需要进行详细解析。在准备这部分内容的期间,会穿插几篇弹性伸缩组件的最佳实践。今天我们要讲解的是

cluster-proportional-autoscalercluster-proportional-autoscaler是根据集群中节点的数目进行Pod副本数水平伸缩的组件,这个组件的产生主要是为了解决集群的核心组件负载弹性的问题。在一个Kubernetes集群中,除了APIServer等耳熟能详的Control Pannel组件,还有很多系统组件是部署在worker上的,例如CoreDNSIngress ControllerIstio等等。这些核心组件大部分和我们的应用接入层息息相关,也就是说每当我们的系统处理了一条外部的请求,可能都会调用这些组件。那么这就有可能由于这些组件的负载过大,造成应用的QPS达到瓶颈。那么一个集群该运行多少个核心组件副本呢?

很遗憾,这个问题是没有统一答案的,因为不同的类型的应用、不同的网络模型、不同的调度分布,都有可能会带来不同的挑战。在本篇文章中,我们不谈具体的指标和数据,只探讨解法。在本系列后面的文章中,会为大家深入解析。

大部分的情况下,核心组件的副本数目和集群的节点数目是成正比的,一个集群的节点数目越多,核心组件所需要的副本数就越多。今天我们以CoreDNS为例,通过cluster-proportional-autoscaler,来实现一个动态的、基于节点数目的核心组件动态伸缩。

cluster-proportional-autoscaler的使用

cluster-proportional-autoscaler和传统的Kubernetes组件设计有所不同,我们已经见惯了各种ControllerCRD或者Operator,而cluster-proportional-autoscaler走了另外一条非常简单的路。使用cluster-proportional-autoscaler只需要部署一个Yaml并选择一个伸缩的监听对象以及伸缩策略即可。如果需要有多个组件进行伸缩,那就部署多个Yaml,每个Yaml包含一个cluster-proportional-autoscaler。一个使用cluster-proportional-autoscaler弹性伸缩coredns的模板如下。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dns-autoscaler
  namespace: kube-system
  labels:
    k8s-app: dns-autoscaler
spec:
  selector:
    matchLabels:
       k8s-app: dns-autoscaler
  template:
    metadata:
      labels:
        k8s-app: dns-autoscaler
    
    spec:
      serviceAccountName: admin
      containers:
      - name: autoscaler
        image: registry.cn-hangzhou.aliyuncs.com/ringtail/cluster-proportional-autoscaler-amd64:v1.3.0
        resources:
            requests:
                cpu: "200m"
                memory: "150Mi"
        command:
          - /cluster-proportional-autoscaler
          - --namespace=kube-system
          - --configmap=dns-autoscaler
          - --target=Deployment/coredns
          - --default-params={"linear":{"coresPerReplica":16,"nodesPerReplica":2,"min":1,"max":100,"preventSinglePointFailure":true}}
          - --logtostderr=true
          - --v=2
         
        

cluster-proportional-autoscaler的伸缩策略主要有两种,一种是线性模型,一种是梯度模型。

简单的理解,线性模型就是 y = rate * x + min,设置最小值,以及伸缩的区间,并根据当前节点的数目,通过线性模型计算所需的核心组件数目。在上面的例子中,我们用的就是线性模型,线性模型支持的配置参数如下:

{
      "coresPerReplica": 2,
      "nodesPerReplica": 1,
      "min": 1,
      "max": 100,
      "preventSinglePointFailure": true
}

minmax、以及preventSinglePointFailure都比较好理解,coresPerReplica的意思是按照核心数目来计算副本集,nodesPerReplica是按照节点数目来计算副本集。用一个实际的例子进行举例,例如当前集群有两个节点,每个节点的配置是4C8G,那么如果按照coresPerReplica这个指标计算,则需要弹出4*2/2=4个副本。如果按照nodesPerReplica来计算,则需要弹出2*1 = 2个副本。此时cluster-proportional-autoscaler会取两者之间的大的数值,也就是4作为最后的伸缩数目进行扩容。

梯度模型就是分级的机制,每个梯度对应了一个副本,例如:

{
      "coresToReplicas":
      [
        [ 1, 1 ],
        [ 64, 3 ],
        [ 512, 5 ],
        [ 1024, 7 ],
        [ 2048, 10 ],
        [ 4096, 15 ]
      ],
      "nodesToReplicas":
      [
        [ 1, 1 ],
        [ 2, 2 ]
      ]
    }

这个配置表示存在coresToReplicasnodesToReplicas两个梯度,其中coresToReplicas的梯度表示,最小为1个副本;CPU核心数目大于3小于64的时候,为2个副本;依次类推。同样nodesToReplicas表示1个节点的时候为1个副本,2个节点的时候为2个副本。

最后

至此,cluster-proportional-autoscaler的使用就给大家讲解完了,建议优先配置CoreDNS的autoscaler,对于负载不高的场景可以考虑节点副本1:2的比例,如果负载比较高,可以1:1的配置进行配置。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
存储 Kubernetes 负载均衡
Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(下)
本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。
|
3月前
|
存储 Kubernetes 监控
K8S核心组件介绍
K8S核心组件介绍
|
6月前
|
Kubernetes 容器
使用Kubeadm部署K8s集群获取kube-scheduler和kube-controller-manager组件状态异常问题
使用Kubeadm部署K8s集群获取kube-scheduler和kube-controller-manager组件状态异常问题
|
6月前
|
Prometheus Kubernetes 监控
prometheus operator监控k8s集群之外的haproxy组件
prometheus operator监控k8s集群之外的haproxy组件
|
6月前
|
存储 Kubernetes Cloud Native
【云原生】k8s组件&架构介绍与K8s最新版部署
【云原生】k8s组件&架构介绍与K8s最新版部署
173 0
|
6月前
|
存储 Kubernetes 监控
基于Kubernetes的电商平台部署:实现高可用、弹性伸缩与容器化管理
基于Kubernetes的电商平台部署:实现高可用、弹性伸缩与容器化管理
|
1月前
|
Kubernetes API 调度
Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(上)
本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。
|
6月前
|
Kubernetes 负载均衡 调度
kubernetes概述-介绍、组件、架构
kubernetes概述-介绍、组件、架构
kubernetes概述-介绍、组件、架构
|
8月前
|
容器
阿里云最新产品手册——云基础产品与基础设施——计算——弹性容器实例——通用部署ACK虚拟节点组件创建ECI Pot——ECI Pot——特殊实例
阿里云最新产品手册——云基础产品与基础设施——计算——弹性容器实例——通用部署ACK虚拟节点组件创建ECI Pot——ECI Pot——特殊实例自制脑图
353 4
|
8月前
|
容器
阿里云最新产品手册——云基础产品与基础设施——计算——弹性容器实例——通用部署ACK虚拟节点组件创建ECI Pot——ECI Pot——创建ECI Pot
阿里云最新产品手册——云基础产品与基础设施——计算——弹性容器实例——通用部署ACK虚拟节点组件创建ECI Pot——ECI Pot——创建ECI Pot自制脑图
302 1

热门文章

最新文章

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多