Envío de datos de Prometheus a Azure Monitor mediante la autenticación de id. de carga de trabajo de Microsoft Entra (versión preliminar)

En este artículo se describe cómo configurar la escritura remota para enviar datos del clúster de Prometheus administrado de Azure Monitor mediante la autenticación de id. de carga de trabajo de Microsoft Entra.

Requisitos previos

Configurar una carga de trabajo para el id. de carga de trabajo de Microsoft Entra

El proceso para configurar la escritura remota de Prometheus para una carga de trabajo mediante la autenticación del id. de carga de trabajo de Microsoft Entra implica completar las tareas siguientes:

  1. Configurar la identidad de la carga de trabajo.
  2. Crear una aplicación de Microsoft Entra o una identidad administrada asignada por el usuario y conceder permisos.
  3. Asignar a la aplicación el rol Publicador de métricas de supervisión en la regla de recopilación de datos del área de trabajo.
  4. Crear o actualizar el pod de Prometheus de la cuenta de servicio de Kubernetes.
  5. Establecer credenciales de identidad federadas entre la identidad y el emisor de la cuenta de servicio y el sujeto.
  6. Implementar un contenedor adicional para configurar la escritura remota.

Las tareas se describen en las secciones siguientes.

Configurar la identidad de carga de trabajo

Para configurar la identidad de carga de trabajo, exporte las siguientes variables de entorno:

# [OPTIONAL] Set this if you're using a Microsoft Entra application
export APPLICATION_NAME="<your application name>"
    
# [OPTIONAL] Set this only if you're using a user-assigned managed identity
export USER_ASSIGNED_IDENTITY_NAME="<your user-assigned managed identity name>"
    
# Environment variables for the Kubernetes service account and federated identity credential
export SERVICE_ACCOUNT_NAMESPACE="<namespace of Prometheus pod>"
export SERVICE_ACCOUNT_NAME="<name of service account associated with Prometheus pod>"
export SERVICE_ACCOUNT_ISSUER="<your service account issuer URL>"

Para SERVICE_ACCOUNT_NAME, compruebe si una cuenta de servicio (independiente de la cuenta de servicio predeterminada) ya está asociada al pod de Prometheus. Busque el valor de serviceaccountName o serviceAccount (en desuso) en el spec del pod de Prometheus. Use este valor en caso de que exista. Si serviceaccountName y serviceAccount no existieran, escriba el nombre de la cuenta de servicio que desee asociar al pod de Prometheus.

Crear una aplicación de Microsoft Entra o una identidad administrada asignada por el usuario y conceder permisos

Crear una aplicación de Microsoft Entra o una identidad administrada asignada por el usuario y conceder permiso para publicar métricas en el área de trabajo de Azure Monitor:

# create a Microsoft Entra application
az ad sp create-for-rbac --name "${APPLICATION_NAME}"

# create a user-assigned managed identity if you use a user-assigned managed identity for this article
az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}"

Asignar el rol Publicador de métricas de supervisión en la regla de recopilación de datos del área de trabajo a la aplicación o identidad administrada

Para obtener más información sobre la asignación, consulte Asignar el rol Publicador de métricas de supervisión en la regla de recopilación de datos del área de trabajo a la aplicación o identidad administrada.

Crear o actualizar el pod de Prometheus de la cuenta de servicio de Kubernetes

A menudo, se crea una cuenta de servicio de Kubernetes y se asocia al pod que ejecuta el contenedor de Prometheus. Si usa la pila kube-prometheus, el código creará automáticamente la cuenta de servicio prometheus-kube-prometheus-prometheus.

Si no hubiera ninguna cuenta de servicio de Kubernetes, excepto la cuenta de servicio predeterminada asociada a Prometheus, cree una nueva cuenta de servicio específicamente para el pod que ejecute Prometheus.

Para crear la cuenta de servicio, ejecute el siguiente comando kubectl:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: service account
metadata:
  annotations:
    azure.workload.identity/client-id: ${APPLICATION_CLIENT_ID:-$USER_ASSIGNED_IDENTITY_CLIENT_ID}
  name: ${SERVICE_ACCOUNT_NAME}
  namespace: ${SERVICE_ACCOUNT_NAMESPACE}
EOF

Si una cuenta de servicio de Kubernetes distinta de la cuenta de servicio predeterminada estuviera asociada al pod, agregue la siguiente anotación a la cuenta de servicio:

