监控并将外部服务记录到 Kubernetes 集群

监控并将外部服务记录到 Kubernetes 集群

祝大家好运。

我还没有找到关于将第三方服务的指标记录和收集到部署在的系统中的通用指南 Kubernetes。 我正在发布我的解决方案。 本文假设您已经有一个可用的 普罗米修斯 和其他服务。 作为外部有状态服务的数据源的示例,将使用 DBMS PostgreSQL的 在一个容器中 码头工人。 公司使用包管理器 头盔,下文中会有相关示例。 对于整个解决方案,我们正在准备自己的图表,其中包括所有使用的服务的嵌套图表。

记录

许多公司使用一堆技术来收集、查看和集中日志 Elasticsearch + Logstash + 基巴纳,缩写为ELK。 在我们的例子中,不需要对内容进行索引,我使用了更轻量级的 洛基。 它可以作为 Helm 包提供,我们通过更改 ingress 和 pv 的值来将其添加为子图以适合我们的系统。

值.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"

将日志发送到实例 洛基 使用 Loki Docker 日志驱动程序.

您必须在所有设备上安装此附加组件 码头工人 您想要接收日志的主机。 有多种方法可以告诉守护进程如何使用填充。 我在 yaml 中选择驱动程序 Docker撰写, 这是的一部分 Ansible 剧本。

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 }}"
...

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

指标

使用 PostgreSQL 从 PostgreSQL 收集指标 postgres_exporter普罗米修斯。 继续上述文件 Ansible 剧本。

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"
...

为了更清楚起见,我们将使用端点编写外部有状态服务的名称。

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 }}

配置 Prometheus 接收 postgres_exporter 数据是通过编辑子图中的值来完成的。

值.yaml

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

要可视化接收到的数据,请安装适当的仪表板
格拉法纳 并配置数据源。 这也可以通过 Grafana 子图中的值来完成。

它看起来像什么
监控并将外部服务记录到 Kubernetes 集群

我希望这篇简短的文章可以帮助您了解该解决方案背后的主要思想,并在 Kubernetes 集群中为 Loki/Prometheus 设置外部服务的监控和日志记录时节省您的时间。

来源: habr.com

添加评论