上一篇簡單說了一下使用 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/