# #kubernetes #google-kubernetes-engine #prometheus #servicemonitor
Вопрос:
Я хочу, чтобы мой сервер prometheus очищал метрики из модуля.
Я последовал этим шагам:
- Создал модуль с помощью развертывания —
kubectl apply -f sample-app.deploy.yaml
- Выставил то же самое с помощью
kubectl apply -f sample-app.service.yaml
- Развернутый сервер Prometheus с использованием
helm upgrade -i prometheus prometheus-community/prometheus -f prometheus-values.yaml
- создал serviceMonitor, используя
kubectl apply -f service-monitor.yaml
его для добавления цели для prometheus.
Все модули запущены, но когда я открываю панель мониторинга prometheus, я не вижу службу примеров приложений в качестве цели prometheus в разделе статус>цели в пользовательском интерфейсе панели мониторинга.>
Я проверил следующее:
- Я могу видеть
sample-app
, когда я выполняюkubectl get servicemonitors
- Я могу видеть пример-приложение предоставляет метрики в формате 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. Я попробовал предложенное вами предложение на стандартном кластере, оно работает.