K8S集群基於heapster的HPA測試
本文將介紹基於heapster獲取metric的HPA配置。在開始之前,有必要先了解一下K8S的HPA特性。
1、HPA全稱Horizontal Pod Autoscaling,即pod的水平自動擴展。
自動擴展主要分為兩種,其一為水平擴展,針對於實例數目的增減;其二為垂直擴展,即單個實例可以使用的資源的增減。HPA屬於前者。
2、HPA是Kubernetes中實現POD水平自動伸縮的功能。
雲計算具有水平彈性的特性,這個是雲計算區別於傳統IT技術架構的主要特性。對於Kubernetes中的POD集群來說,HPA可以實現很多自動化功能,比如當POD中業務負載上升的時候,可以創建新的POD來保證業務系統穩定運行,當POD中業務負載下降的時候,可以銷毀POD來提高資源利用率。
3、HPA控制器默認每隔30秒就會運行一次。
如果要修改間隔時間,可以設置horizontal-pod-autoscaler-sync-period參數。
4、HPA的操作對象是RC、RS或Deployment對應的Pod
根據觀察到的CPU等實際使用量與用戶的期望值進行比對,做出是否需要增減實例數量的決策。
5、hpa的發展歷程
在Kubernetes v1.1中首次引入了hpa特性。hpa第一個版本基於觀察到的CPU利用率,後續版本支持基於內存使用。
在Kubernetes 1.6中引入了一個新的API自定義指標API,它允許HPA訪問任意指標。
Kubernetes 1.7引入了聚合層,允許第三方應用程序通過註冊為API附加組件來擴展Kubernetes API。自定義指標API以及聚合層使得像Prometheus這樣的監控系統可以向HPA控制器公開特定於應用程序的指標。
一、準備工作
因為pod的metrics信息來源與heapster,所以在開始之前要保證heapster運行正常。heapster的配置可參考前文。我們可以通過運行kubectl top node來驗證heapster是否運行正常。
二、針對CPU的HPA演示
1、直接通過kubectl工具來創建hpa
# 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
# kubectl get deployment,svc,hpa
2、運行一個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
從輸入的日誌上看,可以看到自動擴展的過程中有出現“connection refused”,最後我們將制造壓力的deployment刪除
# kubectl delete deployment load-generator
3、在整個過程中可以新開一個終端來觀察hpa自動擴展和收縮的過程
4、排錯
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)
出現上述錯誤,需要修改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
三、針對內存的HPA演示
1、通過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
2、修改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
3、觀察hpa過程
# journalctl -u kube-controller-manager.service -f
# kubectl describe hpa tomcat-shopxx-hpa
# kubectl get hpa
# kubectl get pod
下文將會介紹基於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
K8S集群基於heapster的HPA測試