Не удалось добавить службу K8s в качестве цели prometheus

# #kubernetes #google-kubernetes-engine #prometheus #servicemonitor

Вопрос:

Я хочу, чтобы мой сервер prometheus очищал метрики из модуля.

Я последовал этим шагам:

  1. Создал модуль с помощью развертывания — kubectl apply -f sample-app.deploy.yaml
  2. Выставил то же самое с помощью kubectl apply -f sample-app.service.yaml
  3. Развернутый сервер Prometheus с использованием helm upgrade -i prometheus prometheus-community/prometheus -f prometheus-values.yaml
  4. создал serviceMonitor, используя kubectl apply -f service-monitor.yaml его для добавления цели для prometheus.

Все модули запущены, но когда я открываю панель мониторинга prometheus, я не вижу службу примеров приложений в качестве цели prometheus в разделе статус>цели в пользовательском интерфейсе панели мониторинга.>

Я проверил следующее:

  1. Я могу видеть sample-app , когда я выполняю kubectl get servicemonitors
  2. Я могу видеть пример-приложение предоставляет метрики в формате prometheus по адресу /metrics

На этом этапе я продолжил отладку, вошел в модуль prometheus с помощью kubectl exec -it pod/prometheus-server-65b759cb95-dxmkm -c prometheus-server sh и увидел , что в конфигурации prometheus (/etc/config/prometheus.yml) в качестве одного из заданий не было примера приложения, поэтому я отредактировал карту конфигурации с помощью

kubectl edit cm prometheus-server -o yaml Добавлен

     - job_name: sample-app
        static_configs:
        - targets:
          - sample-app:8080
 

Предполагая, что все остальные поля, такие как интервал очистки, scrape_timeout остаются по умолчанию.

Я вижу, что то же самое было отражено в файле /etc/config/prometheus.yml, но панель мониторинга prometheus по-прежнему не отображается sample-app в качестве целей в разделе статус>цели.

ниже приведены yamls для prometheus-сервера и сервисного монитора.

 apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    autopilot.gke.io/resource-adjustment: '{"input":{"containers":[{"name":"prometheus-server-configmap-reload"},{"name":"prometheus-server"}]},"output":{"containers":[{"limits":{"cpu":"500m","ephemeral-storage":"1Gi","memory":"2Gi"},"requests":{"cpu":"500m","ephemeral-storage":"1Gi","memory":"2Gi"},"name":"prometheus-server-configmap-reload"},{"limits":{"cpu":"500m","ephemeral-storage":"1Gi","memory":"2Gi"},"requests":{"cpu":"500m","ephemeral-storage":"1Gi","memory":"2Gi"},"name":"prometheus-server"}]},"modified":true}'
    deployment.kubernetes.io/revision: "1"
    meta.helm.sh/release-name: prometheus
    meta.helm.sh/release-namespace: prom
  creationTimestamp: "2021-06-24T10:42:31Z"
  generation: 1
  labels:
    app: prometheus
    app.kubernetes.io/managed-by: Helm
    chart: prometheus-14.2.1
    component: server
    heritage: Helm
    release: prometheus
  name: prometheus-server
  namespace: prom
  resourceVersion: "6983855"
  selfLink: /apis/apps/v1/namespaces/prom/deployments/prometheus-server
  uid: <some-uid>
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: prometheus
      component: server
      release: prometheus
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: prometheus
        chart: prometheus-14.2.1
        component: server
        heritage: Helm
        release: prometheus
    spec:
      containers:
      - args:
        - --volume-dir=/etc/config
        - --webhook-url=http://127.0.0.1:9090/-/reload
        image: jimmidyson/configmap-reload:v0.5.0
        imagePullPolicy: IfNotPresent
        name: prometheus-server-configmap-reload
        resources:
          limits:
            cpu: 500m
            ephemeral-storage: 1Gi
            memory: 2Gi
          requests:
            cpu: 500m
            ephemeral-storage: 1Gi
            memory: 2Gi
        securityContext:
          capabilities:
            drop:
            - NET_RAW
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /etc/config
          name: config-volume
          readOnly: true
      - args:
        - --storage.tsdb.retention.time=15d
        - --config.file=/etc/config/prometheus.yml
        - --storage.tsdb.path=/data
        - --web.console.libraries=/etc/prometheus/console_libraries
        - --web.console.templates=/etc/prometheus/consoles
        - --web.enable-lifecycle
        image: quay.io/prometheus/prometheus:v2.26.0
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /-/healthy
            port: 9090
            scheme: HTTP
          initialDelaySeconds: 30
          periodSeconds: 15
          successThreshold: 1
          timeoutSeconds: 10
        name: prometheus-server
        ports:
        - containerPort: 9090
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /-/ready
            port: 9090
            scheme: HTTP
          initialDelaySeconds: 30
          periodSeconds: 5
          successThreshold: 1
          timeoutSeconds: 4
        resources:
          limits:
            cpu: 500m
            ephemeral-storage: 1Gi
            memory: 2Gi
          requests:
            cpu: 500m
            ephemeral-storage: 1Gi
            memory: 2Gi
        securityContext:
          capabilities:
            drop:
            - NET_RAW
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /etc/config
          name: config-volume
        - mountPath: /data
          name: storage-volume
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 65534
        runAsGroup: 65534
        runAsNonRoot: true
        runAsUser: 65534
        seccompProfile:
          type: RuntimeDefault
      serviceAccount: prometheus-server
      serviceAccountName: prometheus-server
      terminationGracePeriodSeconds: 300
      volumes:
      - configMap:
          defaultMode: 420
          name: prometheus-server
        name: config-volume
      - name: storage-volume
        persistentVolumeClaim:
          claimName: prometheus-server
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2021-06-24T10:43:25Z"
    lastUpdateTime: "2021-06-24T10:43:25Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2021-06-24T10:42:31Z"
    lastUpdateTime: "2021-06-24T10:43:25Z"
    message: ReplicaSet "prometheus-server-65b759cb95" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1
 

