Kubernetes Cluster AutoScaler简介

Cluster AutoScaler

Cluster AutoScaler 是一个自动扩展和收缩 Kubernetes 集群 Node 的扩展。当集群容量不足时,它会自动去 Cloud Provider (支持 GCE、GKE 和 AWS)创建新的 Node,而在 Node 长时间资源利用率很低时自动将其删除以节省开支。

Cluster AutoScaler 独立于 Kubernetes 主代码库,维护在 <https://github.com/kubernetes/autoscaler&gt;。

部署

Cluster AutoScaler v1.0+ 可以基于 Docker 镜像 gcr.io/google_containers/cluster-autoscaler:v1.0.0 来部署,详细的部署步骤可以参考

比如 Azure 中的部署方式为

apiVersion: v1
data:
  ClientID: <client-id>
  ClientSecret: <client-secret>
  ResourceGroup: <resource-group>
  SubscriptionID: <subscription-id>
  TenantID: <tenand-id>
  ScaleSetName: <scale-set-name>
kind: ConfigMap
metadata:
  name: cluster-autoscaler-azure
  namespace: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: cluster-autoscaler
  namespace: kube-system
  labels:
    app: cluster-autoscaler
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cluster-autoscaler
  template:
    metadata:
      labels:
        app: cluster-autoscaler
    spec:
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
      nodeSelector:
        kubernetes.io/role: master
      containers:
      - image: gcr.io/google_containers/cluster-autoscaler:{{ca_version}}
        name: cluster-autoscaler
        resources:
          limits:
            cpu: 100m
            memory: 300Mi
          requests:
            cpu: 100m
            memory: 300Mi
        env:
        - name: ARM_SUBSCRIPTION_ID
          valueFrom:
            configMapKeyRef:
              name: cluster-autoscaler-azure
              key: SubscriptionID
        - name: ARM_RESOURCE_GROUP
          valueFrom:
            configMapKeyRef:
              name: cluster-autoscaler-azure
              key: ResourceGroup
        - name: ARM_TENANT_ID
          valueFrom:
            configMapKeyRef:
              name: cluster-autoscaler-azure
              key: TenantID
        - name: ARM_CLIENT_ID
          valueFrom:
            configMapKeyRef:
              name: cluster-autoscaler-azure
              key: ClientID
        - name: ARM_CLIENT_SECRET
          valueFrom:
            configMapKeyRef:
              name: cluster-autoscaler-azure
              key: ClientSecret
        - name: ARM_SCALE_SET_NAME
          valueFrom:
            configMapKeyRef:
              name: cluster-autoscaler-azure
              key: ScaleSetName
        command:
          - ./cluster-autoscaler
          - --v=4
          - --cloud-provider=azure
          - --skip-nodes-with-local-storage=false
          - --nodes="1:10:$(ARM_SCALE_SET_NAME)"
        volumeMounts:
          - name: ssl-certs
            mountPath: /etc/ssl/certs/ca-certificates.crt
            readOnly: true
        imagePullPolicy: "Always"
      volumes:
      - name: ssl-certs
        hostPath:
          path: "/etc/ssl/certs/ca-certificates.crt"

工作原理

Cluster AutoScaler 定期(默认间隔 10s)检测是否有充足的资源来调度新创建的 Pod,当资源不足时会调用 Cloud Provider 创建新的 Node。

Kubernetes Cluster AutoScaler简介

为了自动创建和初始化 Node,Cluster Autoscaler 要求 Node 必须属于某个 Node Group,比如

  • GCE/GKE 中的 Managed instance groups(MIG)
  • AWS 中的 Autoscaling Groups
  • Azure 中的 Scale Sets 和 Availability Sets

当集群中有多个 Node Group 时,可以通过 --expander=&lt;option&gt; 选项配置选择 Node Group 的策咯,支持如下四种方式

  • random:随机选择
  • most-pods:选择容量最大(可以创建最多 Pod)的 Node Group
  • least-waste:以最小浪费原则选择,即选择有最少可用资源的 Node Group
  • price:选择最便宜的 Node Group(仅支持 GCE 和 GKE)

目前,Cluster Autoscaler 可以保证

  • 小集群(小于 100 个 Node)可以在不超过 30 秒内完成扩展(平均 5 秒)
  • 大集群(100-1000 个 Node)可以在不超过 60 秒内完成扩展(平均 15 秒)

Cluster AutoScaler 也会定期(默认间隔 10s)自动监测 Node 的资源使用情况,当一个 Node 长时间(超过 10 分钟其期间没有执行任何扩展操作)资源利用率都很低时(低于 50%)自动将其所在虚拟机从云服务商中删除(注意删除时会有 1 分钟的 graceful termination 时间)。此时,原来的 Pod 会自动调度到其他 Node 上面(通过 Deployment、StatefulSet 等控制器)。

Kubernetes Cluster AutoScaler简介

注意,Cluster Autoscaler 仅根据 Pod 的调度情况和 Node 的整体资源使用清空来增删 Node,跟 Pod 或 Node 的资源度量(metrics)没有直接关系。

用户在启动 Cluster AutoScaler 时可以配置 Node 数量的范围(包括最大 Node 数和最小 Node 数)。

在使用 Cluster AutoScaler 时需要注意:

  • 由于在删除 Node 时会发生 Pod 重新调度的情况,所以应用必须可以容忍重新调度和短时的中断(比如使用多副本的 Deployment)
  • 当 Node 上面的 Pods 满足下面的条件之一 时,Node 不会删除
    • Pod 配置了 PodDisruptionBudget (PDB)
    • kube-system Pod 默认不在 Node 上运行或者未配置 PDB
    • Pod 不是通过 deployment, replica set, job, stateful set 等控制器创建的
    • Pod 使用了本地存储
    • 其他原因导致的 Pod 无法重新调度,如资源不足,其他 Node 无法满足 NodeSelector 或 Affinity 等

最佳实践

  • Cluster AutoScaler 可以和 Horizontal Pod Autoscaler(HPA)配合使用
  • 不要手动修改 Node 配置,保证集群内的所有 Node 有相同的配置并属于同一个 Node 组
  • 运行 Pod 时指定资源请求
  • 必要时使用 PodDisruptionBudgets 阻止 Pod 被误删除
  • 确保云服务商的配额充足
  • Cluster AutoScaler 与云服务商提供的 Node 自动扩展功能以及基于 CPU 利用率的 Node 自动扩展机制冲突,不要同时启用

参考文档

原文链接:
https://github.com/feiskyer/kubernetes-handbook/blob/master/en/addons/cluster-autoscaler.md

转载于:https://blog.51cto.com/dangzhiqiang/2140938

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值