Вы столкнулись с ошибкой «ошибка: Metrics API недоступен» после настройки Metrics Server в вашем кластере Kubernetes? Сервер Metrics Server используется в Kubernetes для сбора данных об использовании ресурсов от подсистем и узлов в кластере. Доступ к собранным метрикам осуществляется централизованно через Kubernetes API, что позволяет другим компонентам кластера и пользователям запрашивать использование ресурсов в кластере. Сценарий использования может быть следующим Горизонтальное автомасштабирование бодов.

Чтобы решить проблему «ошибка: Metrics API недоступен» в Kubernetes, давайте сначала удалим сервер Metrics, если он у вас модифицирован.

kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Результат деинсталляции:

serviceaccount "metrics-server" deleted
clusterrole.rbac.authorization.k8s.io "system:aggregated-metrics-reader" deleted
clusterrole.rbac.authorization.k8s.io "system:metrics-server" deleted
rolebinding.rbac.authorization.k8s.io "metrics-server-auth-reader" deleted
clusterrolebinding.rbac.authorization.k8s.io "metrics-server:system:auth-delegator" deleted
clusterrolebinding.rbac.authorization.k8s.io "system:metrics-server" deleted
service "metrics-server" deleted
deployment.apps "metrics-server" deleted
apiservice.apiregistration.k8s.io "v1beta1.metrics.k8s.io" deleted

Исправление с помощью патча развертывания

Установите сервер Metrics, выполнив следующие команды:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Проверьте развертывание сервера метрик в выводе yaml:

kubectl -n kube-system get deployment metrics-server -o yaml

Мы изменим развертывание так, чтобы оно имело следующие настройки:

  • Добавить --kubelet-insecure-tls аргумент в контейнеры args — используется для пропуска проверки сертификатов Kubelet CA.
  • Измените порт контейнера с 10250 на порт 4443
  • Добавить hostNetwork: true

Выполните команды для исправления развертывания. Следующие команды можно выполнить непосредственно из Github Gist.

kubectl patch deployment metrics-server -n kube-system --type='json' -p='[
{
"op": "add",
"path": "/spec/template/spec/hostNetwork",
"value": true
},
{
"op": "replace",
"path": "/spec/template/spec/containers/0/args",
"value": [
"--cert-dir=/tmp",
"--secure-port=4443",
"--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname",
"--kubelet-use-node-status-port",
"--metric-resolution=15s",
"--kubelet-insecure-tls"
]
},
{
"op": "replace",
"path": "/spec/template/spec/containers/0/ports/0/containerPort",
"value": 4443
}
]'

Через несколько секунд статус стручка должен быть запущен и активен:

$ kubectl -n kube-system get pods -l k8s-app=metrics-server
NAME                              READY   STATUS    RESTARTS   AGE
metrics-server-58fb664478-n4rdj   1/1     Running   0          1m

Проверьте состояние API метрики:

$ kubectl get apiservices -l k8s-app=metrics-server
NAME                     SERVICE                      AVAILABLE   AGE
v1beta1.metrics.k8s.io   kube-system/metrics-server   True        2m

Проверьте, работает ли сервер метрик, проверив загрузку узлов kubernetes.

$ kubectl top nodes
NAME                 CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8smas01.novalocal   183m         2%     2231Mi          16%
k8smas02.novalocal   376m         4%     1974Mi          14%
k8smas03.novalocal   289m         3%     1872Mi          13%

Вручную измените файл манифеста

Загрузите манифест развертывания Metrics Server с Github на свой локальный компьютер

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml

Если у вас нет wget вы также можете скачать с помощью curl:

curl -sSL -o metrics-server-components.yaml https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Откройте файл для редактирования с помощью vim или nano:

  • Открыть, используя vim
vim metrics-server-components.yaml
  • Открыть с помощью nano
nano metrics-server-components.yaml

Установите --secure-port на 4443 Добавить --kubelet-insecure-tls чтобы не проверять сертификаты Kubelet CA.

spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls

Измените порт прослушивания контейнера с 10250 на 4443:

ports:
        - containerPort: 4443

Найти nodeSelector и добавьте hostNetwork: true непосредственно перед ним.

hostNetwork: true
nodeSelector:
    kubernetes.io/os: linux

Примените манифест для создания ресурсов.

kubectl apply -f metrics-server-components.yaml

Ожидаемый результат выполнения команды:

serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

Проверьте состояние стручка через несколько секунд или минут:

$ kubectl -n kube-system get pods -l k8s-app=metrics-server
NAME                              READY   STATUS    RESTARTS   AGE
metrics-server-58fb664478-85sm5   1/1     Running   0          39s

Проверка работоспособности API сервера метрик:

$ kubectl get apiservices -l k8s-app=metrics-server
NAME                     SERVICE                      AVAILABLE   AGE
v1beta1.metrics.k8s.io   kube-system/metrics-server   True        59s

$ kubectl top nodes
NAME                 CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8smas01.novalocal   181m         2%     2235Mi          16%
k8smas02.novalocal   146m         1%     1862Mi          13%
k8smas03.novalocal   145m         1%     1857Mi          13%

Если вы хотите проверить журналы контейнеров, например, при дальнейшем устранении неполадок, сначала узнайте имя POD:

POD_NAME=$(kubectl -n kube-system get pods -l k8s-app=metrics-server -o jsonpath='{.items[0].metadata.name}' | awk '{gsub(/%$/, ""); print}')

Затем используйте kubectl logs для просмотра журналов стручка:

$ kubectl -n kube-system logs -f $POD_NAME
I0801 23:54:49.157725       1 serving.go:374] Generated self-signed cert (/tmp/apiserver.crt, /tmp/apiserver.key)
I0801 23:54:49.486075       1 handler.go:275] Adding GroupVersion metrics.k8s.io v1beta1 to ResourceManager
I0801 23:54:49.592398       1 requestheader_controller.go:169] Starting RequestHeaderAuthRequestController
I0801 23:54:49.592418       1 shared_informer.go:311] Waiting for caches to sync for RequestHeaderAuthRequestController
I0801 23:54:49.592442       1 configmap_cafile_content.go:202] "Starting controller" name="client-ca::kube-system::extension-apiserver-authentication::client-ca-file"
I0801 23:54:49.592455       1 shared_informer.go:311] Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I0801 23:54:49.592480       1 configmap_cafile_content.go:202] "Starting controller" name="client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"
I0801 23:54:49.592499       1 shared_informer.go:311] Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I0801 23:54:49.592806       1 dynamic_serving_content.go:132] "Starting controller" name="serving-cert::/tmp/apiserver.crt::/tmp/apiserver.key"
I0801 23:54:49.593268       1 secure_serving.go:213] Serving securely on [::]:4443
I0801 23:54:49.593309       1 tlsconfig.go:240] "Starting DynamicServingCertificateController"
I0801 23:54:49.693502       1 shared_informer.go:318] Caches are synced for client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I0801 23:54:49.693517       1 shared_informer.go:318] Caches are synced for RequestHeaderAuthRequestController
I0801 23:54:49.693551       1 shared_informer.go:318] Caches are synced for client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file

Команды модификации и исправления доступны в Github Gist. Если вы столкнулись с какой-либо проблемой, следуя любому из этих методов, оставьте комментарий с логами ошибок.