Exportar métricas del agente de conexión a Cloud Monitoring

En esta página se explica cómo exportar métricas del agente de conexión a Cloud Monitoring desde Google Distributed Cloud, GKE en AWS o cualquier otro clúster de Kubernetes registrado.

Información general

En un clúster de Google Distributed Cloud o de GKE en AWS, Prometheus recoge métricas y las almacena de forma local en el clúster. Si registras un clúster externo Google Cloud en una flota se crea una implementación llamada "Agente de Connect" en el clúster. Prometheus recoge métricas útiles del agente de conexión, como los errores al conectarse a Google y el número de conexiones abiertas. Para que estas métricas estén disponibles en Cloud Monitoring, debes hacer lo siguiente:

  • Expón el agente de Connect mediante un servicio.
  • Implementa prometheus-to-sd, un componente sencillo que recoge métricas de Prometheus y las exporta a Cloud Monitoring.

Después, puedes ver las métricas mediante Monitoring en la consolaGoogle Cloud o reenviando el puerto del servicio y usando curl.

Crear una variable para el espacio de nombres de Connect Agent

El agente de Connect suele ejecutarse en el espacio de nombres gke-connect.

Connect Agent tiene una etiqueta, hub.gke.io/project. El servidor HTTP escucha en el puerto 8080.

Crea una variable, AGENT_NS, para el espacio de nombres:

AGENT_NS=$(kubectl get ns --kubeconfig KUBECONFIG -o jsonpath={.items..metadata.name} -l hub.gke.io/project=PROJECT_ID)

Haz los cambios siguientes:

  • KUBECONFIG: el archivo kubeconfig de tu clúster
  • PROJECT_ID: el ID del proyecto

Exponer la implementación del agente de Connect

  1. Copia la siguiente configuración en un archivo YAML llamado gke-connect-agent.yaml. Esta configuración crea un servicio, gke-connect-agent, que expone la implementación del agente de conexión.

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: gke-connect-agent
      name: gke-connect-agent
    spec:
      ports:
      - port: 8080
        protocol: TCP
        targetPort: 8080
      selector:
        app: gke-connect-agent
      type: ClusterIP
  2. Aplica el archivo YAML al espacio de nombres del agente de Connect en tu clúster, donde KUBECONFIG es la ruta al archivo kubeconfig del clúster:

    kubectl apply -n ${AGENT_NS} --kubeconfig KUBECONFIG -f gke-connect-agent.yaml
  3. Vincula el rol de roles/monitoring.metricWriter IAM a la cuenta de servicio de Google de la flota:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.metricWriter"

Desplegando prometheus-to-sd

  1. Copia la siguiente configuración en un archivo YAML llamado prometheus-to-sd.yaml, donde:

    • PROJECT_ID es el ID de tu proyecto Google Cloud . Consulta cómo encontrar este valor.
    • CLUSTER_NAME es el del clúster de Kubernetes en el que se ejecuta el agente de Connect.
    • REGION es la ubicación geográficamente cercana a donde se ejecuta tu clúster. Elige una Google Cloud zona que esté cerca geográficamente de la ubicación física del clúster.
    • ZONE es la ubicación cercana a tu centro de datos local. Elige una Google Cloud zona que esté geográficamente cerca de donde se produce el flujo de tráfico.

    Esta configuración crea dos recursos:

    • Un ConfigMap, prom-to-sd-user-config, que declara varias variables para que las use el Deployment
    • Un Deployment, prometheus-to-monitoring, que ejecuta prometheus-to-sd en un solo Pod.
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: prom-to-sd-user-config
    data:
      # The project that the Connect Agent uses. Accepts ID or number.
      project: PROJECT_ID
      # A name for the cluster, which shows up in Cloud Monitoring.
      cluster_name: CLUSTER_NAME
      # cluster_location must be valid (e.g. us-west1-a); shows up in Cloud Monitoring.
      cluster_location: REGION
      # A zone name to report (e.g. us-central1-a).
      zone: ZONE
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: prometheus-to-monitoring
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 2
      selector:
        matchLabels:
          run: prometheus-to-monitoring
      template:
        metadata:
          labels:
            run: prometheus-to-monitoring
        spec:
          containers:
            - args:
                - /monitor
                # 'gke-connect-agent' is the text that will show up in the Cloud Monitoring metric name.
                - --source=gke-connect-agent:http://gke-connect-agent:8080
                - --monitored-resource-types=k8s
                - --stackdriver-prefix=custom.googleapis.com
                - --project-id=$(PROM_PROJECT)
                - --cluster-name=$(PROM_CLUSTER_NAME)
                - --cluster-location=$(PROM_CLUSTER_LOCATION)
                - --zone-override=$(PROM_ZONE)
                # A node name to report. This is a dummy value.
                - --node-name=MyGkeConnectAgent
              env:
                - name: GOOGLE_APPLICATION_CREDENTIALS
                  value: /etc/creds/creds-gcp.json
                - name: PROM_PROJECT
                  valueFrom:
                    configMapKeyRef:
                      name: prom-to-sd-user-config
                      key: project
                - name: PROM_CLUSTER_NAME
                  valueFrom:
                    configMapKeyRef:
                      name: prom-to-sd-user-config
                      key: cluster_name
                - name: PROM_CLUSTER_LOCATION
                  valueFrom:
                    configMapKeyRef:
                      name: prom-to-sd-user-config
                      key: cluster_location
                - name: PROM_ZONE
                  valueFrom:
                    configMapKeyRef:
                      name: prom-to-sd-user-config
                      key: zone
              image: gcr.io/google-containers/prometheus-to-sd:v0.7.1
              imagePullPolicy: IfNotPresent
              name: prometheus-to-monitoring
              resources: {}
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
                - mountPath: /etc/creds
                  name: creds-gcp
                  readOnly: true
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          volumes:
            - name: creds-gcp
              secret:
                defaultMode: 420
                # This secret is already set up for the Connect Agent.
                secretName: creds-gcp
  2. Aplica el archivo YAML al espacio de nombres del agente de Connect en tu clúster, donde KUBECONFIG es la ruta al archivo kubeconfig del clúster:

    kubectl apply -n ${AGENT_NS} --kubeconfig KUBECONFIG -f prometheus-to-sd.yaml

Ver métricas

Consola

  1. Ve a la página Monitoring de la Google Cloud consola.

    Ir a la página Monitoring

  2. En el menú de la izquierda, haga clic en Explorador de métricas.

  3. Las métricas de Connect Agent tienen el prefijo custom.googleapis.com/gke-connect-agent/, donde gke-connect-agent es la cadena especificada en el argumento --source. Por ejemplo: custom.googleapis.com/gke-connect-agent/gkeconnect_dialer_connection_errors_total

cURL

  1. En un shell, usa kubectl para reenviar el puerto del servicio gke-connect-monitoring:

    kubectl -n ${AGENT_NS} port-forward svc/gke-connect-monitoring 8080
  2. Abre otra shell y ejecuta lo siguiente:

    curl localhost:8080/metrics

Eliminar los recursos utilizados

Para eliminar los recursos que has creado en este tema, sigue estos pasos:

AGENT_NS=$(kubectl get ns --kubeconfig KUBECONFIG -o jsonpath={.items..metadata.name} -l hub.gke.io/project)
kubectl delete configmap prom-to-sd-user-config --kubeconfig KUBECONFIG -n ${AGENT_NS}
kubectl delete service gke-connect-agent --kubeconfig KUBECONFIG -n ${AGENT_NS}
kubectl delete deployment prometheus-to-monitoring --kubeconfig KUBECONFIG -n ${AGENT_NS}