Вы столкнулись с ошибкой «ошибка: 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. Если вы столкнулись с какой-либо проблемой, следуя любому из этих методов, оставьте комментарий с логами ошибок.