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