19 maart 2021
Leestijd 5 min
Hoe auto-discovery van Kubernetes endpoints services opzetten in Prometheus
<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >Hoe auto-discovery van Kubernetes endpoints services opzetten in Prometheus</span>
Share this via:

K8s dashboard with kube-state-metrics, Prometheus, Grafana

Het probleem daarmee is dat dit allemaal nogal 'standaard' is. Als je al een volledig aangepaste Prometheus/Grafana setup hebt inRancher 1 , zoals wij, lijkt het zonde om dit uit het raam te gooien. De reis van een Rancher 1 'vee' Prometheus/Grafana naarRancher 2 K8s verliep erg soepel en was vrij eenvoudig.

Echter, metPrometheus moest je historisch gezien het prometheus.yaml bestand bewerken elke keer dat je een nieuwe applicatie wilde scrapen, tenzij je je eigen aangepaste discovery tool al had toegevoegd als een scrape.

De incomplete data repareren met auto-discovery

Een probleem waarmee ik werd geconfronteerd bij het rechtstreeks scrapen van eenLonghorn en Spring Boot ( of een andere) Service in K8s, is dat slechts één van de vele backend pods achter die Service wordt gescrapped.Je eindigt dus met onvolledige data in Prometheus en dus onvolledige data in je dashboards in Grafana. In Prometheus kan je zien datslechts één van de drie bestaande Longhorn endpoints wordt geschraapt.

prometheus tool

In Grafana kun je zien dat ermaar één node is en dat de andere twee worden gerapporteerd als 'Failed Nodes'. Tot overmaat van ramp wordt slechts één van de zeven volumes gerapporteerd als 'Totaal aantal volumes'.

grafana dashboard

Dit is waarauto-discovery van Kubernetes endpoint services een echte redder in de nood is . Veel webpagina's beschrijven de verschillende aspecten van scraping, maar ik vond er geen enkele volledig en andere hadden kritieke fouten.

In deze blogpost geef ik je een minimale en eenvoudige configuratie om je Prometheus-configuratie met auto-discovery van Kubernetes endpoint services op snelheid te brengen.

1. Voeg configMap toe voor Prometheus

Voeg dit toe aan het einde van de prometheus.yaml in je Prometheus configMap. De jobnaam is 'kubernetes-service-endpoints', omdat het toepasselijk leek.

# Scrape config voor service endpoints. # # De herlabeling laat toe dat het eigenlijke service scrape endpoint geconfigureerd wordt # via de volgende annotaties: # # * `prometheus.io/scrape`: Alleen services scrapen die de waarde `true` hebben # * `prometheus.io/scheme`: Als het metrics endpoint beveiligd is dan moet je # dit instellen op `https` &amp; waarschijnlijk de `tls_config` van de scrape config. # `prometheus.io/path`: Als het metrics pad niet `/metrics` is, overschrijf dit dan. # * `prometheus.io/port`: Als de metrics zijn blootgesteld op een andere poort dan de # service, stel dit dan op de juiste manier in. - job_name: 'kubernetes-service-endpoints' scrape_interval: 5s scrape_timeout: 2s kubernetes_sd_configs: - role: endpoints relabel_configs: - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] action: keep regex: true - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] actie: vervang doel_label: __scheme__ regex: (https?) - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] actie: vervang doel_label: __metrics_path__ regex: (.+) - source_labels: [__adres__, __meta_kubernetes_service_annotation_prometheus_io_port] actie: vervang doel_label: __address__ regex: (.+)(?::\d+);(\d+) vervanging: $1:$2 - actie: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_service_name] actie: vervang doel_label: kubernetes_naam

2. De services configureren

Zoals in het commentaar hierboven van de prometheus.yaml, kun je de volgende annotaties configureren. De annotatie prometheus.io/scrape: "true " is verplicht als je een bepaalde service wilt scrapen. Alle andere annotaties zijn optioneel en worden hier uitgelegd:

  • prometheus.io/scrape: Alleen services scrapen die de waarde `true` hebben
  • prometheus.io/schema: Als het metrics endpoint beveiligd is dan moet je dit instellen op `https` & hoogstwaarschijnlijk de `tls_config` van de scrape config instellen.
  • prometheus.io/path: Als het metrics pad niet `/metrics` is overschrijf dit dan.
  • prometheus.io/port: Als de metrics op een andere poort dan de service worden blootgesteld, stel dit dan op de juiste manier in.

Laten we eerst eens kijken naar een voorbeeld voor een Longhorn Service. (Longhorn is een geweldige gerepliceerde opslagoplossing!)

apiVersion: v1 soort: Service metadata: annotaties: prometheus.io/port: "9500" prometheus.io/scrape: "true" labels: app: longhorn-manager naam: longhorn-backend namespace: longhorn-system spec: ports: - naam: manager poort: 9500 protocol: TCP targetPort: manager selector: app: longhorn-manager sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 type: ClusterIP

Laten we nu eens kijken naar een voorbeeld voor een Spring Boot Application Service. Let op het niet-standaard scrape-pad /actuator/prometheus.

