k8s實踐——HPA實踐例項

lin2learn發表於2024-08-19

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 根據負載伸縮基本示例

要求:

  1. 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/

相關文章