23 november 2023
31 maart 2026
Leestijd 6 min
Hoge beschikbaarheid van Prometheus met Thanos in Kubernetes
<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" >Hoge beschikbaarheid van Prometheus met Thanos in Kubernetes</span>
Share this via:

Prometheus is een populaire monitoring- en waarschuwingstool in het Kubernetes ecosysteem. Maar met de uitbreiding van je infrastructuur kan een enkele Prometheus-instantie moeite hebben om de groeiende werklast aan te kunnen en mogelijk een kwetsbaar single point of failure worden.

In deze blogpost zullen we onderzoeken hoe je Prometheus kunt configureren voor hoge beschikbaarheid met behulp van Thanos in Kubernetes. Daarnaast maken we gebruik van Helm voor eenvoudige implementatie en beheer.

Als je niet bekend bent met Prometheus, raden we je aan om eerst hun documentatie door te nemen.

Wat is Thanos?

Om Thanos succesvol te implementeren, is het cruciaal om de integrale componenten van deze robuuste tool en zijn naadloze integratie te begrijpen.

Thanos is een open-source project dat de functionaliteiten van Prometheus verbetert en een schaalbare, zeer beschikbare en langdurige opslagoplossing biedt. Het stelt je in staat om horizontale schaalbaarheid te bereiken met behoud van een globaal queryoverzicht en deduplicatie over meerdere Prometheus-instanties. Thanos fungeert als een tussenlaag tussen Prometheus en een lange termijn opslagsysteem zoals objectopslag of een gedistribueerde database. In het diagram [1] hieronder kun je zien hoe alle componenten samenwerken.

Nu we een globaal begrip hebben van wat Thanos is, laten we elk onderdeel in detail bekijken.

Thanos Sidecar

De Thanos zijspan werkt hand in hand met elke Prometheus instantie. Het verzamelt gegevensblokken van Prometheus en slaat ze op in een objectopslag of gedistribueerde database. Daarnaast duwt de zijwagen gegevensblokken die hij van Prometheus ontvangt naar het opslagsysteem.

Thanos Query

De Thanos querier vergemakkelijkt het bevragen van gegevens die zijn opgeslagen in verschillende Prometheus instanties en de objectopslag of gedistribueerde database. Het dient als een centraal eindpunt, verzamelt queryresultaten van verschillende bronnen en biedt een globaal overzicht van de gegevens. Met Thanos Querier hoef je geen afzonderlijke Prometheus-instanties te bevragen. In plaats daarvan kun je antwoorden van store gateways en het objectopslagsysteem consolideren en ontdubbelen.

Thanos Store

Thanos Store Gateway werkt als een API Gateway tussen je Thanos cluster en de Object store. Zijn primaire rol is om leesverzoeken van Thanos Query door te sturen naar de onderliggende store. Door dit te doen, biedt het consistente globale query's over meerdere Prometheus instanties. In plaats van individuele Prometheus instanties rechtstreeks te bevragen, biedt de Store Gateway een uniforme weergave van gegevens van alle instanties, wat het bevragingsproces vereenvoudigt.

Thanos Compactor

De Thanos Compactor is verantwoordelijk voor het optimaliseren van het lange termijn opslagsysteem door het uitvoeren van downsampling, deduplicatie en verdichting van datablokken. Het scant periodiek de blokken die zijn opgeslagen in de objectopslag of gedistribueerde database en past deze bewerkingen toe om de opslagefficiëntie te verbeteren en de reactietijden van query's te verkorten.

Thanos integreren met Prometheus

Zoals we hebben gezien bestaat Thanos uit verschillende componenten, maar we zullen alleen de sidecar en query componenten configureren. Onze beslissing om de nadruk te leggen op deze twee componenten komt voort uit ons doel om prioriteit te geven aan hoge beschikbaarheid boven uitgebreide lange termijn opslagoplossingen. Het diagram [2] hieronder laat zien hoe de componenten samenwerken met Prometheus.

