Очистить метрики контейнеров kubernetes с прометей для портов HTTP и HTTPS - PullRequest
0 голосов
/ 04 мая 2018

Мы хотим, чтобы наша установка Prometheus очищала метрики обоих контейнеров внутри контейнера. Один контейнер предоставляет метрики через HTTPS на порт 443, тогда как другой контейнер предоставляет их через HTTP на порт 8080. Оба контейнера предоставляют метрики по одному и тому же пути, а именно /metrics.

Если мы объявим prometheus.io / схема либо http, либо https, будет очищен только один контейнер. Для другого мы всегда получаем: server returned HTTP status 400 Bad Request То же самое происходит, если мы вообще не определяем prometheus.io / схема . Затем Прометей будет использовать http для обоих портов и произойдет сбой для контейнера, который отображает метрики на порту 443, поскольку он будет ожидать только HTTPS-запросов.

Есть ли способ сообщить Прометею, как именно он будет очищать отдельные контейнеры в нашем развертывании? Какие существуют обходные пути для получения метрик обоих контейнеров?

Версия

Кубернетес: 1.10.2

Прометей: 2.2.1

Отрывок развертывания

apiVersion: apps/v1
kind: Deployment
metadata:
  name: xxx
  namespace: xxx
spec:
  selector:
    matchLabels:
      app: xxx
  template:
    metadata:
      labels:
        app: xxx
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/path: "/metrics"
    spec:
      containers:
      - name: container-1
        image: xxx
        ports:
        - containerPort: 443
      - name: container-2
        image: xxx
        ports:
        - containerPort: 8080

Конфигурация Прометея:

- job_name: kubernetes-pods
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  kubernetes_sd_configs:
  - api_server: null
    role: pod
    namespaces:
      names: []
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
    separator: ;
    regex: "true"
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
    separator: ;
    regex: (.+)
    target_label: __metrics_path__
    replacement: $1
    action: replace
  - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
    separator: ;
    regex: ([^:]+)(?::\d+)?;(\d+)
    target_label: __address__
    replacement: $1:$2
    action: replace
  - separator: ;
    regex: __meta_kubernetes_pod_label_(.+)
    replacement: $1
    action: labelmap
  - source_labels: [__meta_kubernetes_namespace]
    separator: ;
    regex: (.*)
    target_label: kubernetes_namespace
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_pod_name]
    separator: ;
    regex: (.*)
    target_label: kubernetes_pod_name
    replacement: $1
    action: replace

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы не ограничены добавлением аннотаций Prometheus в манифесты развертывания. На самом деле я добавляю их в манифест службы kubernetes.

Это означает, что вы можете добавить 2 службы, одну для контейнера-1, а другую для контейнера-2. Бит будет соскребен Прометеем

0 голосов
/ 06 мая 2018

Я нашел фрагмент GIST, который берет порт из контейнера напрямую, если он называется «метрикой», вместо того, чтобы полагаться на аннотацию для каждого модуля. Он также содержит комментарии, чтобы сделать это регулярное выражение для любого порта, который начинается с «метрики».

Может быть, вы можете расширить его, чтобы также извлечь схему из имени порта, например "metrics-http" и "metrics-https".

https://gist.github.com/bakins/5bf7d4e719f36c1c555d81134d8887eb

# Example scrape config for pods
#
# The relabeling allows the actual pod scrape endpoint to be configured via the
# following annotations:
#
# * `prometheus.io/scrape`: Only scrape pods that have a value of `true`
# * `prometheus.io/path`: If the metrics path is not `/metrics` override this. This
#    will be the same for every container in the pod that is scraped.
# * this will scrape every container in a pod with `prometheus.io/scrape` set to true and the
    port is name `metrics` in the container
# * note `prometheus.io/port` is no longer honored. You must name the port(s) to scrape `metrics`
#   Also, in some of the issues I read, there was mention of a container role, but I couldn't get 
#   that to work - or find any more info on it.
- job_name: 'kubernetes-pods'

  kubernetes_sd_configs:
  - role: pod

  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
    action: keep
    regex: true
  - source_labels: [__meta_kubernetes_pod_container_port_name]
    action: keep
    regex: metrics
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
    action: replace
    target_label: __metrics_path__
    regex: (.+)
  - source_labels: [ __address__, __meta_kubernetes_pod_container_port_number]
    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_name]
    action: replace
    target_label: kubernetes_pod_name
...