Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >cluster-proportional-autoscaler小记

cluster-proportional-autoscaler小记

原创
作者头像
铜锣烧
修改于 2022-11-09 15:08:23
修改于 2022-11-09 15:08:23
7560
举报

组件功能

此组件监视集群的可调度节点和核心的数量,并调整所需资源的副本数量。对于需要随集群大小自动扩展的应用程序,例如 DNS 和其他随集群中节点/pod 数量扩展的服务。

实现方案

通过使用核心和节点的数量作为所选控制器的输入来计算所需的副本数量。目前支持linear(线性模式)ladder(阶梯模式)两种控制模式。

ConfigMap配置示例和计算方式

ConfigMap 提供配置参数,允许即时更改(包括控制模式),而无需重建或重新启动cluster-proportional-autoscaler组件的pod。

ConfigMap 中的参数必须是 JSON,并且使用 linear 或ladder作为 key。

Linear(线性模式)

配置示例
代码语言:yaml
AI代码解释
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: linear-example
data:
  linear: |-
    {
      "coresPerReplica": 2,
      "nodesPerReplica": 1,
      "min": 1,
      "max": 100,
      "preventSinglePointFailure": true,
      "includeUnschedulableNodes": true
    }
  • coresPerReplicanodesPerReplica 可以均配置,也可以二选一。
  • minmax必须都要配置。
  • preventSinglePointFailureincludeUnscheduleableNodes均为可选配置,如果不设置,默认值均为false,且最小副本数根据min的配置,可以是1。
  • preventSinglePointFailure 设置为 true 时,如果有多个节点,控制器会确保至少 2 个副本。
  • includeUnschedulableNodes 设置为 true 时,副本将根据节点总数进行扩展。否则,副本将仅根据可调度节点的数量进行扩展(即不包括封锁和驱逐的节点。)
计算方式
代码语言:txt
AI代码解释
复制
replicas = max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) )
replicas = min(replicas, max)
replicas = max(replicas, min)

例如,给定一个集群有 4 个节点和 13 个核心。使用上述参数,"coresPerReplica": 2表示每个副本可以处理 2 个核心,我们需要 ceil(13 / 2) = 7 个副本来处理所有 13 个核心。"nodesPerReplica": 1表示每个副本可以处理 1 个节点,所以我们需要 4 / 1 = 4 个副本来处理所有 4 个节点。控制器将选择较大的一个,这里是 7,作为结果。

ladder(阶梯模式)

配置示例
代码语言:yaml
AI代码解释
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: ladder-example
data:
  ladder: |-
    {
      "coresToReplicas":
      [
        [ 1, 1 ],   #格式为 [核心数,期望副本数],下同
        [ 64, 3 ],
        [ 512, 5 ],
        [ 1024, 7 ],
        [ 2048, 10 ],
        [ 4096, 15 ]
      ],
      "nodesToReplicas":
      [
        [ 1, 1 ],   #格式为 [节点数,期望副本数],下同
        [ 2, 2 ]
      ]
    }
  • coresToReplicasnodesToReplicas 可以均配置,也可二选一。其中的所有元素都应该是 int。
  • 副本可以设置为 0(与线性模式不同)。例如当节点为0时,组件数为0,当到达6个时为1。
代码语言:yaml
AI代码解释
复制
  data:
    ladder: |-
      {
        "nodesToReplicas":
        [
          [ 0, 0 ],
          [ 6, 1 ]
        ]
      }
计算方式

阶梯模式通过使用阶梯函数(不知道该怎么翻译,原文是step function)给出所需的副本数。阶梯函数使用来自 ConfigMap 的配置的核心、节点和副本数的关系来进行pod副本数伸缩。

例如:给定一个集群有 100 个节点和 400 个核心。使用上述参数,coresToReplicas计算的副本将是 3(因为 64 < 400 < 512),nodesToReplicas计算的副本数是 2 (因为 100 > 2)。结果取大,则为 3。

和HPA(Horizontal Pod Autoscaler)功能的比较

Horizontal Pod Autoscaler通过配置metrics的目标值,并监控该metrcis的值来进行比对,以便让pod根据资源负载的情况进行动态的扩所容。

cluster-proportional-autoscaler通过configmap的配置,即可进行简单的缩放,这里只需关注集群中节点、核心数,和目标副本数的关系即可。

参考文档

https://github.com/kubernetes-sigs/cluster-proportional-autoscaler

实验示例

直接部署

参考官网示例,可在此文档找到

https://github.com/kubernetes-sigs/cluster-proportional-autoscaler/tree/master/examples