Voordat je verder gaat, moet je ervoor zorgen dat het volgende aanwezig is.

  • Kubernetes cluster: Zet een Kubernetes-cluster op waar je van plan bent Prometheus en Thanos in te zetten.
  • Prometheus: Zorg dat je een Prometheus setup klaar hebt, inclusief de benodigde configuratiebestanden.

Opmerking: Onze Prometheus-component wordt ingezet met behulp van de Prometheus Operator. De Thanos sidecar is geïntegreerd met de Prometheus CRD, wat erg handig is voor het beheer van beide componenten. Het implementeren van componenten zoals de Querier, Compactor en Store Gateway van Thanos moet apart van de Prometheus Operator worden gedaan. Het kube-Thanos project biedt nuttige startpunten voor het implementeren van deze aanvullende Thanos componenten.

1. Prometheus Custom Resource met Thanos zijspan

De Prometheus Custom Resource Definition (CRD) biedt de mogelijkheid om een Thanos zijspan op te nemen in de Prometheus Pod. Het inschakelen van de zijspan vereist het instellen van een waarde in de Thanos sectie. Een eenvoudige configuratieoptie is bijvoorbeeld het specificeren van een geldige container image versie voor de Thanos zijspan.

... spec: ... thanos: versie: v0.31.0 ...

Na deze aanpassing wordt een nieuwe Prometheus Pod gestart met de Thanos sidecar container. Vanaf nu is het gewenst om het aantal replica's aan te passen om meerdere instanties van Prometheus in het cluster te hebben draaien.

Om onze Thanos Query-instantie in staat te stellen de Thanos sidecars te ontdekken en te bevragen, is het essentieel om een service op te nemen die de poorten van de Thanos sidecar blootlegt.

--- apiVersion: v1 soort: Service metadata: naam: prometheus-thanos-discovery namespace: prometheus labels: app: prometheus-thanos-discovery app.kubernetes.io/part-of: prometheus spec: type: ClusterIP clusterIP: Geen poorten: - naam: grpc poort: 10901 targetPort: grpc - naam: http port: 10902 targetPort: http selector: app.kubernetes.io/name: prometheus operator.prometheus.io/name: prometheus-prometheus

2. Thanos Query in ons cluster

Na het configureren van de Sidecar voor alle Prometheus instanties, bestaat de volgende stap uit het configureren van Thanos' globale Query Layer voor het gelijktijdig uitvoeren van PromQL query's op alle instanties.

De Querier component van Thanos is ontworpen om stateloos en horizontaal schaalbaar te zijn, waardoor de implementatie met meerdere replica's mogelijk is. Eenmaal verbonden met de Thanos Sidecar, identificeert het automatisch de relevante Prometheus servers om contact mee op te nemen voor een bepaalde PromQL query.

Daarnaast implementeert de Thanos Querier de officiële HTTP API van Prometheus, waardoor het compatibel is met externe tools zoals Grafana. Het biedt ook een aangepaste versie van de gebruikersinterface van Prometheus, waardoor ad-hoc query's kunnen worden uitgevoerd en de status van de Thanos-winkels kan worden bewaakt.

Laten we beginnen met het implementeren van de Kubernetes Thanos-query ServiceAccount.

--- apiVersion: v1 soort: ServiceAccount metadata: naam: thanos-query namespace: prometheus labels: app.kubernetes.io/component: query-layer app.kubernetes.io/instance: thanos-query app.kubernetes.io/naam: thanos-query app.kubernetes.io/versie: v0.31.0

Laten we vervolgens de Thanos-query service implementeren.

--- apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: query-layer app.kubernetes.io/instance: thanos-query app.kubernetes.io/name: thanos-query app.kubernetes.io/version: v0.31.0 name: thanos-query namespace: prometheus spec: ports: - name: grpc port: 10901 targetPort: grpc - naam: http port: 9090 targetPort: http selector: app.kubernetes.io/component: query-layer app.kubernetes.io/instance: thanos-query app.kubernetes.io/name: thanos-query

