天天看點

【從入門到放棄-Kubernetes】Kubernetes進階-pod水準自動伸縮(hpa)

前言

前面 Kubernetes入門 系列,我們學習了k8s的基礎知識和簡單用法,今天開始我們繼續進一步學習,了解一些複雜和進階用法。本文我們學習pod水準自動擴縮容即hpa。

hpa全稱是Horizontal Pod Autoscaler,可以基于CPU的使用率或其它名額自動伸縮replication controller、deployment和 replica set 中的 pod 數量。

我們可以根據标準應用系統的CPU等名額的周期性變化情況,通過HPA進行動态擴縮容以此來提高叢集的資源使用率。

準備

hpa通過

metrics-server

,監控叢集運作名額觸發擴縮容的,使用前需要先確定metrics-server是可用狀态。

minikube addons list           
【從入門到放棄-Kubernetes】Kubernetes進階-pod水準自動伸縮(hpa)

觀察metrics-server是否是可用狀态,如果是disabled。則需要執行以下指令開啟。

minikube addons enable metrics-server           
【從入門到放棄-Kubernetes】Kubernetes進階-pod水準自動伸縮(hpa)

此時執行kubectl top指令即可檢視pod、node的cpu、memory的使用消耗情況。

【從入門到放棄-Kubernetes】Kubernetes進階-pod水準自動伸縮(hpa)

如果想禁用metrics-server,disable即可

minikube addons disable metrics-server           

啟動應用并暴露服務

我們參考官方demo,使用PHP提供http服務,進行CPU密集型計算。觀察CPU和pod自動擴縮容情況。

準備鏡像

這裡建立一個CPU密集型PHP腳本,并打成鏡像。

也可以直接用我打好的鏡像 registry.cn-hangzhou.aliyuncs.com/larswang/php-hpa:1.0,跳過這一步,直接看Deployment。

檔案及源碼位址見:

AloofJr
# Dockerfile
FROM php:7.4.6-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php           
// index.php
<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>           

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-hpa-deployment
  labels:
    app: php-hpa
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-hpa
  template:
    metadata:
      labels:
        app: php-hpa
    spec:
      containers:
      - name: php-hpa
        image: registry.cn-hangzhou.aliyuncs.com/larswang/php-hpa:1.0
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 200m
           

Service 暴露服務

apiVersion: v1
kind: Service
metadata:
  name: php-hpa-service
spec:
  type: ClusterIP
  selector:
    app: php-hpa
  ports:
    - port: 80
           

HPA

建立HPA

建立hpa設定pod擴縮最多和最少的數量以及執行擴縮容的條件。

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-hpa-deployment
  minReplicas: 1 #pod最小數量
  maxReplicas: 10 #pod最大數量
  targetCPUUtilizationPercentage: 10 #cpu使用率超過10%進行擴容,小于10%縮容
           

觀察HPA運作情況

kubectl get hpa           
【從入門到放棄-Kubernetes】Kubernetes進階-pod水準自動伸縮(hpa)

可以看到以下名額

TARGETS:目前CPU使用率是0%,10%是我們設定的擴縮容阙值。

MINPODS:pod最小數量

MAXPODS:pod最大數量

REPLICAS:目前副本數,因為我們的cpu使用率是0%,目前副本數是1。

增加負載

我們使用busybox,不斷的對php-hpa-service發起http調用,增加服務端壓力。

# 使用busybox并進入容器
kubectl run  -i --rm  --tty load-generator --image=busybox /bin/sh

# 不斷發起http請求
while true; do wget -q -O- http://php-hpa-service; done           

檢視hpa情況

【從入門到放棄-Kubernetes】Kubernetes進階-pod水準自動伸縮(hpa)

cpu使用率143%了,此時REPLICAS還是1,再等一會兒

【從入門到放棄-Kubernetes】Kubernetes進階-pod水準自動伸縮(hpa)

可以看到REPLICAS已經擴到了10個pod,cpu負載平均到了35%,雖然比我們配置的10%高,但是擴到了最多MAXPODS 10個,是以不會繼續擴容了

降低負載

停掉load-generator發壓,等幾分鐘(可以通過--horizontal-pod-autoscaler-downscale-stabilization設定縮容冷卻時間,預設五分鐘)。

【從入門到放棄-Kubernetes】Kubernetes進階-pod水準自動伸縮(hpa)

可以看到REPLICAS縮到了1個pod。

總結

上面介紹了根據CPU使用率進行HPA的操作,其實在實際工作中,HPA是一個非常複雜的課題,因為影響應用運作狀态的不單單是CPU,會和記憶體、ERROR數、線程數等多項名額相關。

在擴容時,還要考慮資源額度、資料庫連接配接數等。

在縮容時則需要更小心了,要時刻關注應用的運作狀态,是很容易引發容量故障的。

更複雜的還有,應用系統是否非标、是CPU密集型還是記憶體密集型應用、系統的流量變化周期、如何應對突發流量等等。

歡迎感興趣或有實戰經驗的大神們來交流探讨。

檔案用到的yaml配置可以在

找到。

更多文章

見我的部落格:

https://nc2era.com

written by

,轉載請注明出處