代码语言:yaml
AI代码解释
复制
# 创建RBAC和SA,以便组件能够正常请求集群
kind: ServiceAccount
apiVersion: v1
metadata:
  name: cluster-proportional-autoscaler-example
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cluster-proportional-autoscaler-example
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["list", "watch"]
  - apiGroups: [""]
    resources: ["replicationcontrollers/scale"]
    verbs: ["get", "update"]
  - apiGroups: ["extensions","apps"]
    resources: ["deployments/scale", "replicasets/scale"]
    verbs: ["get", "update"]
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get", "create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cluster-proportional-autoscaler-example
subjects:
  - kind: ServiceAccount
    name: cluster-proportional-autoscaler-example
    namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-proportional-autoscaler-example
  apiGroup: rbac.authorization.k8s.io
  
#创建configmap,写明期望的扩缩容规则
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-autoscaler
  namespace: default
data:
  ladder: |-
    {
      "coresToReplicas":
      [
        [ 1,1 ],
        [ 3,3 ],
        [ 512,5 ],
        [ 1024,7 ],
        [ 2048,10 ],
        [ 4096,15 ],
        [ 8192,20 ],
        [ 12288,30 ],
        [ 16384,40 ],
        [ 20480,50 ],
        [ 24576,60 ],
        [ 28672,70 ],
        [ 32768,80 ],
        [ 65535,100 ]
      ],
      "nodesToReplicas":
      [
        [ 1,1 ],
        [ 2,2 ]
      ]
    }

# 创建业务pod,这里示例是nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-autoscale-example
  namespace: default
spec:
  selector:
    matchLabels:
      run: nginx-autoscale-example
  replicas: 1
  template:
    metadata:
      labels:
        run: nginx-autoscale-example
    spec:
      containers:
      - name: nginx-autoscale-example
        image: nginx
        ports:
        - containerPort: 80

# 创建autoscaler监控组件,以便根据核心和节点数,扩缩容业务pod
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-autoscaler
  namespace: default
  labels:
    app: autoscaler
spec:
  selector:
    matchLabels:
      app: autoscaler
  replicas: 1
  template:
    metadata:
      labels:
        app: autoscaler
    spec:
      containers:
        - image: gcr.io/google_containers/cluster-proportional-autoscaler-amd64:1.8.1
          name: autoscaler
          command:
            - /cluster-proportional-autoscaler
            - --namespace=default  # 监控的命名空间
            - --configmap=nginx-autoscaler  # 使用的configmap配置
            - --target=deployment/nginx-autoscale-example  # 监控的资源
            - --logtostderr=true
            - --v=2
      serviceAccountName: cluster-proportional-autoscaler-example  # 使用的SA

helm方式部署

添加 cluster-proportional-autoscaler Helm 存储库

代码语言:txt
AI代码解释
复制
helm repo add cluster-proportional-autoscaler https://kubernetes-sigs.github.io/cluster-proportional-autoscaler
helm repo update

安装组件

代码语言:txt
AI代码解释
复制
helm upgrade --install cluster-proportional-autoscaler \
    cluster-proportional-autoscaler/cluster-proportional-autoscaler \
    --values <<name_of_your_values_file>>.yaml

