Monitoreo y registro de servicios externos en el clúster Kubernetes

Monitoreo y registro de servicios externos en el clúster Kubernetes

Saludos a todos.

No encontré en línea una guía general sobre la registración y la recolección de métricas de servicios de terceros en sistemas desplegados en Kubernetes. Publico mi solución. Este artículo asume que ya tienes una Prometheus y otros servicios funcionando. Como ejemplo de fuente de datos de un servicio stateful externo, se utilizará una base de datos PostgreSQL en un contenedor Docker. La empresa utiliza un gestor de paquetes Helm, más adelante habrá ejemplos sobre este. Para toda la solución, preparamos nuestro propio chart, que incluye charts anidados de todos los servicios utilizados.

Registro

Muchas empresas utilizan la pila de tecnologías Elasticsearch + Logstash + kibana, abreviada como ELK. En nuestro caso, no es necesario indexar el contenido, por lo que he aplicado una solución más ligera Loki.. Está disponible como un paquete Helm, lo añadimos como subchart modificando los valores para ingress y pv según nuestro sistema.

values.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 a la instancia Loki. VPS KVM Loki Docker Logging Driver.

Es necesario instalar este complemento en todos los Docker hosts desde los cuales deseas recibir logs. Hay varias formas de indicarle al demonio cómo usar el complemento. Selecciono el controlador en el archivo yaml Docker Compose, que es parte de Ansible playbook.

postgres.yaml

    - name: Ejecutar contenedores
      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 }}"
...

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

Métricas

Se recolectan métricas de PostgreSQL mediante postgres_exporter para Prometheus. Continuación del archivo mencionado anteriormente Ansible playbook.

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 mayor claridad de los nombres de los servicios stateful externos, los definiremos a través de 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 }}

La configuración de Prometheus para obtener datos de postgres_exporter se realiza modificando los valores en el subchart.

values.yaml

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

Para visualizar los datos obtenidos, instale el Dashboard correspondiente en
Grafana y configure las fuentes de datos. También se puede hacer a través de los valores en el subchart de Grafana.

Cómo se ve esto
Monitoreo y registro de servicios externos en el clúster Kubernetes

Espero que este breve artículo le haya ayudado a comprender las ideas principales contenidas en esta solución y le ahorre tiempo al configurar la monitorización y el registro de servicios externos para Loki/Prometheus en el clúster de Kubernetes.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster