Модуль Metricbeat kubernetes не может подключиться к kubelet

У нас есть установка, в которой Metricbeat развертывается как DaemonSet в кластере Kubernetes (в частности, AWS EKS).

Вроде все работает нормально, но подключение кубелет.

Чтобы уточнить, следующий модуль:

- module: kubernetes
  enabled: true
  metricsets:
    - state_pod
  period: 10s
  hosts: ["kube-state-metrics.system:8080"]

работает правильно (события перетекают в logstash / elastic).

Однако эта конфигурация модуля не работает ни при каких вариантах значения хоста (_2 _ / _ 3_ / независимо):

- module: kubernetes
  period: 10s
  metricsets:
    - pod
  hosts: ["localhost:10255"]
  enabled: true
  add_metadata: true
  in_cluster: true

ПРИМЕЧАНИЕ: использование IP-адреса кластера вместо localhost (чтобы он перешел на плоскость управления) также работает (хотя, конечно, не извлекает необходимую информацию).

Приведенная выше конфигурация была взята непосредственно из документации Metricbeat и сразу показалась мне странной - как локальный хост переводится (из докера Metricbeat) в соответствующий кубелет?

Ошибка, как и следовало ожидать, в свете вышеизложенного:

error making http request: Get http://localhost:10255/stats/summary: 
dial tcp [::1]:10255: connect: cannot assign requested address

что указывает на какую-то проблему с подключением.

Однако, когда SSH-соединение с любым узлом развернуто на Metricbeat, http://localhost:10255/stats/summary обеспечивает правильный вывод:

{
  "node": {
   "nodeName": "...",
   "systemContainers": [
    {
     "name": "pods",
     "startTime": "2018-12-06T11:22:07Z",
     "cpu": {
      "time": "2018-12-23T06:54:06Z",
      ...
     },
     "memory": {
      "time": "2018-12-23T06:54:06Z",
      "availableBytes": 17882275840,
      ....

Должно быть, я упускаю что-то очень очевидное. Подойдет любое предложение.

ПРИМЕЧАНИЕ. Я разместил (и не получил ответа в течение нескольких дней) то же самое на Форумы Elasticsearch


person ZenMaster    schedule 24.12.2018    source источник
comment
Имейте в виду, что если ваш DaemonSet не hostNetwork: true, localhost означает локальный хост Pod, а не локальный хост узла. Возможно, вам будет удобнее ввести status.hostIP пода в metricbeat и позволить ему связываться с узлом по IP-адресу, а не по локальному хосту. Ваш DS hostNetwork: true?   -  person mdaniel    schedule 25.12.2018
comment
@MatthewLDaniel Это было когда-то. Проблема в том, что это влияет на все разрешения DNS. Итак, если, например, в настройке metricbeat есть ссылка на logstash через DNS-имя logstash.system (вы знаете, DNS-имя ‹svc›. ‹Namespace› .cluster.local.svc) ... это искажается . Это, конечно, означает, что localhost не может работать с logstash.namespace одновременно.   -  person ZenMaster    schedule 25.12.2018
comment
Имеет смысл; поэтому я бы предположил две вещи: попробуйте ввести IP-адрес узла Pod через {"env":[{"name": "POD_IP", "valueFrom": {"fieldRef": "status.hostIP"}}]} или вы также можете попробовать указать DNS контейнера на DNS кластера, даже в режиме hostNetworking: true   -  person mdaniel    schedule 26.12.2018
comment
@MatthewLDaniel Ага ... Вот что я сделал ....   -  person ZenMaster    schedule 27.12.2018
comment
Это то, что вы сделали ... и это было успешно, или вы уже пробовали это сделать, и это не сработало? Кроме того, какой из них вы пробовали, поскольку в моем предложении был или   -  person mdaniel    schedule 27.12.2018
comment
@MatthewLDaniel Извините, я не понимал, что это будет двусмысленно. Я ввел hostIP через нисходящий API и оставил hostNetworking по умолчанию, то есть false. Хотите превратить это в ответ, чтобы я его принял?   -  person ZenMaster    schedule 29.12.2018


Ответы (1)


Введите IP-адрес узла Pod через поставщика valueFrom в списке env::

env:
- name: HOST_IP
  valueFrom:
    fieldRef: status.hostIP

а затем обновите файл конфигурации metricbeat, чтобы использовать IP-адрес хоста:

hosts: ["${HOST_IP}:10255"]

какой metricbeat будет разрешен через его внедрение конфигурации переменной среды

person mdaniel    schedule 29.12.2018
comment
Мне также нужен был вложенный fieldPath, т.е. (в JSON) {"name": "HOST_IP", "valueFrom": {"fieldRef": {"fieldPath": "status.hostIP"}}} - person mqsoh; 12.02.2019