K8S集群基于heapster的HPA测试

本文将介绍基于heapster获取metric的HPA配置。在开始以前,有必要先了解一下K8S的HPA特性。php

一、HPA全称Horizontal Pod Autoscaling,即pod的水平自动扩展。
自动扩展主要分为两种,其一为水平扩展,针对于实例数目的增减;其二为垂直扩展,即单个实例能够使用的资源的增减。HPA属于前者。node

二、HPA是Kubernetes中实现POD水平自动伸缩的功能。
云计算具备水平弹性的特性,这个是云计算区别于传统IT技术架构的主要特性。对于Kubernetes中的POD集群来讲,HPA能够实现不少自动化功能,好比当POD中业务负载上升的时候,能够建立新的POD来保证业务系统稳定运行,当POD中业务负载降低的时候,能够销毁POD来提升资源利用率。git

三、HPA控制器默认每隔30秒就会运行一次。
若是要修改间隔时间,能够设置horizontal-pod-autoscaler-sync-period参数。github

四、HPA的操做对象是RC、RS或Deployment对应的Pod
根据观察到的CPU等实际使用量与用户的指望值进行比对,作出是否须要增减实例数量的决策。docker

五、hpa的发展历程
在Kubernetes v1.1中首次引入了hpa特性。hpa第一个版本基于观察到的CPU利用率,后续版本支持基于内存使用。
在Kubernetes 1.6中引入了一个新的API自定义指标API,它容许HPA访问任意指标。
Kubernetes 1.7引入了聚合层,容许第三方应用程序经过注册为API附加组件来扩展Kubernetes API。自定义指标API以及聚合层使得像Prometheus这样的监控系统能够向HPA控制器公开特定于应用程序的指标。apache

1、准备工做

由于pod的metrics信息来源与heapster,因此在开始以前要保证heapster运行正常。heapster的配置可参考前文。咱们能够经过运行kubectl top node来验证heapster是否运行正常。api

K8S集群基于heapster的HPA测试

2、针对CPU的HPA演示

一、直接经过kubectl工具来建立hpatomcat

# docker pull siriuszg/hpa-example 
# kubectl get pod,deployment,svc
# kubectl run php-apache --image=siriuszg/hpa-example --requests=cpu=50m --expose --port=80 
# kubectl autoscale deployment php-apache --cpu-percent=10 --min=1 --max=3

K8S集群基于heapster的HPA测试

# kubectl get deployment,svc,hpa

K8S集群基于heapster的HPA测试
二、运行一个deployment来制造压力架构

# kubectl run -i --tty load-generator --image=registry.59iedu.com/busybox /bin/sh
# nslookup php-apache
# while true; do wget -q -O- http://php-apache; done

K8S集群基于heapster的HPA测试
从输入的日志上看,能够看到自动扩展的过程当中有出现“connection refused”,最后咱们将制造压力的deployment删除app

# kubectl delete deployment load-generator

K8S集群基于heapster的HPA测试
三、在整个过程当中能够新开一个终端来观察hpa自动扩展和收缩的过程
K8S集群基于heapster的HPA测试
四、排错

Warning FailedGetResourceMetric 12s (x41 over 20m) horizontal-pod-autoscaler unable to get metrics for resource cpu: unable to fetch metrics from API: the server could not find the requested resource (get pods.metrics.k8s.io)

K8S集群基于heapster的HPA测试
出现上述错误,须要修改kube-controller-manager的配置文件

# grep 'autoscaler' /usr/lib/systemd/system/kube-controller-manager.service    
  --horizontal-pod-autoscaler-use-rest-clients=false
# systemctl daemon-reload
systemctl restart kube-controller-manager

3、针对内存的HPA演示

一、经过yaml文件建立hpa

# cat hpa-memory.yaml 
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: tomcat-shopxx-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: tomcat-shopxx
  minReplicas: 1
  maxReplicas: 3
  metrics:
  - type: Resource
    resource:
      name: memory
      targetAverageUtilization: 30

# kubectl create -f hpa-memory.yaml

二、修改deployment的yaml文件,添加资源的requests和limit限制

若是没有相应的资源限制,则describe查看hpa会有报错信息“missing request for memory on container xxxx”

# cat tomcat.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tomcat-shopxx
  namespace: default
spec:
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: tomcat-shopxx
    spec:
      containers:
      - image: registry.59iedu.com/filebeat:v5.4.0
        imagePullPolicy: Always
        resources:
          requests:
            cpu: "50m"
            memory: "20Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        name: filebeat
        volumeMounts:
        - name: app-logs
          mountPath: /log
        - name: filebeat-config
          mountPath: /etc/filebeat/
      - image: registry.59iedu.com/tomcat_shopxx:v1
        name : tomcat-shopxx
        imagePullPolicy: Always
        resources:
          requests:
            cpu: "50m"
            memory: "200Mi"
          limits:
            cpu: "100m"
            memory: "250Mi"
        env:
        - name: JAVA_OPTS
          value: "-Xmx128m -Xms128m"
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: app-logs
          mountPath: /home/tomcat/logs
      volumes:
      - name: app-logs
        emptyDir: {}
      - name: filebeat-config
        configMap:
          name: filebeat-config

# kubectl apply -f tomcat..yaml

三、观察hpa过程

#  journalctl -u kube-controller-manager.service -f

K8S集群基于heapster的HPA测试

# kubectl describe hpa tomcat-shopxx-hpa

K8S集群基于heapster的HPA测试

# kubectl get hpa
# kubectl get pod

K8S集群基于heapster的HPA测试

下文将会介绍基于metric-server的hpa,尽请关注!
参考:
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
https://github.com/kubernetes/kubernetes/issues/57673

相关文章
相关标签/搜索