0x01 水平自動擴縮HPA
指statefulset和deployment這些負載,可以根據系統的負載壓力,自動擴容應對業務高峰,並在低峰時自動縮容,降低資源消耗。
0x02 準備
要求已經有一個1.23以上的k8s叢集,在其中部署metrics-server。示例用的1.25,執行時為containerd。
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
ctr -n k8s.io image pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1
ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1 registry.k8s.io/metrics-server/metrics-server:v0.7.1
kubelet的證書是預設生成的,需要修改metrics-server deploy 新增命令引數--kubelet-insecure-tls
,跳過證書認證,否則metrics-server 無法採集 kubelet的metrics。
kubectl -n kube-system edit deploy metrics-server
確認已經正常。
kubectl -n kube-system get deploy
0x03 根據負載伸縮基本示例
要求:
- Pod配置了對應資源的requests值。否則會提示“the HPA was unable to compute the replica count: failed to get cpu utilization: missing request for cpu”
建立一個負載nginx deploy,副本為1,方便觀察自動擴容。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: web
image: "docker.io/library/nginx:1.23-alpine"
ports:
- containerPort: 80
name: http
protocol: TCP
resources:
requests:
cpu: 10m
建立hpa物件。
kubectl autoscale --max=3 deploy nginx --cpu-percent=30
$ kubectl get hpa nginx
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 10%/30% 1 3 1 18m
預設指定的是平均使用值,即如果CPU的使用率超出了30%,就會自動擴容。預設配置中的比例是Pod中當前使用的值與requests值的比值。
cpu-percent = usage/requests * 100
解釋:上述nginx啟動後CPU佔用很小,k8s中最小的值就是1m。可以透過kubectl top pod確認。requests值為10m,則現在的比例是10%,即沒達到30%的比例。
$ kubectl top pod
NAME CPU(cores) MEMORY(bytes)
nginx-5db849c76f-hrpph 1m 5Mi
下面可以透過壓力工具對nginx進行加壓,觸發擴容。壓力大時,很快擴容出了2個Pod。
$ kubectl get pods -w
NAME READY STATUS RESTARTS AGE
nginx-54d69bd567-ddrt9 1/1 Running 0 5m48s
nginx-54d69bd567-qzs2r 1/1 Running 0 8s
nginx-54d69bd567-v25m8 1/1 Running 0 8s
示例給的是透過CPU使用率擴容,也可以根據平均使用量和使用量實現自動擴容。官方的API中還有如何控制Pod擴容和縮容的速率。見https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/horizontal-pod-autoscaler-v2/