kubectl annotate sa ${SERVICE_ACCOUNT_NAME} -n ${SERVICE_ACCOUNT_NAMESPACE} azure.workload.identity/client-id="${APPLICATION_OR_USER_ASSIGNED_IDENTITY_CLIENT_ID}" –overwrite

Si la aplicación de Microsoft Entra o la identidad administrada asignada por el usuario no estuvieran en el mismo inquilino que el clúster, agregue la siguiente anotación a la cuenta de servicio:

kubectl annotate sa ${SERVICE_ACCOUNT_NAME} -n ${SERVICE_ACCOUNT_NAMESPACE} azure.workload.identity/tenant-id="${APPLICATION_OR_USER_ASSIGNED_IDENTITY_TENANT_ID}" –overwrite

Establezca credenciales de identidad federadas entre la identidad y el emisor y el sujeto de la cuenta de servicio

Creación de credenciales federadas mediante la CLI de Azure.

Identidad administrada asignada por el usuario

az identity federated-credential create \
   --name "kubernetes-federated-credential" \
   --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
   --resource-group "${RESOURCE_GROUP}" \
   --issuer "${SERVICE_ACCOUNT_ISSUER}" \
   --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}"

Aplicación de Microsoft Entra

# Get the ObjectID of the Microsoft Entra app.

export APPLICATION_OBJECT_ID="$(az ad app show --id ${APPLICATION_CLIENT_ID} --query id -otsv)"

# Add a federated identity credential.

cat <<EOF > params.json
{
  "name": "kubernetes-federated-credential",
  "issuer": "${SERVICE_ACCOUNT_ISSUER}",
  "subject": "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}",
  "description": "Kubernetes service account federated credential",
  "audiences": [
    "api://AzureADTokenExchange"
  ]
}
EOF

az ad app federated-credential create --id ${APPLICATION_OBJECT_ID} --parameters @params.json

Implementación de un contenedor adicional para configurar la escritura remota

Importante

El pod de Prometheus debe tener la etiqueta siguiente: azure.workload.identity/use: "true"

El contenedor sidecar de escritura remota requiere los siguientes valores de entorno:

  • INGESTION_URL: punto de conexión de ingesta de métricas que se muestra en la página Información general del área de trabajo de Azure Monitor
  • LISTENING_PORT: 8081 (se admite cualquier puerto)
  • IDENTITY_TYPE: workloadIdentity
  1. Copie el siguiente código YAML y guárdelo en un archivo. YAML usa el puerto 8081 como puerto de escucha. Si usa un puerto diferente, modifique ese valor en YAML.

    prometheus:
      prometheusSpec:
        externalLabels:
              cluster: <AKS-CLUSTER-NAME>
        podMetadata:
            labels:
                azure.workload.identity/use: "true"
        ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write    
        remoteWrite:
        - url: 'http://localhost:8081/api/v1/write'
    
        containers:
        - name: prom-remotewrite
          image: <CONTAINER-IMAGE-VERSION>
          imagePullPolicy: Always
          ports:
            - name: rw-port
              containerPort: 8081
          env:
          - name: INGESTION_URL
            value: <INGESTION_URL>
          - name: LISTENING_PORT
            value: '8081'
          - name: IDENTITY_TYPE
            value: workloadIdentity
    
  2. Reemplace los valores siguientes en YAML:

    Value Descripción
    <CLUSTER-NAME> Nombre del clúster de AKS.
    <CONTAINER-IMAGE-VERSION> mcr.microsoft.com/azuremonitor/prometheus/promdev/prom-remotewrite:prom-remotewrite-20230906.1
    La versión de la imagen de contenedor de escritura remota.
    <INGESTION-URL> El valor del punto de conexión de ingesta de métricas de la página Información general del área de trabajo de Azure Monitor.
  3. Use Helm para aplicar el archivo YAML y actualizar la configuración de Prometheus:

    # set a context to your cluster 
    az aks get-credentials -g <aks-rg-name> -n <aks-cluster-name> 
    
    # use Helm to update your remote write config 
    helm upgrade -f <YAML-FILENAME>.yml prometheus prometheus-community/kube-prometheus-stack -namespace <namespace where Prometheus pod resides> 
    

Comprobación y solución de problemas

Para obtener información de comprobación y solución de problemas, consulte Solución de problemas de escritura remota y Servicio administrado de Azure Monitor para la escritura remota de Prometheus.

Pasos siguientes