🧐 Контекст 🧐.
Моя команда принимает платформу Kubernetes, работающих на Екс Для нескольких команд. Когда EKS объявила о поддержке kubernetes версии 1.16, мы обновили нашу инфраструктуру. Это довольно обычный процесс для нас. Мы используем приборную панель PROMETHEUS и GRAFANA для наблюдения и мониторинга нашей инфраструктуры.
После того, как мы обновились, наша приборная панель метрики прекратила отображение оперативной памяти и утилизации CPU. Я отправился, чтобы найти, почему?
⚠️ Отказ от ответственности ⚠️.
Прежде чем мы движемся вперед,
- Я новичок в Кубернане, изучаю трюки на работе
- Это мое путешествие о том, как я отлажил проблему, так что то, что очевидно для эксперта Кубератеса не очевидно для меня.
TL; доктор
Если вы уже знаете, что вызвало эту проблему, перейти к окончательному разделу
Отладка шага 1:
Таким образом, приборная панель не показывает метрики, обычно KUBECTL имеет команды, которые показывают CPU и RAM-утилизацию узлов и стручков. Так что я проверил, если срабатывает.
> kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% ip-xx-xx-xxx-xxx.ec2.internal 8xxm 5% 2xxxxMi 23% ip-xx-xx-xxx-xxx.ec2.internal 2xxxxm 15% 3xxxxMi 29% ip-.... > kubectl top pods NAME CPU(cores) MEMORY(bytes) xxxx-wnpgj xxm xxMi xxxx-r4k85 xxm xxxMi ...
🤔 Что это значит? 🤔
Кубернаны могут извлечь метрики. Это метрики, которые должны использоваться HPA Чтобы масштабировать стручки на основе использования ресурсов.
Отладка шага 2:
Поскольку приборная панель не показывает метрики использования ресурсов, но kubectl Top
Команда работает, моя следующая мысль была может быть Масштабирование больше не работает должным образом
Отказ
По словам Мониторинг использования ресурсов
Компоненты, такие как горизонтальный контроллер AUTOSCALER POD, а также утилита KUBECTL. Эти метрики собираются легким, краткосрочным, метрическим сервером в памяти и выставляются через Metrics.k8s.io API
Так что теперь я хотел посмотреть, каков статус с одним из наших команд.
> kubectl get hpa -n xxx NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE xxx-worker Deployment/xxx-worker 82/150, 5%/100% 1 6 1 4d19h
Поскольку цели выглядят хорошо в вышеуказанном выходе. Я думал, позвольте мне посмотреть, если в любой момент на самом деле произошло масштабирование.
> kubectl describe hpa -n xxx Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedGetResourceMetric 25m (x24 over 2d23h) horizontal-pod-autoscaler unable to get metrics for resource cpu: no metrics returned from resource metrics API Normal SuccessfulRescale 9m56s (x233 over 2d23h) horizontal-pod-autoscaler New size: 2; reason: cpu resource utilization (percentage of request) above target Normal SuccessfulRescale 4m9s (x233 over 2d22h) horizontal-pod-autoscaler New size: 1; reason: All metrics below target
🤔 Что это значит? 🤔
Как мы можем видеть в какой-то момент, выясняющую не удалось, но мы также сможем увидеть, что система восстановится и смогла успешно масштабировать.
Так как есть Неуживлеестресourcemetric
В какой-то момент я думал, что это может привести меня к тому, почему метрики не появляются на приборной панели.
Отладка шага 3:
Как мы видели из нескольких документаций, упомянутых выше, а также от ошибки Никакие метрики не возвращаются с метрик ресурсов API
Отказ В Kubernetes есть какой-то компонент, который отвечает за метрики. Так что я бросил широкую сеть
> kubectl get all -n metrics | grep metrics | grep pod pod/metrics-server-xxxxxxx-xxxxx 1/1 Running 0 4d21h pod/prometheus-kube-state-metrics-xxxx-xxxxx 1/1 Running 0 4d21h
Это звук перспективно. Итак, Метрики-сервер
Похоже, некоторые сервер, занимающиеся метриками. Естественно, я заинтересован в журналах
> k logs -n metrics pod/metrics-server-xxxxxxx-xxxxx I0524 11:17:54.371856 1 manager.go:120] Querying source: kubelet_summary:ip-xx-xx-xxx-xxx.ec2.internal I0524 11:17:54.388840 1 manager.go:120] Querying source: kubelet_summary:ip-xx-xx-xxx-xxx.ec2.internal I0524 11:17:54.495829 1 manager.go:148] ScrapeMetrics: time: 233.232388ms, nodes: x, pods: xxx E0524 11:18:18.542051 1 reststorage.go:160] unable to fetch pod metrics for pod my-namespace/team-worker-xxxxx-xxxx: no metrics known for pod
🤔 Что это значит? 🤔
Как только я увидел слова Scrapemetrics
(Мой мозг перевел его на прометеус) и ошибка Невозможно извлечь метрики POD для POD My-namepace/Team-Worker-XXXXX-XXXX: метрики, известные для POD
Я думал, что нашел проблему.
Отладка шага 4:
Поскольку любой опытный разработчик будет делать, я взял сообщение об ошибке и погрузил его. Что привело к некоторым ссылкам и на быстром сканировании, я нашел пару интересных ссылок
После быстрого сканирования через ссылки каждый, каждая из которых предложит это следующее изменение в Metrics-Server
command: - /metrics-server - --kubelet-insecure-tls #<-- 🤓 - --kubelet-preferred-address-types=InternalIP #<-- 🤓
--kublet-insecume-TLS
Похоже, что-то, что вы будете делать в тестовой установке. Поэтому я хотел понять немного больше, что делают эти флаги. От Документация Понятно, что приведенный выше флаг предназначен только для целей тестирования, а в журналах сервера метрики я не нашел никаких ошибок, относящихся к сертификатам. Так что я не добавил флаг.
--kubelet - предпочтительные-адресные типы
Эта конфигурация — определить, какой тип адреса используется для подключения к узлам для получения метрик. Поэтому перед добавлением этого конфигурации я хотел проверить, были ли API Metrics Server API или нет.
> kubectl get apiservices | grep metrics-server v1beta1.metrics.k8s.io kube-system/metrics-server True 4d23h
Поскольку статус этой услуги доступен, эти два флага не имеют никакого смысла. Я хотел посмотреть, смогу ли я получить необработанные метрики, запросив это API.
> kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods" | jq '.items | .[] | select(.metadata.namespace == "xxx")' { "metadata": { "name": "xxx-worker-6c5bd59857-xxxxx", "namespace": "xxx", "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/xxx/pods/xxx-worker-6c5bd59857-xxxxx", "creationTimestamp": "2020-05-24T12:06:45Z" }, "timestamp": "2020-05-24T12:05:48Z", "window": "30s", "containers": [ { "name": "xxx-worker", "usage": { "cpu": "xxxxxn", "memory": "xxxxxxxKi" } } ] }
🤔 Что это значит? 🤔
Так что все, кажется, хорошо функционируют. Я не знаю, почему метрики я явно смогу запросить через Kubectl
не доступен для приборной панели.
Отладка шага 5:
Теперь я хочу увидеть исходный код Метрики-сервер выяснить при каких обстоятельствах Эта ошибка происходит
podMetrics, err := m.getPodMetrics(pod) if err == nil && len(podMetrics) == 0 { err = fmt.Errorf("no metrics known for pod \"%s/%s\"", pod.Namespace, pod.Name) } if err != nil { klog.Errorf("unable to fetch pod metrics for pod %s/%s: %v", pod.Namespace, pod.Name, err) return nil, errors.NewNotFound(m.groupResource, fmt.Sprintf("%v/%v", namespace, name)) }
Из кода очень ясно, что POD существует, но метрики недоступны. Так что я хвостал журналы и получил подпуск, для которого метрики не найдены
> kubectl get po -n xxx NAME READY STATUS RESTARTS AGE xxx-worker-6c5bd59857-xxxxx 1/1 Running 0 1m5s
🤔 Что это значит? 🤔
Из-за того, что из-за того, что все эти стручки, где метрики недоступны, — это моды, которые были недавно созданы, и поскольку метрики сервер Server периодически для метрик, оно просто не доступно в данный момент.
На мой взгляд, это действительно не Ошибка
. скорее ожидаемое поведение. A Предупреждать
или Информация
будет разумным. Хорошо видеть, что я не одинок в этом
Есть много вопросов, в которых пользователи видят ошибку сообщений о метрике-сервере «без метрик, известных для POD» и просить о помощи.
Для моего понимания, как ожидается, эта ошибка будет происходить в нормальном здоровом метрике-сервере. Сервер метрики периодически соскребает все узлы для того, чтобы собрать метрики и заполнить его внутренний кэш. Когда есть запрос на API Metrics, Metrics-Server достигает этого кеша и ищет существующее значение для POD. Если в K8S нет ценности для существующих POD в K8S, сообщает об ошибке метрики «Нет метрик, известных для POD». Это означает, что эта ошибка может произойти в ситуации, когда:
- Свежие метрики-сервер развернуты с чистым кешем
- Запрос о свежем стиле/узле это еще не было соскобы
Предоставление лучшей информации пользователям значительно снизит пропускную способность билетов.
В конце концов, я преследовал неправильный лидерство.
Отладка шага 5:
Я устранил, что сервер метрики не является причиной ошибки. Это заставило меня думать, я должен найти, как Premetheus соскребает метрики.
После много чтения я выяснил PROMETHEUS, получает метрики, выставленные Kube-State-Metrics
Отказ Очень важно понимать разницу между Метрики-сервер
и Кубы-государственные метрики
Кубе-государственные метрики ориентированы на
… на здоровье различных объектов внутри, таких как развертывание, узлы и стручки.
Метрики-сервер с другой стороны, реализует Metrics API
Подводя итоги в предложении: Kube-State-Metrics обнажает метрики для всех видов объектов Kubernetes. Метрики-сервер предоставляет очень мало метрик до самой кубернаны (не скрутично напрямую с PROMETHEUS), такими как узел и использование POD.
Глядя на журналы сервера PROMETHEUS и MUBE-METRICS, ничего не выскочила необычных.
Ну наконец то
Я попросил о помощи, я объяснил, что я сделал до сих пор, и моя команда Mate предложила очевидным, вы проверили, проведет ли запрос!
поэтому я пошел в проводник запроса Premetheus и казнен
container_cpu_usage_seconds_total{namespace="xxx", pod_name="xxx-worker-6c5bd59857-xxxxx"} Returned no results container_cpu_usage_seconds_total{namespace="xxx"} Returned results container_cpu_usage_seconds_total{namespace="xxx", pod="xxx-worker-6c5bd59857-xxxxx"} Returned results
🤔 Что это значит? 🤔
Так что некоторые, где во время версии EKS обновляют поддержку этикетки Pod_name
это упал Отказ
После исправления запросов в Grafana я мог бы увидеть метрики наконец.
Уроки выучены
- Узнайте компоненты и его цель перед принять участие
- Всегда читайте заметки выпуска, когда Обновление даже незначительных версий
Удалены метрические метрики Cadvisor Pod_name и Container_name, чтобы соответствовать рекомендациям приборов. Любые запросы PROMETHEUS, которые соответствуют меткам POD_NAME и Container_Name (E.G. CADVISOR или METRICES CADVISOR или KUBELE DESTRICE), должны быть обновлены вместо этого для использования POD и контейнера. (# 80376, @ehashman)
- Решение всегда является очевидным решением
Я приветствую все конструктивные отзывы и комментарии
Оригинал: «https://dev.to/shyamala_u/the-case-of-disappearing-metrics-in-kubernetes-1kdh»