cluster-proportional-autoscaler小记

2022-11-09 23:08:23 浏览数 (1)

组件功能

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

实现方案

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

ConfigMap配置示例和计算方式

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

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

Linear(线性模式)

配置示例
代码语言:yaml复制
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复制
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复制
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复制
  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复制
# 创建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复制
helm repo add cluster-proportional-autoscaler https://kubernetes-sigs.github.io/cluster-proportional-autoscaler
helm repo update

安装组件

代码语言:txt复制
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

0 人点赞