一、HPA控制器介绍

当系统资源过高的时候,我们可以使用命令来实现 Pod 的扩缩容功能,但是这个过程是手动操作的。在实际项目中,我们需要做到是的是一个自动化感知并自动扩容的操作。Kubernetes 也为提供了这样的一个资源对象:Horizontal Pod Autoscaling(Pod 水平自动伸缩),简称HPA;基于CPU、内存、自定义数据(此章不实现,基于监控数据实现)进行Deployment或RC所管理的POD资源进行扩容与收缩。 HPA实现的有两个版本:

  • autoscaling/v1,只包含了根据CPU指标的检测,稳定版本
  • autoscaling/v2beta1,支持根据memory或者用户自定义指标进行伸缩

二、Metric Server的原理

1、作用

Metrics Server 作为标准的 Kubernetes API 把监控数据暴露出来的服务,比如获取某一Pod的监控数据;无论是 heapster还是 metric-server,都只是数据的中转和聚合,两者都是调用的 kubelet 的 api 接口获取的数据,而 kubelet 代码中实际采集指标的是 cadvisor 模块;cadvisor获取指标时实际调用的是 runc/libcontainer库,而libcontainer是对 cgroup文件 的封装,即 cadvsior也只是个转发者,它的数据来自于cgroup文件。 cgroup文件中的值是监控数据的最终来源,如 mem usage的值, 对于docker容器来讲,来源于/sys/fs/cgroup/memory/docker/[containerId]/memory.usage_in_bytes 对于pod来讲,/sys/fs/cgroup/memory/kubepods/besteffort/pod[podId]/memory.usage_in_bytes

2、Meteric 的数据流

三、Meteric Server安装

1、下载地址

$ wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml

2、修改相关的内容

 84       containers:
 85       - name: metrics-server
 86         image: registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6  #修改镜像
 87         imagePullPolicy: IfNotPresent
 88         args:
 89           - --cert-dir=/tmp
 90           - --secure-port=4443     
 91           - --kubelet-insecure-tls     #增加内容
 92           - --kubelet-preferred-address-types=InternalIP     #增加内容

3、安装

$ kubectl create -f components.yaml

4、验证安装结果

5、curl展示获取某个pod的CPU与内存使用数据

四、建立基于myblog项目的CPU的HPA

1、基于CPU的动态扩缩容

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-myblog-cpu
  namespace: kang           #必须与该deployment相同的命名空间
spec:
  maxReplicas: 3            #最大3个pod
  minReplicas: 1            #最小1个pod
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment        #hpa接管的资源类型,可以是RC等等等
    name: app               #必须与kind资源的名称匹配
  targetCPUUtilizationPercentage: 10      #超过10%时进行扩容

2、创建与查看

3、模拟压测

备注:如压测完成后,CPU使用率下降后,系统会自动进行缩容(每5分钟为间隔)

五、建立基于myblog项目的memory的HPA

1、yaml文件

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-demo-mem
  namespace: kang
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: app
  minReplicas: 1
  maxReplicas: 3
  metrics:
  - type: Resource
    resource:
      name: memory
      targetAverageUtilization: 30

2、创建与查看