Inviare dati Prometheus a Monitoraggio di Azure usando l'autenticazione ID dei carichi di lavoro di Microsoft Entra

Questo articolo descrive come configurare la scrittura remota per inviare dati dal cluster Prometheus gestito di Monitoraggio di Azure usando l'autenticazione di ID dei carichi di lavoro di Microsoft Entra.

Prerequisiti

  • È necessario disporre di Prometheus versione 2.48 o successive per poter eseguire l'autenticazione a Microsoft Entra ID.
  • Prometheus in esecuzione nel cluster. Questo articolo presuppone che il cluster Prometheus sia configurato usando lo stack kube-prometheus, ma è possibile configurare Prometheus con altri metodi.

Configurare la scrittura remota con ID dei carichi di lavoro di Microsoft Entra

Il processo per configurare la scrittura remota di Prometheus usando ID dei carichi di lavoro di Microsoft Entra'autenticazione comporta il completamento delle attività seguenti:

  1. Abilitare OpenID Connect e prendere nota dell'URL dell'autorità di certificazione.
  2. Configurare il webhook di ammissione mutevole.
  3. Configurare l'identità del carico di lavoro.
  4. Creare un'applicazione Microsoft Entra o un'identità gestita assegnata dall'utente e concedere le autorizzazioni necessarie.
  5. Assegnare il ruolo Autore metriche di monitoraggio nella regola di raccolta dati dell'area di lavoro all'applicazione.
  6. Creare o aggiornare il pod Prometheus dell'account del servizio Kubernetes.
  7. Stabilire le credenziali di identità federate tra l'identità e l'autorità emittente dell'account del servizio e l'oggetto.
  8. Distribuire un contenitore sidecar per configurare la scrittura remota.

Le attività sono descritte nelle sezioni seguenti.

Abilitare OpenID Connect ed eseguire query sull'autorità emittente

Per abilitare OpenID Connect (OIDC) in un cluster del servizio Azure Kubernetes, seguire le istruzioni in Creare un provider OpenID Connect nel servizio Azure Kubernetes.

Dopo l'abilitazione, prendere nota del SERVICE_ACCOUNT_ISSUER che è essenzialmente l'URL dell'autorità emittente OIDC. Per ottenere l'URL dell'autorità di certificazione OIDC, eseguire il comando az aks show. Sostituire i valori predefiniti con il nome del cluster e il nome del gruppo di risorse.

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

Per impostazione predefinita, l'autorità di certificazione è impostata per usare l'URL di base https://{region}.oic.prod-aks.azure.com, dove il valore per {region} corrisponde al luogo dove viene distribuito il cluster del servizio Azure Kubernetes.

Per altri cluster gestiti (Amazon Elastic Kubernetes Service e Google Kubernetes Engine), vedere Cluster gestiti - ID dei carichi di lavoro di Microsoft Entra. Per i cluster autogestiti, vedere Cluster autogestiti - ID dei carichi di lavoro di Microsoft Entra.

Configurare il webhook di ammissione mutevole

Configurare il webhook di ammissione di modifica per mantenere aggiornate le credenziali federate. Vedere Modifica del webhook di ammissione - ID dei carichi di lavoro di Microsoft Entra da configurare.

Configurare l'identità del carico di lavoro

Per configurare l'identità del carico di lavoro, esportare le seguenti variabili di ambiente:

# [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>"

Per SERVICE_ACCOUNT_NAME, verificare se un account del servizio (separato dall'account del servizio predefinito) è già associato al pod Prometheus. Cercare il valore di serviceaccountName o serviceAccount (deprecato) in spec del pod Prometheus. Usare questo valore, se esistente. Per trovare l'account del servizio associato al pod Prometheus, eseguire il comando kubectl seguente:

kubectl get pods/<Promethuespodname> -o yaml

Se serviceaccountName e serviceAccount non esistono, immettere il nome dell'account del servizio da associare al pod Prometheus.

Creare un'applicazione Microsoft Entra o un'identità gestita assegnata dall'utente e concedere le autorizzazioni necessarie

Creare un'applicazione Microsoft Entra o un'identità gestita assegnata dall'utente e concedere l'autorizzazione per pubblicare le metriche nell'area di lavoro di Monitoraggio di Azure:

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

Assegnare il ruolo Autore metriche di monitoraggio nella regola di raccolta dati dell'area di lavoro all'applicazione o all'identità gestita

Per informazioni sull'assegnazione del ruolo, vedere Assegnare il ruolo Autore metriche di monitoraggio nella regola di raccolta dati dell'area di lavoro all'identità gestita.

Creare o aggiornare il pod Prometheus dell'account del servizio Kubernetes

Spesso viene creato un account del servizio Kubernetes associato al pod che esegue il contenitore Prometheus. Se si utilizza lo stack kube-prometheus, il codice crea automaticamente l'account del servizio prometheus-kube-prometheus-prometheus.

Se a Prometheus non è associato alcun account del servizio Kubernetes, ad eccezione dell'account del servizio predefinito, creare un nuovo account del servizio specifico per il pod che esegue Prometheus.

Per creare l'account del servizio, eseguire il seguente 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

Se un account del servizio Kubernetes diverso dall'account del servizio predefinito è associato al pod, aggiungere l'annotazione seguente all'account del servizio:

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

Se l'applicazione Microsoft Entra o l'identità gestita assegnata dall'utente non si trova nello stesso tenant del cluster, aggiungere l'annotazione seguente all'account del servizio:

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

Stabilire le credenziali di identità federate tra l'identità e l'autorità emittente dell'account del servizio e l'oggetto

Creare credenziali federate utilizzando l'interfaccia della riga di comando di Azure.

Identità gestita assegnata dall'utente

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

Applicazione 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

Distribuire un contenitore sidecar per configurare la scrittura remota

Importante

Il pod Prometheus deve riportare l'etichetta seguente: azure.workload.identity/use: "true"

Il contenitore sidecar di scrittura remota richiede i seguenti valori di ambiente:

  • INGESTION_URL: l'endpoint di inserimento delle metriche visualizzato nella pagina Panoramica per l'area di lavoro di Monitoraggio di Azure
  • LISTENING_PORT: 8081 (qualsiasi porta è supportata)
  • IDENTITY_TYPE: workloadIdentity
  1. Copiare il seguente YAML e salvarlo in un file. YAML usa la porta 8081 come porta di ascolto. Se si usa una porta diversa, modificare tale valore in 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. Sostituire i valori seguenti in YAML:

    valore Descrizione
    <CLUSTER-NAME> Il nome del cluster del servizio Azure Kubernetes.
    <CONTAINER-IMAGE-VERSION> mcr.microsoft.com/azuremonitor/containerinsights/ciprod/prometheus-remote-write/images:prom-remotewrite-20240617.1
    La versione dell’immagine della scrittura remota.
    <INGESTION-URL> Valore per endpoint di inserimento delle metriche dalla pagina Panoramica per l'area di lavoro Monitoraggio di Azure.
  3. Usare Helm per applicare il file YAML e aggiornare la configurazione di 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> 
    

Verifica e risoluzione dei problemi

Per informazioni sulla verifica e sulla risoluzione dei problemi, vedere Risoluzione dei problemi relativi alla scrittura remota e Servizio gestito di Monitoraggio di Azure per scrittura remota del servizio gestito per Prometheus.

Passaggi successivi