<<name_of_your_values_file>>.yaml为您指定的value.yaml配置,默认的value.yaml可参考官网:charts default values file

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
cluster-proportional-autoscaler源码分析及如何解决KubeDNS性能瓶颈
Author: xidianwangtao@gmail.com 工作机制 cluster-proportional-autoscaler是kubernetes的孵化项目之一,用来根据集群规模动态的扩缩容指定的namespace下的target(只支持RC, RS, Deployment),还不支持对StatefulSet。目前只提供两种autoscale模式,一种是linear,另一种是ladder,你能很容易的定制开发新的模式,代码接口非常清晰。 cluster-proportional-autoscal
Walton
2018/04/16
1.6K0
「走进k8s」Kubernetes1.15.1的持久化存储StorageClass(32)
1.自动创建的 PV 以${namespace}-${pvcName}-${pvName}这样的命名格式创建在 NFS 服务器上的共享数据目录中。2.而当这个 PV 被回收后会以archieved-${namespace}-${pvcName}-${pvName}这样的命名格式存在 NFS 服务器上。3.下面的yaml涉及到3个yaml文件,都是参考github里面配置来的
IT架构圈
2019/09/08
8620
【云原生 | Kubernetes篇】深入了解Deployment(八)
Deployment控制RS,RS控制Pod的副本数 ReplicaSet: 只提供了副本数量的控制功能 Deployment: 每部署一个新版本就会创建一个新的副本集,利用他记录状态,回滚也是直接让指定的rs生效
Lansonli
2022/06/11
4410
【云原生 | Kubernetes篇】深入了解Deployment(八)
Prometheus监控神器-Kubernetes篇(一)
本篇使用StorageClass来持久化数据,搭建Statefulset的Prometheus联邦集群,对于数据持久化,方案众多,如Thanos、M3DB、InfluxDB、VictorMetric等,根据自己的需求进行选择,后面会详细讲解针对数据持久化的具体细节。
Kubernetes技术栈
2020/09/09
2K0
k8s之RBAC授权模式
基于角色的访问控制,启用此模式,需要在API Server的启动参数上添加如下配置,(k8s默然采用此授权模式)。
Liusy
2020/11/19
1.4K0
k8s之RBAC授权模式
K8s 安装
如果你的节点上面有科学上网的工具,可以忽略这一步,我们需要提前将所需的gcr.io上面的镜像下载到节点上面,当然前提条件是你已经成功安装了docker。
分母为零
2019/07/04
1.8K0
K8s 安装
ingress高可用
介绍 Ingress由两部分组成:Ingress Controller 和 Ingress 服务。
院长技术
2020/06/13
2.4K0
使用kubeadm快速部署一个K8s集群
Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。
鱼找水需要时间
2023/08/03
1K0
使用kubeadm快速部署一个K8s集群
Prometheus监控神器-Kubernetes篇(二)
本篇使用StorageClass来持久化数据,搭建Statefulset的Grafana,并且在Dashboard导入前配置前面已经创建好的Prometheus的集群内部访问地址,同时配置ingress-nginx外部访问。
Kubernetes技术栈
2020/09/09
8660
Kubernetes运维之容器编排Deployment动态扩缩容
HPA(Horizontal Pod Autoscaler)的实现是一个控制循环,由controller manager的–horizontal-pod-autoscaler-sync-period参数指定周期(默认值为15秒)。每个周期内,controller manager根据每个HorizontalPodAutoscaler定义中指定的指标查询资源利用率。controller manager可以从resource metrics API(pod 资源指标)和custom metrics API(自定义指标)获取指标。
王先森sec
2023/04/24
1.2K0
Kubernetes运维之容器编排Deployment动态扩缩容
Kubernetes-基于RBAC的授权
在Kubernetes中,授权有ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、Webhook、Node、AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式。从1.6版本起,Kubernetes 默认启用RBAC访问控制策略。从1.8开始,RBAC已作为稳定的功能。通过设置–authorization-mode=RBAC,启用RABC。在RABC API中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。
kubernetes中文社区
2019/06/24
8720
Kubernetes-基于RBAC的授权
coredns_coredns配置域名
网上的coredns.yaml文档都是粘贴复制的,不知所以然,授人以鱼不如授人以渔,官方coredns yaml文件下载地址:https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base
全栈程序员站长
2022/11/01
1.1K0
k8s中负载均衡器【ingress-nginx】部署
在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes 目前 提供了以下几种方案:
我的小碗汤
2019/07/30
4.5K0
使用 vmagent 代替 Prometheus 采集监控指标
vmagent 可以帮助我们从各种来源收集指标并将它们存储在 VM 或者任何其他支持 remote write 协议的 Prometheus 兼容的存储系统中。
我是阳明
2022/05/22
3.6K0
使用 vmagent 代替 Prometheus 采集监控指标
Kubernetes 部署 Nebula 图数据库集群
Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
NebulaGraph
2020/02/26
1.1K0
Kubernetes 部署 Nebula 图数据库集群
十分钟搭建好K8S集群
虽然网上有大量从零搭建K8S的文章,但大都针对老版本,若直接照搬去安装最新的1.20版本会遇到一堆问题。故此将我的安装步骤记录下来,希望能为读者提供copy and paste式的集群搭建帮助。
陶辉
2020/12/23
1K0
十分钟搭建好K8S集群
Kubernetes实战之部署ELK Stack收集平台日志
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。
没有故事的陈师傅
2019/12/11
5.6K0
ASP.NET Core on K8S深入学习(12)Ingress
本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。
Edison Zhou
2020/05/11
1K0
ASP.NET Core on K8S深入学习(12)Ingress
入门K8s:一键脚本搭建Linux服务器集群
好久没有写系列博客了,本文主要是对网上文章的总结篇,主要是将安装和运行代码做了一次真机实验,亲测可用。文章内包含的脚本和代码,多来自于网络,也有我自己的调整和配置,文章末尾对参考的文献做了列举,方便大家参考。
老张的哲学
2022/04/11
1.6K0
【云原生 | Kubernetes篇】深入了解Ingress(十二)
这是nginx官方做的,适配k8s的,分为开源版和nginx plus版(收费)。
Lansonli
2022/06/15
6270
【云原生 | Kubernetes篇】深入了解Ingress(十二)
相关推荐
cluster-proportional-autoscaler源码分析及如何解决KubeDNS性能瓶颈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档