k8s 自動伸縮 pod(HPA)

運維工作棧發表於2020-11-26

    上一篇簡單說了一下使用 kubeadm 安裝 k8s。今天說一下 k8s 的一個神奇的功能:HPA (Horizontal Pod Autoscaler)。

 

    HPA 依賴 metrics-server 獲取 pod 的指標。所以我們要先安裝 metrics-server 外掛。

 

    1. metrics-server 安裝

    1.1 下載 yaml 檔案和 image

# 在 k8s master 節點執行
mkdir metrics-server
cd metrics-server
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml

docker pull ninejy/metrics-server:v0.3.7
docker tag ninejy/metrics-server:v0.3.7 k8s.gcr.io/metrics-server/metrics-server:v0.3.7

 

    1.2 安裝

# 修改 components.yaml 檔案,在 args 下面新增以下兩行內容,不校驗證書,不然會報 x509 錯誤
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
- --kubelet-insecure-tls

kubectl apply -f components.yaml
kubectl get pod -n kube-system
# 列出的 pod 中有 metrics-server-xxxxxxx,並且是 Running狀態,就說明 metrics-server 安裝好了

 

    1.3 問題

  此時執行命令 `kubectl top nodes` 應該不會有結果。檢視metrics-server pod 的日誌,會有找不到主機 k8s-master01,k8s-node01的錯誤。這是因為主機名、IP的對映關係是我們在 hosts 檔案裡寫的。需要在 coredns 的配置中加上這兩個主機名、IP的對應關係記錄。

kubectl edit configmap coredns -n kube-system
# 新增以下內容,然後 按鍵盤 Esc 輸入 :wq 儲存退出
hosts {
    192.168.0.3 k8s-master01
    192.168.0.6 k8s-node01
    fallthrough
}

 

    之後再執行 `kubectl top nodes` 就應該會有類似下圖內容了

 

    這樣 metrics-server 就算安裝好了。

 

    2. 測試 HPA

    2.1 deploymet/service/hpa yaml 檔案

# cat hpa-cpu.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-hpa-cpu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: ninejy/hpacpu:latest
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 50m
            memory: 10Mi
          requests:
            cpu: 50m
            memory: 10Mi
---
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  type: ClusterIP
  selector:
    app: myapp
  ports:
  - name: http
    port: 80
    targetPort: 8080
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: deployment-hpa-cpu
  namespace: default
spec:
  maxReplicas: 5
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: deployment-hpa-cpu
  targetCPUUtilizationPercentage: 80

 

    這裡我們限制每個 pod 最多使用一核 cpu 的 50/1000,當 pod 使用 cpu 的百分比大於最大限制的 80% 就會觸發 pod 擴容,最多擴充套件到 5 個 pod.

 

    2.2 建立 deploymet/service/hpa

kubectl apply -f hpa-cpu.yaml

 

    2.3 測試 HPA

# 開三個 k8s-master01 視窗,分別執行下面三條命令

watch kubectl get pods

watch kubectl top pods

ip=$(kubectl get svc | grep myapp | awk '{print $3}')
for i in `seq 1 100000`; do curl $ip?a=$i; done

 

    切換視窗檢視,過一會就會有 pod 數量增加,說明 HPA 生效了。停掉 curl 的那條命令,過一會,pod 數量又會恢復到 1 個了。

 

    以上就是 k8s HPA 的基本使用。HPA 也可以使用記憶體和其他自定義的指標,也可以組合使用。根據這些指標的值和設定的閾值進行 pod 的數量的增減。

 

    更多內容可以參考 k8s 官網:

    https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

 

相關文章