Monitorando e registrando serviços externos no cluster Kubernetes

Monitorando e registrando serviços externos no cluster Kubernetes

Bom para todos.

Não encontrei um guia generalizado on-line sobre registro e coleta de métricas de serviços de terceiros em sistemas implantados em Kubernetes. Estou postando minha solução. Este artigo pressupõe que você já tenha um trabalho Prometeu e outros serviços. Como exemplo de fonte de dados para um serviço stateful externo, será utilizado um SGBD PostgreSQL em um recipiente Estivador. A empresa usa um gerenciador de pacotes Capacete, abaixo no texto haverá exemplos sobre isso. Para toda a solução, estamos preparando nosso próprio gráfico, que inclui gráficos aninhados de todos os serviços utilizados.

Exploração madeireira

Muitas empresas usam uma pilha de tecnologias para coletar, visualizar e centralizar logs ElasticSearch + Logstash + quibana, abreviado como ELK. No nosso caso não há necessidade de indexar o conteúdo e usei uma forma mais leve Loki. Ele está disponível como um pacote Helm, nós o adicionamos como um subgráfico alterando os valores de ingresso e pv para se adequar ao nosso sistema.

valores.yaml

ingress:
  enabled: true
  annotations:
     kubernetes.io/ingress.class: nginx
  hosts:
    - host: kube-loki.example.domain
      paths: 
        - /
  tls: []

....

persistence:
  type: pvc
  enabled: true
  accessModes:
    - ReadWriteOnce
  size: 100Gi
  finalizers:
    - kubernetes.io/pvc-protection
  existingClaim: "pv-loki"

Para enviar logs para uma instância Loki usar Driver de registro Loki Docker.

Você deve instalar este complemento em tudo Estivador hosts dos quais você deseja receber logs. Existem várias maneiras de informar ao daemon como usar o preenchimento. Eu seleciono o driver no yaml Docker Compose, que faz parte Ansible livro de cantadas.

postgres.yaml

    - name: Run containers
      docker_compose:
        project_name: main-postgres
        definition:
          version: '3.7'
          services:
            p:
              image: "{{ postgres_version }}"
              container_name: postgresql
              restart: always
              volumes:
                - "{{ postgres_dir }}/data:/var/lib/postgresql/data"
                - "{{ postgres_dir }}/postgres_init_scripts:/docker-entrypoint-initdb.d"
              environment:
                POSTGRES_PASSWORD: {{ postgres_pass }}
                POSTGRES_USER: {{ postgres_user }}
              ports:
                - "{{ postgres_ip }}:{{ postgres_port }}:5432"
              logging:
                driver: "loki"
                options:
                  loki-url: "{{ loki_url }}"
                  loki-batch-size: "{{ loki_batch_size }}"
                  loki-retries: "{{ loki_retries }}"
...

onde loki_url: kube-loki.example.domain/loki/api/v1/push

Métricas

As métricas são coletadas do PostgreSQL usando postgres_exportador para Prometeu. Continuação do arquivo acima Ansible livro de cantadas.

postgres.yaml

...
            pexp:
              image: "wrouesnel/postgres_exporter"
              container_name: pexporter
              restart: unless-stopped
              environment:
                DATA_SOURCE_NAME: "postgresql://{{ postgres_user }}:{{ postgres_pass }}@p:5432/postgres?sslmode=disable"
              ports:
                - "{{ postgres_ip }}:{{ postgres_exporter_port }}:9187"
              logging:
                driver: "json-file"
                options:
                  max-size: "5m"
...

Para maior clareza, escreveremos os nomes dos serviços com estado externos usando Endpoints.

postgres-service.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: postgres-exporter
subsets:
  - addresses:
      - ip: {{ .Values.service.postgres.ip }}
    ports:
      - port: {{ .Values.service.postgres.port }}
        protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-exporter
  labels:
    chart:  "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
spec:
  ports:
    - protocol: TCP
      port: {{ .Values.service.postgres.port }}
      targetPort: {{ .Values.service.postgres.port }}

A configuração do Prometheus para receber dados do postgres_exporter é feita editando os valores no subgráfico.

valores.yaml

scrape_configs:
...
  - job_name: postgres-exporter
    static_configs:
      - targets: 
         - postgres-exporter.applicationnamespace.svc.cluster.local:9187
        labels:
          alias: postgres
...

Para visualizar os dados recebidos, instale o Dashboard apropriado em
grafana e configurar fontes de dados. Isso também pode ser feito por meio de valores no subgráfico Grafana.

O que parece
Monitorando e registrando serviços externos no cluster Kubernetes

Espero que este breve artigo tenha ajudado você a entender as principais ideias por trás desta solução e economizado seu tempo ao configurar o monitoramento e o registro de serviços externos para Loki/Prometheus em um cluster Kubernetes.

Fonte: habr.com

Adicionar um comentário