Partager via


Envoyer des données Prometheus à Azure Monitor en utilisant l’authentification Microsoft Entra Workload ID

Cet article explique comment configurer l’écriture à distance pour envoyer des données depuis votre cluster Prometheus managé par Azure Monitor en utilisant l’authentification Microsoft Entra Workload ID.

Prérequis

  • Les versions de Prometheus supérieures à v2.48 sont nécessaires pour l'authentification de l'application Microsoft Entra ID.
  • Prometheus s’exécutant dans le cluster. Cet article suppose que le cluster Prometheus est configuré en utilisant la pile kube-prometheus, mais vous pouvez configurer Prometheus avec d’autres méthodes.

Configurer une écriture à distance avec Microsoft Entra Workload ID

Le processus de configuration de l’écriture à distance de Prometheus en utilisant l’authentification Microsoft Entra Workload ID implique l’exécution des tâches suivantes :

  1. Activez OpenID Connect et notez l’URL de l’émetteur.
  2. Configurez le webhook d’admission mutant.
  3. Configurer une identité de charge de travail.
  4. Créer une application Microsoft Entra ou une identité managée affectée par l’utilisateur, et octroyer des autorisations.
  5. Attribuer à l’application le rôle Éditeur de métriques de monitoring sur la règle de collecte de données d’espace de travail.
  6. Créer ou mettre à jour le pod Prometheus de votre compte de service Kubernetes.
  7. Établir des informations d’identification d’identités fédérées entre l’identité et l’émetteur et le sujet du compte de service.
  8. Déployer un conteneur sidecar pour configurer l’écriture à distance.

Les tâches sont décrites dans les sections suivantes.

Activez OpenID Connect et envoyez une requête à l’émetteur

Pour activer OpenID Connect (OIDC) sur un cluster AKS, suivez les instructions listées dans Créer un fournisseur OpenID Connect sur AKS.

Une fois activé, notez SERVICE_ACCOUNT_ISSUER, qui est principalement l’URL de l’émetteur OIDC. Pour obtenir l’URL de l’émetteur OIDC, exécutez la commande az aks show. Remplacez les valeurs par défaut pour le nom du cluster et le nom du groupe de ressources.

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

Par défaut, l’émetteur est défini pour utiliser l’URL de base https://{region}.oic.prod-aks.azure.com, où la valeur de {region} correspond à l’emplacement de déploiement du cluster AKS.

Pour les autres clusters managés (Amazon Elastic Kubernetes Service et Google Kubernetes Engine), consultez Clusters managés – Microsoft Entra Workload ID. Pour les clusters autogérés, consultez Clusters autogérés – Microsoft Entra Workload ID.

Configurer le webhook d’admission mutant

Configurez le webhook d’admission mutant pour maintenir les informations d’identification fédérées à jour. Pour la configuration, consultez Webhook d’admission mutant : Microsoft Entra Workload ID.

Configurer l’identité de la charge de travail

Pour configurer l’identité de la charge de travail, exportez les variables d’environnement suivantes :

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

Pour SERVICE_ACCOUNT_NAME, vérifiez si un compte de service (distinct du compte de service par défaut) est déjà associé au pod Prometheus. Recherchez la valeur de serviceaccountName ou de serviceAccount (déconseillée) dans le spec de votre pod Prometheus. Utilisez cette valeur si elle existe. Pour rechercher le compte de service associé au pod Prometheus, exécutez la commande kubectl ci-dessous :

kubectl get pods/<Promethuespodname> -o yaml

Si serviceaccountName et serviceAccount n’existent pas, entrez le nom du compte de service que vous voulez associer à votre pod Prometheus.

Créer une application Microsoft Entra ou une identité managée affectée par l’utilisateur, et octroyer des autorisations

Créez une application Microsoft Entra ou une identité managée affectée par l’utilisateur, et octroyez des autorisations de publier des métriques dans l’espace de travail 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}"

Attribuer à l’application ou à l’identité managée le rôle Éditeur de métriques de monitoring sur la règle de collecte de données d’espace de travail

Pour plus d’informations sur l’attribution du rôle, consultez Attribuer à l’identité managée le rôle Éditeur de métriques de monitoring sur la règle de collecte de données d’espace de travail.

Créer ou mettre à jour le pod Prometheus de votre compte de service Kubernetes

Souvent, un compte de service Kubernetes est créé et associé au pod exécutant le conteneur Prometheus. Si vous utilisez la pile kube-prometheus, le code crée automatiquement le compte de service prometheus-kube-prometheus-prometheus.

Si aucun compte de service Kubernetes n’est associé à Prometheus à l’exception du compte de service par défaut, créez un compte de service spécifiquement pour le pod exécutant Prometheus.

Pour créer le compte de service, exécutez la commande kubectl suivante :

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 un compte de service Kubernetes autre que le compte de service par défaut est associé à votre pod, ajoutez l’annotation suivante à votre compte de service :

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

Si votre application Microsoft Entra ou votre identité managée affectée par l’utilisateur ne se trouve pas dans le même locataire que votre cluster, ajoutez l’annotation suivante à votre compte de service :

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

Établir des informations d’identification d’identités fédérées entre l’identité et l’émetteur et le sujet du compte de service

Créez des informations d’identification fédérées en utilisant Azure CLI.

Identité managée affectée par l’utilisateur

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

Application 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

Déployer un conteneur sidecar pour configurer l’écriture à distance

Important

Le pod Prometheus doit avoir l’étiquette suivante : azure.workload.identity/use: "true"

Le conteneur side-car d’écriture à distance requiert les valeurs d’environnement suivantes :

  • INGESTION_URL : le point de terminaison d’ingestion des métriques tel qu’il apparaît sur la page Vue d’ensemble pour l’espace de travail Azure Monitor
  • LISTENING_PORT : 8081 (tous les ports sont pris en charge)
  • IDENTITY_TYPE: workloadIdentity
  1. Copiez le code YAML suivant et enregistrez-le dans un fichier. Le code YAML utilise le port 8081 comme port d’écoute. Si vous utilisez un autre port, modifiez cette valeur dans le 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. Remplacez les valeurs suivantes dans le YAML :

    Valeur Description
    <CLUSTER-NAME> Le nom de votre cluster AKS.
    <CONTAINER-IMAGE-VERSION> mcr.microsoft.com/azuremonitor/containerinsights/ciprod/prometheus-remote-write/images:prom-remotewrite-20240617.1
    La version d’image conteneur d’écriture distante.
    <INGESTION-URL> La valeur pour Point de terminaison d’ingestion des métriques de la page Vue d’ensemble de l’espace de travail Azure Monitor.
  3. Utilisez Helm pour appliquer le fichier YAML et mettre à jour votre configuration 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> 
    

Vérification et résolution des problèmes

Pour plus d'informations sur la vérification et la résolution des problèmes, consultez Résolution des problèmes de l'écriture distante et le service géré pour Prometheus Azure Monitor pour l'écriture distante Prometheus.

Étapes suivantes