minikube metrics-server HPA 自動擴縮容錯誤

王清培發表於2021-12-11

minikube metrics-server pod 錯誤

啟動 minikube addons enable metrics-server 之後檢視 metrics-server pod 會有如下錯誤

Failed to pull image "k8s.gcr.io/metrics-server-amd64:v0.5.2": rpc error: code = Unknown desc = Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

這個錯誤是k8s.gcr.io已經廢棄無法訪問,需要替換成在國內的映象,可以使用阿里雲的。

registry.cn-hangzhou.aliyuncs.com/google_containers

完整映象地址。

registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.5.2

進入 minikube docker 手動pull映象。

minikube ssh
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.5.2

為了讓metrics-server-deployment能工作需要手動打個tag並且讓pod拉取映象的規則設定成IfNotPresent。

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.5.2 k8s.gcr.io/metrics-server/metrics-server:v0.5.2

如果不做這一步,也可以手動修改deployment image地址,但是這樣比較麻煩。
修改映象拉取規則

 imagePullPolicy: IfNotPresent

手動安裝 metrics-server

如果你本地有其他錯誤,我建議直接關掉minikube metrics-server addons。自行安裝metrics-server。

minikube addons disable metrics-server

拉取metrics-server manifast

git://github.com/kubernetes-incubator/metrics-server.git

manifast檔案metrics-server/manifests/base/deployment.yaml
(注意,手動安裝前還需要像第一節介紹的那樣,手動拉取映象、修改imagePullPolicy模式。)
可能會出現類似 heapster 之類錯誤。

Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)

(注意:heapster模式的測量機制在k8s 1.6之後已經不再使用。需要手動開啟控制器管理器hpa-rest拉取測量指標。)
但是minikube controller-manager需要在啟動的時候設定。

kube-system   kube-controller-manager-minikube   1/1     Running   5          2d13h

啟動metrics-server測量。

minikube start --extra-config 'controller-manager.horizontal-pod-autoscaler-use-rest-clients=true'

hpa 錯誤

建立hpa

k autoscale deployment kubia --cpu-percent=30 --min=1 --max=5

檢視hpa狀態 k get hpa

kubia   Deployment/kubia   <unknown>/30%          1         5         5          2d12h

檢視詳情 k describe hpa kubia

the HPA was unable to compute the replica count: failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API

其實這裡的日誌是說已經能正常拉取pod的測量,雖然沒有任何返回,但是不影響使用,我們做個測試。
建立一個應用程式。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kubia
  labels:
    app: kubia
spec:
  selector:
    matchLabels:
      app: kubia
  replicas: 3
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - image: luksa/kubia:v1
        name: kubia
        resources:
          requests:
            cpu: 100m

對映一個請求埠。

k expose deployment kubia --port=80 --target-port=8080

監控HPA
watch kubectl get hpa

NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
kubia   Deployment/kubia   <unknown>/30%   1         5         3          2m34s

kubia 程式預設是3個副本。
在另外一個pod中迴圈呼叫應用程式。

k run -it --rm --restart=Never loadgenerator --image=busybox -- sh -c "while true; do wget -O -q http://kubia.default; done"
NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
kubia   Deployment/kubia   51%/30%         1         5         3          3m53s

hpa生效了,我們看下describe。

NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
kubia   Deployment/kubia   30%/30%         1         5         5          5m12

圖1

HPA-Autoscaler 識別到CPU測量值,已經完成彈性擴容。SuccessfulRescale。

相關版本

minikube version: v1.16.0
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.9"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0"}

相關文章