Рубрики
Uncategorized

Случай исчезновения метрик в Куберане

Как я отлажился, когда метрики не смогли появиться на панели инструментов Grafana. Tagged с Куберовщиком, DevOps, Premetheus, AWS.

🧐 Контекст 🧐.

Моя команда принимает платформу 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»