概述
我们已经可以通过手动执行 kubectl scale
命令实现Pod的扩缩容,但是这显然不符合 Kubernetes 的定位目标–自动化和智能化。Kubernetes 期望可以通过监测Pod的使用情况,实现 Pod 数量的自动调整,于是就产生了 HPA 这种控制器。
HPA(Horizontal Pod Autoscaler) 可以获取每个 Pod 的利用率,然后和 HPA 中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现 Pod 的数量的调整。其实 HPA 和之前的 Deployment 一样,也属于一种 Kubernetes 资源对象,它通过追踪分析目标Pod的负载变化情况,来确定是否需要针对性的调整目标 Pod 的副本数。
通常用于 Deployment,不适用于无法扩/缩容的对象,如 DaemonSet
特点:
- 控制管理器每隔30s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
- 支持三种metrics类型
- 预定义metrics(比如Pod的CPU)以利用率的方式计算
- 自定义的Pod metrics,以原始值(raw value)的方式计算
- 自定义的object metrics
- 支持两种metrics查询方式:Heapster和自定义的REST API
- 支持多metrics
安装metrics-server
metrics-server是用来监控k8s资源指标的组件,需要额外安装。
- 下载 metrics-server 组件配置文件:
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
- 修改镜像地址为国内的地址
sed -i 's/k8s.gcr.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
- 修改容器的 tls 配置,不验证 tls
在 containers 的 args 参数中增加 --kubelet-insecure-tls 参数
- 安装组件
kubectl apply -f metrics-server-components.yaml
查看下安装是否成功:
kubectl get po --all-namespaces | grep metrics
# 结果如下
kube-system metrics-server-7c6df44c98-fmm62 1/1 Running 0 65s
成功安装到了kube-system 下。
使用HPA
实现 cpu 或内存的监控,首先有个前提条件是该对象必须配置了 resources.requests.cpu
或 resources.requests.memory
才可以,可以配置当 cpu/memory 达到上述配置的百分比后进行扩容或缩容。
新建nginx-hpa.yaml,添加资源配置,文件如下:
apiVersion: apps/v1 # deployment api 版本
kind: Deployment # 资源类型为deployment
metadata: # 元信息
labels: # 标签
app: nginx-hpa
name: nginx-hpa # deployment的名字
namespace: default # 所在命名空间
spec:
replicas: 3 # 期望副本数
revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数
selector: # 选择器,用于找到匹配的RS,管理指定标签的Rs
matchLabels: # 按照标签匹配
app: nginx-hpa # 匹配的标签
strategy: # 更新策略
rollingUpdate: # 滚动更新配置
maxSurge: 25% # 进行滚动更新时,更新的个数超过期望副本数的比例
maxUnavailable: 25% # 进行滚动更新时,最大不可用更新比例,也就是更新不成功最多能有多少个
type: RollingUpdate # 更新策略采用滚动更新
template: # pod模板
metadata: # pod的元信息
labels: # pod的标签
app: nginx-hpa
spec: # pod的描述信息
containers: # pod的描述信息
- image: nginx:1.7.9 # pod使用镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略
name: nginx # 容器名称
resources:
limits:
cpu: 200m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
restartPolicy: Always # 重启策略
terminationGracePeriodSeconds: 30 # 容器删除等待时间
部署一下:
kubectl apply -f nginx-hpa.yaml
# deployment.apps/nginx-hpa created
查看下po:
kubectl get po
# 3个pod如下
NAME READY STATUS RESTARTS AGE
nginx-hpa-5465c4859b-85jtv 1/1 Running 0 41s
nginx-hpa-5465c4859b-crlr7 1/1 Running 0 41s
nginx-hpa-5465c4859b-k7h64 1/1 Running 0 41s
接着可以使用top命令查看资源使用情况:
kubectl top po
# 3个pod的cpu和MEMORY使用情况如下
NAME CPU(cores) MEMORY(bytes)
nginx-hpa-5465c4859b-85jtv 0m 7Mi
nginx-hpa-5465c4859b-crlr7 0m 8Mi
nginx-hpa-5465c4859b-k7h64 0m 14Mi
然后需要创建出一个HPA才能实现自动扩容缩容。
使用如下命令创建一个HPA:
kubectl autoscale deploy nginx-hpa --cpu-percent=20 --min=2 --max=5
# --cpu-percent=20即cpu使用率超过20%进行扩容
# 最少有2个副本,最多扩容到5个
# 注意:如果初始副本数少于2个,那么一旦HPA部署完成,就会把pod扩容到2个
查看HPA:
kubectl get hpa
# 结果如下
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-hpa Deployment/nginx-hpa <unknown>/20% 2 5 0 19s
可以看下TARGETS,前面unknown表示还没有占用,后面的20% 标识目标是20%就扩容。
可以通过一定手段,是cpu使用率达到20% ,这样就会自动扩容,这里不在演示。