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

相關文章
相關標籤/搜索