kubernetes基于Metrics Server的HPA弹性伸缩pod

概念

HPA是kubernetes里面pod弹性伸缩的实现,它能根据设置的监控阀值进行pod的弹性扩缩容,目前默认HPA只能支持cpu和内存的阀值检测扩缩容,但也可以通过custom metric api 调用prometheus实现自定义metric 来更加灵活的监控指标实现弹性伸缩。但hpa不能用于伸缩一些无法进行缩放的控制器如DaemonSet。这里我们用的是resource metric api.

在这里插入图片描述

实现hpa的两大关键

1、监控指标的获取
早期kubernetes版本是使用hepster,在1.10后面版本更推荐使用metric-server

hepster简单来说是api-server获取节点信息,然后通过kubelet获取监控信息,因为kubelet内置了cadvisor。

metric-server,简单来说是通过metric-api来获取节点信息和监控信息。https://github.com/kubernetes-incubator/metrics-server

2、伸缩判定算法
HPA通过定期(定期轮询的时间通过–horizontal-pod-autoscaler-sync-period选项来设置,默认的时间为30秒)查询pod的状态,获得pod的监控数据。然后,通过现有pod的使用率的平均值跟目标使用率进行比较。
pod的使用率的平均值:
监控资源1分钟使用的平均值/设定的每个Pod的request资源值

扩容的pod数计算公式

TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)

celi函数作用:

返回大于或者等于指定表达式的最小整数

在每次扩容和缩容时都有一个窗口时间,在执行伸缩操作后,在这个窗口时间内,不会在进行伸缩操作,可以理解为类似等一下放技能的冷却时间。默认扩容为3分钟(–horizontal-pod-autoscaler-upscale-delay),缩容为5分钟(–horizontal-pod-autoscaler-downscale-delay)。另外还需要以下情况下才会进行任何缩放avg(CurrentPodsConsumption)/ Target下降9%,进行缩容,增加至10%进行扩容。以上两条件需要都满足。

这样做好处是:

  1. 判断的精度高,不会频繁的扩缩pod,造成集群压力大。
  2. 避免频繁的扩缩pod,防止应用访问不稳定。

在这里插入图片描述

实现hpa的条件:

  1. hpa不能autoscale daemonset类型control
  2. 要实现autoscale,pod必须设置request

配置HPA

这里以kubeadm 部署和的kubernetes 1.11和Rancher2.0部署的kubernetes 1.10为例
环境信息

操作系统:Centos 7.5
kubernetes版本:v1.14.6

kubeadm方式

将metric-server从github拉取下来

git clone [email protected]:kubernetes-incubator/metrics-server.git
或者手动下载到本地再上传到主机
https://github.com/kubernetes-incubator/metrics-server

早期kubelet的10255端口是开放,但后面由于10255是一个非安全的端口容易被入侵,所以被关闭了。metric-server默认是从kubelet的10255端口去拉取监控信息的,所以这里需要修改从10250去拉取

edit  metrics-server-master/deploy/1.8+/metrics-server-deployment.yaml

修改source为以下内容。

–source=kubernetes.summary_api:https://kubernetes.default?kubeletHttps=true&kubeletPort=10250&insecure=true

apply yaml该文件

kubectl apply -f metrics-server-master/deploy/1.8+/

查看pod和node监控信息

kubectl top pods
kubectl top nodes

在这里插入图片描述
创建个Deployment测试

apiVersion: v1
kind: Service
metadata:
  name: autuscalertest
  labels:
    app: autuscalertest
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30110
      protocol: TCP
  selector:
    app: autuscalertest
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: autuscalertest
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: autuscalertest
      annotations:
        prometheus.io/scrape: 'true'
    spec:
      containers:
      - name: podinfod
        image: nginx:alpine
        imagePullPolicy: Never
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          requests:
            memory: "32Mi"
            cpu: "1m"
          limits:
            memory: "256Mi"
            cpu: "100m"

注意:容器端口为80,映射主机端口为9899

配置HPA

创建HorizontalPodAutoscaler类型yaml文件,apply -f

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: autuscalertest
spec:
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: autuscalertest
  minReplicas: 2
  maxReplicas: 4
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 40
  - type: Resource
    resource:
      name: memory
      targetAverageUtilization: 45

检查pods和hpa

在这里插入图片描述在这里插入图片描述

使用webbench进行压力测试

  1. 编译安装

#wget http://www.ha97.com/code/webbench-1.5.tar.gz
#tar zxvf webbench-1.5.tar.gz
#cd webbench-1.5
#make
#make install

  1. 使用
    webbench -c 1000 -t 12360 http://主机ip:9899/
    在这里插入图片描述
    可以看见随着cpu压力的增加,已经自动scale了,需要注意的是,scale up是一个阶段性的过程,并不是一次性就直接scale到max了,而是一个阶段性的过程,判定算法就是上文介绍的内容。
    隔断时间没操作压力下来后,自动缩减pod
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章