Compartir a través de


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

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

  • Las versiones de Prometheus superiores a v2.48 son necesarias para la autenticación de la aplicación de id. de Microsoft Entra.
  • Prometheus ejecutándose en el clúster. En este artículo, se supone que el clúster de Prometheus está configurado con el uso de la pila kube-prometheus, pero es posible configurar Prometheus con otros métodos.

Configuración de la escritura remota con el id. de carga de trabajo de Microsoft Entra

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

  1. Habilite OpenID Connect y anote la dirección URL del emisor.
  2. Configure el webhook de admisión de mutación.
  3. Configurar la identidad de la carga de trabajo.
  4. Crear una aplicación de Microsoft Entra o una identidad administrada asignada por el usuario y conceder permisos.
  5. 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.
  6. Crear o actualizar el pod de Prometheus de la cuenta de servicio de Kubernetes.
  7. Establecer credenciales de identidad federadas entre la identidad y el emisor de la cuenta de servicio y el sujeto.
  8. Implementar un contenedor adicional para configurar la escritura remota.

Las tareas se describen en las secciones siguientes.

Habilitación de OpenID Connect y consulta del emisor

Para habilitar OpenID Connect (OIDC) en un clúster de AKS, siga las instrucciones de Creación de un proveedor de OpenID Connect en AKS.

Una vez habilitado, tome nota de la SERVICE_ACCOUNT_ISSUER que es básicamente la dirección URL del emisor de OIDC. Para obtener la dirección URL del emisor de OIDC, ejecute el comando az aks show. Reemplace los valores predeterminados para el nombre del clúster y el nombre del grupo de recursos.

az aks show --name myAKScluster --resource-group myResourceGroup --query "oidcIssuerProfile.issuerUrl" -o tsv

De manera predeterminada, el emisor tiene establecido usar la dirección URL base https://{region}.oic.prod-aks.azure.com, donde el valor de {region} coincide con la ubicación en la que se implementa el clúster de AKS.

Para clústeres administrados (Azure Kubernetes Service, Amazon Elastic Kubernetes Service y Google Kubernetes Engine), consulte Clústeres administrados: id. de carga de trabajo de Microsoft Entra. Para clústeres autoadministrados, consulte Clústeres autoadministrados: id. de carga de trabajo de Microsoft Entra.

Configuración del webhook de admisión de mutación

Configure el webhook de admisión de mutación para mantener actualizadas las credenciales federadas. Para obtener más información, consulte Webhook de admisión de mutación: id. de carga de trabajo de Microsoft Entra.

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 where Prometheus pod is running>"
export SERVICE_ACCOUNT_NAME="<name of service account associated with Prometheus pod. See below for more details>"
export SERVICE_ACCOUNT_ISSUER="<your service account (or OIDC) 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. Para buscar la cuenta de servicio asociada al pod de Prometheus, ejecute el siguiente comando kubectl:

kubectl get pods/<Promethuespodname> -o yaml

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/containerinsights/ciprod/prometheus-remote-write/images:prom-remotewrite-20240617.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, vea Solución de problemas de escritura remota y Servicio administrado de Azure Monitor para la escritura remota de Prometheus.

Pasos siguientes