yaml для сервисного монитора

 apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"monitoring.coreos.com/v1","kind":"ServiceMonitor","metadata":{"annotations":{},"creationTimestamp":"2021-06-24T07:55:58Z","generation":1,"labels":{"app":"sample-app","release":"prometheus"},"name":"sample-app","namespace":"prom","resourceVersion":"6884573","selfLink":"/apis/monitoring.coreos.com/v1/namespaces/prom/servicemonitors/sample-app","uid":"34644b62-eb4f-4ab1-b9df-b22811e40b4c"},"spec":{"endpoints":[{"port":"http"}],"selector":{"matchLabels":{"app":"sample-app","release":"prometheus"}}}}
  creationTimestamp: "2021-06-24T07:55:58Z"
  generation: 2
  labels:
    app: sample-app
    release: prometheus
  name: sample-app
  namespace: prom
  resourceVersion: "6904642"
  selfLink: /apis/monitoring.coreos.com/v1/namespaces/prom/servicemonitors/sample-app
  uid: <some-uid>
spec:
  endpoints:
  - port: http
  selector:
    matchLabels:
      app: sample-app
      release: prometheus 
 

Комментарии:

1. Вы пробовали перенаправить свой пример приложения через порт и получить конечную точку /metrics, которую должен очистить prometheus? Доступна ли и работает ли ваша конечная точка /метрики?

2. Да. pod отправляет метрики в конечную точку /метрики в формате prometheus. Проверено с помощью переадресации портов

3. есть ли у вашей службы конечная точка? попробуйте kubectl получить конечные точки и проверьте вывод

4. @meanqo Да, у службы есть конечная точка. Я в состоянии curl --request GET --url 'http://my_endpoint_ip:8080/metrics'

5. если вы используете монитор обслуживания оператора prometheus, вам не нужно редактировать карту конфигурации вручную

Ответ №1:

Вам необходимо использовать prometheus-community/kube-prometheus-stack диаграмму, которая включает оператора Prometheus, чтобы автоматически обновлять конфигурацию Prometheus на основе ресурсов ServiceMonitor.

Используемая prometheus-community/prometheus вами диаграмма не включает оператора Prometheus, который отслеживает ресурсы ServiceMonitor в API Kubernetes и соответствующим образом обновляет карту конфигурации сервера Prometheus.

Похоже, что в вашем кластере установлены необходимые пользовательские определения ресурсов (CRD), иначе вы не смогли бы создать ресурс ServiceMonitor. Они не включены в prometheus-community/prometheus диаграмму, поэтому, возможно, они были добавлены в ваш кластер ранее.

Комментарии:

1. Я запускаю эти рабочие нагрузки в кластере автопилота GKE, это дало мне ошибку «отказано в доступе к настройкам mutatingwebhook» при развертывании prometheus-community/kube-prometheus-stack . Похоже, это ограничение автопилота GKE. Позвольте мне попробовать на стандартном кластере.

2. Я попробовал предложенное вами предложение на стандартном кластере, оно работает.