apiVersion: v1 soort: Service metadata: naam: springbootapp namespace: spring labels: app: gateway annotaties: prometheus.io/path: "/actuator/prometheus" prometheus.io/port: "8080" prometheus.io/scrape: "true" spec: ports: - name: management port: 8080 - naam: http poort: 80 selector: app: gateway sessionAffinity: Geen type: ClusterIP

3. Configureer Prometheus rollen

ClusterRol

Wijzig eerst de namespace als dat nodig is. Opmerking: mogelijk moet deze clusterRole iets strakker zijn dan hij nu is.

apiVersion: rbac.authorization.k8s.io/v1 soort: ClusterRole metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/naam: prometheus naam: prometheus namespace: prometheus regels: - apiGroups: - apiextensions.k8s.io resources: - customresourcedefinitions werkwoorden: - create - apiGroups: - apiextensions.k8s.io resourceNames: - alertmanagers.monitoring.coreos.com - podmonitors.monitoring.coreos.com - prometheuses.monitoring.coreos.com - prometheusrules.monitoring.coreos.com - servicemonitors.monitoring.coreos.com - thanosrulers.monitoring.coreos.com bronnen: - customresourcedefinitions werkwoorden: - get - update - apiGroups: - monitoring.coreos.com bronnen: - alertmanagers - alertmanagers/finalizers - prometheuses - prometheuses/finalizers - thanosrulers - thanosrulers/finalizers - servicemonitors - podmonitors - prometheusrules werkwoorden: - '*' - apiGroups: - apps bronnen: - statefulsets werkwoorden: - '*' - apiGroups: - "" bronnen: - configmaps - secrets werkwoorden: - '*' - apiGroups:
     - "" middelen: - pods werkwoorden: - get - list - watch - apiGroups: - "" middelen: - services - services/finalizers - endpoints werkwoorden: - '*' - apiGroups: - "" middelen: - nodes werkwoorden: - list - watch - apiGroups: - "" middelen: - namespaces werkwoorden: - get - list - watch - apiGroups: - extensions middelen: - ingresses werkwoorden: ["get", "list", "watch"] - nonResourceURLs: [/metrics] werkwoorden: ["get"].

ClusterRoleBinding

Nogmaals, verander de naamruimte als dat nodig is.

apiVersion: rbac.authorization.k8s.io/v1 soort: ClusterRoleBinding metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/naam: prometheus naam: prometheus namespace: prometheus roleRef: apiGroup: rbac.authorization.k8s.io soort: ClusterRole name: prometheus subjects: - kind: ServiceAccount name: default namespace: prometheus

ServiceAccount

Verander nogmaals de namespace als dat nodig is. Wijzig de naam NIET tenzij u de ClusterRoleBinding subjects.name ook wijzigt.

apiVersion: v1 soort: ServiceAccount metadata: naam: standaard namespace: prometheus

Toepassen

Pas eerst de ServiceAccount, ClusterRoleBinding, ClusterRole en Services toe op je K8s cluster. Na het updaten van de Prometheus configMap, herlaad Prometheus om er zeker van te zijn dat de nieuwe configMap is geactiveerd/geladen.

Resultaten in Prometheus

Ga naar de Prometheus GUI en navigeer naar Status -> Targets. Je zult zien dat nu alle pod endpoints 'op magische wijze' verschijnen bij het kopje kubernetes-services-endpoints. Alle toekomstige prometheus.io gerelateerde annotatie wijzigingen in k8s Services zullen onmiddellijk van kracht worden na het toepassen ervan!

prometheus GUI overview

Grafana Longhorn dashboard

Ik heb een generiek Grafana Longhorn dashboard gebruikt, dat je hier kunt vinden. Dankzij de auto-discovery toont het Grafana Longhorn dashboard nu correct drie nodes en zeven volumes, wat precies klopt!

Grafana Longhorn dashboard

Conclusie

Nadat je alle stappen in deze blogpost hebt doorlopen, hoef je in principe nooit meer naar je Prometheus-configuratie te kijken. Met auto-discovery van Kubernetes endpoint services is het toevoegen en verwijderen van Prometheus scrapes voor je applicaties nu bijna net zo eenvoudig als het ontgrendelen van je mobiele telefoon!

Ik hoop dat deze blogpost je heeft geholpen! Als je vragen hebt, neem dan contact met me op. Of, als je professioneel advies en diensten wilt, kijk dan hoe we je kunnen helpen met Kubernetes.


Jeroen Hartgers
Jeroen Hartgers
Solution Engineer, ACA Group
Contact us

Want to dive deeper into this topic?

Get in touch with our experts today. They are happy to help!

ACA mug mok koffie tas
Contact us

Want to dive deeper into this topic?

Get in touch with our experts today. They are happy to help!

ACA mug mok koffie tas
Contact us

Want to dive deeper into this topic?

Get in touch with our experts today. They are happy to help!

ACA mug mok koffie tas
Contact us

Want to dive deeper into this topic?

Get in touch with our experts today. They are happy to help!

ACA mug mok koffie tas