Nu komt de meest cruciale stap: het implementeren van de Thanos Query applicatie.

Opmerking:

  • Het containerargument--endpoint=dnssrv+_grpc._tcp.prometheus-thanos-discovery.prometheus.svc.cluster.local helpt bij het detecteren van Thanos API-servers via de respectievelijke DNS lookups. Vergeet niet om de service url aan te passen aan jouw setup.
  • Het containerargument --query.replica-label=replica labels die zullen worden behandeld als een replica indicator waarlangs data wordt ontdubbeld.
--- apiVersion: apps/v1 soort: Deployment metadata: labels: app.kubernetes.io/component: query-layer app.kubernetes.io/instance: thanos-query app.kubernetes.io/naam: thanos-query app.kubernetes.io/versie: v0.31.0 naam: thanos-query namespace: prometheus spec: replicas: 1 selector: matchLabels: app.kubernetes.io/component: query-layer app.kubernetes.io/instance: thanos-query app.kubernetes.io/name: thanos-query template: metadata: labels: app.kubernetes.io/component: query-layer app.kubernetes.io/instance: thanos-query app.kubernetes.io/naam: thanos-query app.kubernetes.io/version: v0.31.0 spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchExpressions: - key: app.kubernetes.io/name operator: In values: - thanos-query namespaces: - prometheus topologyKey: kubernetes.io/hostname weight: 100 serviceAccountName: thanos-query containers: - name: thanos-query image: "quay.io/thanos/thanos:v0.31.0" args: - query - --log.level=info - --grpc-address=0.0.0.0:10901 - - --http-address=0.0.0.0:9090 - --query.replica-label=replica - --endpoint=dnssrv+_grpc._tcp.prometheus-thanos-discovery.prometheus.svc.cluster.local poorten: - naam: grpc containerPort: 10901 - naam: http containerPort: 9090 livenessProbe: failureThreshold: 4 httpGet: path: /-/healthy poort: 9090 schema: HTTP periodSeconds: 30 readinessProbe: failureThreshold: 20 httpGet: path: /-/gereed poort: 9090 scheme: HTTP periodSeconds: 5 terminationMessagePolicy: FallbackToLogsOnError resources: requests: geheugen: 1.5Gi limits: geheugen: 1.5Gi terminationGracePeriodSeconds: 120

Nu alle essentiële componenten succesvol werken in ons cluster, kunnen we de functionaliteit van het bevragen van metrieken met de Thanos query valideren. Dit kan worden bereikt door te port-forwarden naar een pod.

# Verkrijg de thanos query pods kubectl -n <namespace> get pods # Port forward naar een pod kubectl -n <namespace> port-forward <pod-naam> <lokale-poort>:<remote-poort>

Door te navigeren naar de Stores sectie in de Thanos Gui [3] kunnen we valideren of alle Prometheus instanties zijn gevonden door de Thanos Query applicatie.

In de Graph sectie [4] kunnen we valideren of deduplicatie werkt door een query uit te voeren met deze functie aan en/of uit.


Met de bevestiging dat onze Thanos-configuratie goed werkt, bestaat de laatste stap uit het configureren van Grafana om Thanos Query te gebruiken als eindpunt voor statistieken.

Conclusie

Prometheus configureren voor hoge beschikbaarheid is cruciaal om ononderbroken monitoring en naadloze dataverzameling te behouden. Het open-source project Thanos biedt een oplossing voor het bereiken van schaalbaarheid en langdurige gegevensopslag. In deze blogpost hebben we je begeleid door het proces van het configureren van Prometheus met Thanos in Kubernetes met behulp van de Prometheus Operator, zodat je Thanos naadloos kunt implementeren en beheren voor je Prometheus setup.

Ga voor meer informatie naar de officiële Thanos-documentatie.


Leonardo Wolo
Leonardo Wolo
Cloud 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