前言
弹性伸缩是开发者使用容器过程中非常关注的特性, 如果从资源类型的角度来讲, 可以分为物理资源的弹性伸缩与容器资源的弹性伸缩. 在本篇中, 主要向大家介绍的是容器资源的弹性伸缩, 在 Kubernetes 中, HPA(Horizontal Pod Autoscaling)是用来抽象容器水平弹性伸缩的概念. 开发者可以通过定义 HPA 的 yaml 配置, 快速实现容器水平伸缩.
原理
在 Kubernetes 中, Pod 的负载是通过 Heapster 进行采集的 (新版本中可以通过 Metrics Server 进行采集),HPA Controller 通过定期(定期轮询的时间通过 - horizontal-pod-autoscaler-sync-period 选项来设置, 默认的时间为 30 秒) 查询 Pod 当前系统的负载来自动水平扩容, 如果系统负载超过预定值, 就开始增加 Pod 的个数, 如果低于某个值, 就自动减少 Pod 的个数.
使用方式
下面我们针对一个 Nginx 应用进行举例:
- apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
- kind: Deployment
- metadata:
- name: nginx
- labels:
- app: nginx
- spec:
- replicas: 2
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.7.9 # replace it with your exactly <image_name:tags>
- ports:
- - containerPort: 80
- resources:
- requests:
- cpu: 500m
创建 HPA, 通过 scaleTargetRef 设置当前 HPA 绑定的对象, 在本例中绑定是名叫 nginx 的 Deployment.
- apiVersion: autoscaling/v2beta1
- kind: HorizontalPodAutoscaler
- metadata:
- name: nginx-hpa
- namespace: default
- spec:
- scaleTargetRef:
- apiVersion: apps/v1beta2
- kind: Deployment
- name: nginx
- minReplicas: 1
- maxReplicas: 10
- metrics:
- - type: Resource
- resource:
- name: cpu
- targetAverageUtilization: 50
注意: HPA 需要给 Pod 设置 request 资源, 如果没有 request 资源, HPA 是不会运行的,
kubectl describe hpa [name]
会发现有类似如下的 warnning.
- Warning FailedGetResourceMetric 2m (x6 over 4m) horizontal-pod-autoscaler missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5897-mqzs7
- Warning FailedComputeMetricsReplicas 2m (x6 over 4m) horizontal-pod-autoscaler failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5
创建好 HPA 后, 我们再次执行
kubectl describe hpa [name]
命令, 可以看到如下信息, 则表示 HPA 已经正常运行.
Normal SuccessfulRescale 39s horizontal-pod-autoscaler New size: 1; reason: All metrics below target
此时当 Nginx 的 Pod 的利用率超过如上图所示的 50% 的利用率时, 则会进行水平扩容, 低于 50% 的时候会进行缩容.
使用容器服务部署支持 HPA 的 Deployment
在阿里云容器服务中, 已经集成了 HPA, 开发者可以非常简单的通过 UI 进行创建.
点击左侧菜单的部署, 选择镜像创建.
填写应用的名称和相应的配置信息, 设置资源的所需资源.
勾选自动伸缩的开启, 设置伸缩的条件和配置.
此时一个支持 HPA 的 Deployment 就已经创建完毕了, 可以在部署的详情中查看伸缩组信息.
验证弹性伸缩, 通过给 Pod 进行 CPU 压测, 可以发现 Pod 在半分钟内即可完成水平的扩展.
最后
HPA 是 Kubernetes 中最常使用的伸缩方式, 除此之外, HPA 还可以结合 autoscaler 同时使用, 当 HPA 弹出的容器无法进行调度的时候, autoscaler 会自动弹出节点, 并将 HPA 所期望的容器运行在弹出的节点上. 关于 autoscaler 的部分, 可以参考阿里云上弹性伸缩 kubernetes 集群 - autoscaler.
来源: https://yq.aliyun.com/articles/607845