我正在尝试使用helm prometheus监控我的应用程序https://github.com/prometheus-community/helm-charts.我已经成功安装了这个helm图表。
prometheus-kube-prometheus-operator-5d8dcd5988-bw222 1/1 Running 0 11h
prometheus-kube-state-metrics-5d45f64d67-97vxt 1/1 Running 0 11h
prometheus-prometheus-kube-prometheus-prometheus-0 2/2 Running 0 11h
prometheus-prometheus-node-exporter-gl4cz 1/1 Running 0 11h
prometheus-prometheus-node-exporter-mxrsm 1/1 Running 0 11h
prometheus-prometheus-node-exporter-twvdb 1/1 Running 0 11h
这些yml配置在同一命名空间中创建的应用服务和部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: appservice
namespace: monitoring
labels:
app: appservice
annotations:
prometheus.io/scrape: 'true'
prometheus.io/path: '/actuator/prometheus'
spec:
replicas: 1
selector:
matchLabels:
app: appservice
template:
metadata:
labels:
app: appservice
...
apiVersion: v1
kind: Service
metadata:
name: appservice
namespace: monitoring
annotations:
prometheus.io/scrape: 'true'
prometheus.io/path: '/actuator/prometheus'
spec:
selector:
app: appservice
type: ClusterIP
ports:
- name: web
protocol: TCP
port: 8080
targetPort: 8080
- name: jvm-debug
protocol: TCP
port: 5005
targetPort: 5005
部署应用程序后,我创建了ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: appservice-servicemonitor
namespace: monitoring
labels:
app: appservice
release: prometheus-repo
spec:
selector:
matchLabels:
app: appservice # target app service
namespaceSelector:
matchNames:
- monitoring
endpoints:
- port: web
path: '/actuator/prometheus'
interval: 15s
我希望添加此ServiceMonitor后,我的prometheus实例创建新的目标"'like"超文本传输协议://appservice: 8080/执行器/prometheus",但事实并非如此,新的endpoint不会出现在prometheusUI中。
我试图通过添加附加服务监视器来更改helm值
namespaceOverride: "monitoring"
nodeExporter:
enabled: true
prometheus:
enabled: true
prometheusSpec:
serviceMonitorSelectorNilUsesHelmValues: false
serviceMonitorSelector:
matchLabels:
release: prometheus-repo
additionalServiceMonitors:
namespaceSelector:
any: true
replicas: 1
shards: 1
storageSpec:
...
securityContext:
...
nodeSelector:
assignment: monitoring
nodeSelector:
assignment: monitoring
prometheusOperator:
nodeSelector:
assignment: monitoring
admissionWebhooks:
patch:
securityContext:
...
securityContext:
...
global:
alertmanagerSpec:
nodeSelector:
assignment: monitoring
但是没有帮助。真的很难说出了什么问题,没有错误日志,所有配置都应用成功。
我发现这个指南非常有用。
请记住,根据prometheus堆栈,您使用的标签和名称可以有不同的默认值(对我来说,使用库贝-prometheus堆栈,例如秘密名称是prometheus-库贝-prometheus-stack-prometheus而不是prometheus-k8s)。
基本报价:
ServiceMonitor对象和它们所属的命名空间由Prometheus对象的serviceMonitor orSelector和serviceMonitor NamespaceSelector选择。ServiceMonitor的名称被编码在Prometheus配置中,因此您可以简单地grep它是否存在于那里。Prometheus算子生成的配置存储在库伯内特斯秘密中,以Prometheus对象名称为前缀的Prometheus命名,并且与Prometheus对象位于相同的命名空间中。例如,对于名为k8s的Prometheus对象,您可以了解名为my-service-itor的ServiceMonitor是否已被拾取:
kubectl -n monitoring get secret prometheus-k8s -ojson | jq -r '.data["prometheus.yaml.gz"]' | base64 -d | gunzip | grep "my-service-monitor
您可以使用prometheus Web界面进行分析:
(1)检查ServiceMonitor
配置是否出现在prometheus配置中:http://localhost:9090/config如果您找不到您的配置,我会检查您的配置是否有效并部署到集群。
(2)检查prometheus是否可以通过此配置发现pod:http://localhost:9090/service-discovery
如果服务发现找不到您的pod,我会将配置所需的所有值与您的pod提供的标签进行比较。
(3)如果服务发现选择了您的服务,请检查目标页面:http://localhost:9090/targets
在这里,您将看到prometheusendpoint是否健康且可由prometheus访问。
最近我有一个案例,在升级ArgoCD后,他们用来确定哪些资源是应用程序形式的默认注释发生了变化。
现在是app.kubernetes.io/instance
,它可能会冲突(覆盖)Helm生成的“预期”版本名称。作为结果,版本名称可以与ArgoCD应用程序实例名称混合。在这种情况下,您可以以注释值结束,例如my-release ase-name
和dev-my-release ase-name
(如果您的ArgoCD应用程序与应用程序中定义的版本名称不同)。
从那以后,我的大多数服务监视器不再作为服务监视器工作CRD注释与服务注释不匹配。解决方案是不使用app.kubernetes.io/instance
注释来标记该工具管理的资源。
由于上述原因,如果您为ArgoCD应用程序设置了发布名称,我建议始终使用argocd.argoproj.io/instance
而不是默认名称。
https://argo-cd.readthedocs.io/en/stable/faq/#why-is-my-app-out-of-sync-even-after-syncing