Настройте Prometheus с помощью docker-compose, чтобы получать метрики существующих модулей Kubernetes.

У меня есть конфигурация prometheus, которая работает в моем кластере, развернутом terraform. Теперь я хотел бы настроить Prometheus, используя тот же prometheus.yml локально (вне terraform). Я создал новый проект для настройки Promethese с помощью docker-compose и использовал тот же файл prometheus.yml, но когда я захожу на сайт prometheus, кажется, что метрики для kubernetes недоступны, например эти метрики для контейнеров kubernetes: container_cpu_usage_seconds_total container_cpu_load_average_10s container_memory_usage_bytes container_memory_rss

Не могли бы вы сообщить мне, чего мне не хватает в моем проекте, чтобы заставить эту работу работать?

Это prometheus.yml

global:
  scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
  static_configs:
  - targets: ['localhost:9090']
- job_name: 'kube-state-metrics'
  static_configs:
    - targets: ['10.36.1.10']
    - targets: ['10.36.2.6']
    - targets: ['10.36.1.12']
- job_name: 'kubernetes-pods'
  kubernetes_sd_configs:
  - api_server: https://10.36.1.10:6443
    role: node
    bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    tls_config:
      insecure_skip_verify: true
  - api_server: https://10.36.2.6:6443
    role: node
    bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    tls_config:
      insecure_skip_verify: true
  - api_server: https://10.36.1.12:6443
    role: node
    bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    tls_config:
      insecure_skip_verify: true
  - role: pod
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
    action: keep
    regex: true
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
    action: replace
    target_label: __metrics_path__
    regex: (.+)
  - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
    action: replace
    regex: ([^:]+)(?::\d+)?;(\d+)
    replacement: $1:$2
    target_label: __address__
  - action: labelmap
    regex: __meta_kubernetes_pod_label_(.+)
  - source_labels: [__meta_kubernetes_namespace]
    action: replace
    target_label: kubernetes_namespace
  - source_labels: [__meta_kubernetes_pod_label_component]
    action: replace
    target_label: job
  - source_labels: [__meta_kubernetes_pod_name]
    action: replace
    target_label: kubernetes_pod_name

А это docker-compose.yml

version: '3'

services:
  prometheus:
    image: prom/prometheus:v2.21.0
    ports:
      - 9000:9090
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus-data:/prometheus
    command: --web.enable-lifecycle  --config.file=/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana:$GRAFANA_VERSION
    environment:
      GF_SECURITY_ADMIN_USER: $GRAFANA_ADMIN_USER
      GF_SECURITY_ADMIN_PASSWORD: $GRAFANA_ADMIN_PASSWORD
    ports:
      - 3000:3000
    volumes:
      - grafana-storage:/var/lib/grafana
    depends_on:
      - prometheus
    networks:
      - internal

networks:
  internal:

volumes:
  prometheus-data:
  grafana-storage:

ipK8s

node_exporter


person shuti    schedule 05.05.2021    source источник


Ответы (1)


Вы используете Prometheus как на локальном уровне, так и на уровне сервера.

server one работает нормально и получает метрики контейнеров Kubernetes, как в kubernetes.

в то время как docker-compose не работает из-за того, что вы запускаете его локально на докере, а не в кластере kubernetes.

проблема в том, что Target ваш Prometheus не получает метрики вашего кластера Kubernetes.

например, вы запускаете Prometheus локально, но хотите отслеживать внешний кластер Kubernetes, который вы должны предоставить для своей службы Kube-state-metrics с помощью IP.

в этом случае ваша конфигурация Prometheus будет иметь такую ​​​​работу, как

scrape_configs:
  - job_name: 'kube-state-metrics'
    static_configs:
      - targets: ['address'] //address of the k8s service IP

в вашем случае вы должны сделать что-то вроде

kubernetes_sd_configs:
- api_server: https://<ip>:6443
  role: node
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  tls_config:
    insecure_skip_verify: true

это позволит получить метрики кластера kubernetes, и вы сможете просматривать данные локально.

вы можете прочитать эту интересную суть: https://gist.github.com/sacreman/b61266d2ec52cf3a1af7c278d9d93450

person Harsh Manvar    schedule 05.05.2021
comment
Большое спасибо @Harsh Manvar, я попробую это - person shuti; 05.05.2021
comment
Хорошо, дайте мне знать, если у вас возникнут какие-либо проблемы. - person Harsh Manvar; 05.05.2021
comment
Привет @Harsh Manvar Я изменил конфигурацию, как было предложено, я проверяю IP-адрес службы k8s с помощью команды kubectl get pod -o wide, и вот что я получаю k8sIP, поэтому я добавил под scrape_configs: ``` - job_name: 'kube-state-metrics' static_configs: - target: ['10.36.1.10'] - target: ['10.36. 2.6'] - цели: ['10.36.1.12'] ``` и - person shuti; 05.05.2021
comment
А также под kubernetes_sd_configs: ``` - api_server: 10.36.1.10:6443 роль: узел файл_токена_носителя: /var/ run/secrets/kubernetes.io/serviceaccount/token tls_config: insecure_skip_verify: true — api_server: 10.36.2.6:6443 роль: node Bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token tls_config: insecure_skip_verify: true — api_server: 10.36 .1.12:6443 Роль: node Bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token tls_config: insecure_skip_verify: true ``` - person shuti; 05.05.2021
comment
Я обновляю yml в посте, чтобы было понятнее - person shuti; 05.05.2021
comment
Я чувствую, что это неправильно, потому что, когда я проверяю Prometheus, я все еще не вижу эти метрики контейнера. - person shuti; 05.05.2021
comment
je veux voir ces metrics: node_exporter - person shuti; 05.05.2021
comment
метрики node_exporter можно собирать, запрашивая каждый узел, обычно через порт 9142. Они не имеют ничего общего с Kubernetes API. Вы можете использовать файл scrape_config. Или kubernetes_sd_discovery, если есть служба, указывающая на ваш node_exporters. Если вы не знакомы с Prometheus и Kubernetes (есть кое-что, что нужно собрать, ...), может быть проще использовать какое-либо развертывание prometheus-operator в Kubernetes, а затем объединять эти метрики в развертывание Prometheus на основе docker-compose. . - person SYN; 05.05.2021
comment
Спасибо @SYN, я хотел бы попробовать это, не могли бы вы порекомендовать мне хорошую ссылку, чтобы использовать этот метод? - person shuti; 05.05.2021
comment
@SYN я должен следовать этому? github.com/prometheus-operator/prometheus-operator - person shuti; 05.05.2021
comment
Конечно, это один из способов сделать это. Глядя на суть, предложенную выше, не хватает довольно многого (метрики cadvisor, метрики kube-state, метрики kubelet, ...). Лучше начать с чистого листа. Кроме того, для этого предназначен оператор Prometheus. Я не фанат, но это довольно хорошо подходит, пока вы не поймете, как работает вся эта экосистема. - person SYN; 05.05.2021
comment
Да, в сути многого не хватает, но я просто поделился им, чтобы поделиться подробностями, как это сделать в облаке. - person Harsh Manvar; 05.05.2021
comment
@shuti какие-нибудь обновления по этому ответу? вы проголосовали, если нашли этот ответ полезным, или если вы удовлетворены ответом, вы можете обновить статус и пометить его как ответ. - person Harsh Manvar; 17.05.2021
comment
@Harsh Manvar извините, у меня еще не было времени попробовать эту конфигурацию на моем локальном Prometheus в docker-compose, поскольку у меня есть Prometheus, развернутый Terraform/Helm, который, кажется, работает для Kubernetes, но есть проблема с configMap (как вы ответили в другой ветке , благодарю вас). Я проголосовал за ваш ответ. - person shuti; 17.05.2021