Share via


Surveiller l’état et l’activité gitOps (Flux v2)

Pour surveiller l’état et l’activité liés à GitOps avec Flux v2 dans vos clusters Kubernetes avec Azure Arc ou azure Kubernetes Service (AKS), vous avez plusieurs options :

Cette rubrique décrit certaines des façons dont vous pouvez surveiller votre activité flux et votre état.

Surveiller les configurations de flux dans le portail Azure

Une fois que vous avez créé des configurations flux sur votre cluster, vous pouvez afficher les informations d’état dans le portail Azure en accédant à un cluster et en sélectionnant GitOps.

Afficher des détails sur la conformité du cluster et les objets

L’état Conformité indique si l’état actuel du cluster correspond à l’état souhaité. Valeurs possibles :

  • Conforme : l’état du cluster correspond à l’état souhaité.
  • En attente : un état souhaité mis à jour a été détecté, mais cet état n’a pas encore été rapproché sur le cluster.
  • Non conforme: l’état actuel ne correspond pas à l’état souhaité.

Screenshot of cluster compliance and other values in the Azure portal.

Pour faciliter le débogage des problèmes de rapprochement d’un cluster, sélectionnez objets Configuration. Ici, vous pouvez afficher les journaux d’activité de chacun des objets de configuration créés par Flux pour chaque configuration flux. Sélectionnez un nom d’objet pour afficher ses journaux d’activité.

Screenshot showing detailed conditions for a configuration object.

Pour afficher les objets Kubernetes qui ont été créés suite à l’application des configurations flux, sélectionnez Charges de travail dans les ressources Kubernetes section du volet de navigation gauche du cluster. Ici, vous pouvez afficher tous les détails de toutes les ressources qui ont été créées sur le cluster.

Par défaut, vous pouvez filtrer par espace de noms et par nom de service. Vous pouvez également ajouter n’importe quel filtre d’étiquette que vous utilisez peut-être dans vos applications pour vous aider à affiner la recherche.

Afficher l’état et les détails de la configuration de flux

Pour chaque configuration flux, la colonne d’état indique si l’objet de configuration Flux a été créé avec succès sur le cluster.

Sélectionnez n’importe quelle configuration flux pour afficher sa page Vue d’ensemble, y compris les informations suivantes :

  • ID de validation source pour la dernière synchronisation
  • Horodatage de la dernière mise à jour source
  • Horodatage de mise à jour de l’état (indiquant quand les statistiques les plus récentes ont été obtenues)
  • URL et branche du dépôt
  • Liens pour afficher différentes kustomizations

Screenshot of the Overview page of a Flux configuration in the Azure portal.

Utiliser des tableaux de bord pour surveiller l’état et l’activité GitOps

Nous fournissons des tableaux de bord pour vous aider à surveiller l’état, la conformité, la consommation des ressources et l’activité de rapprochement pour GitOps avec Flux v2. Ces tableaux de bord JSON peuvent être importés dans Grafana pour vous aider à afficher et analyser vos données en temps réel. Vous pouvez également configurer des alertes pour ces informations.

Pour importer et utiliser ces tableaux de bord, vous avez besoin des éléments suivants :

Surveiller l’état du déploiement et de la conformité

Suivez ces étapes pour importer des tableaux de bord qui vous permettent de surveiller le déploiement et l’état de l’extension Flux sur les clusters, ainsi que l’état de conformité de la configuration flux sur ces clusters.

Remarque

Ces étapes décrivent le processus d’importation du tableau de bord dans Azure Managed Grafana. Vous pouvez également importer ce tableau de bord dans n’importe quelle instance Grafana. Avec cette option, un principal de service doit être utilisé ; L’identité managée n’est pas prise en charge pour la connexion de données en dehors d’Azure Managed Grafana.

  1. Créez une instance Azure Managed Grafana à l’aide du portail Azure ou Azure CLI. Vérifiez que vous êtes en mesure d’accéder à Grafana en sélectionnant son point de terminaison sur la page Vue d’ensemble. Vous avez besoin d’au moins Éditeur Grafana autorisations de niveau pour afficher et modifier des tableaux de bord. Vous pouvez vérifier votre accès en accédant à contrôle d’accès (IAM) sur l’instance Grafana.

  2. Si vous utilisez une identité managée pour l’instance Azure Managed Grafana, procédez comme suit pour lui attribuer le rôle Lecteur de supervision sur le ou les abonnements :

    1. Dans le portail Azure, accédez à l’abonnement que vous souhaitez ajouter.
    2. Sélectionnez Contrôle d’accès (IAM) .
    3. Sélectionnez Ajouter une attribution de rôle.
    4. Sélectionnez le rôle lecteur de surveillance, puis sélectionnez suivant.
    5. Sous l’onglet Membres, sélectionnez Identité managée, puis choisissez Sélectionner des membres.
    6. Dans la liste des identités managées, sélectionnez l’abonnement dans lequel vous avez créé votre instance Azure Managed Grafana. Sélectionnez ensuite Azure Managed Grafana et le nom de votre instance Azure Managed Grafana.
    7. Sélectionnez Vérifier + attribuer.

    Si vous utilisez un principal de service, accordez le rôle Lecteur de surveillance au principal de service que vous utiliserez pour votre connexion de source de données. Suivez ces mêmes étapes, mais sélectionnez Utilisateur, groupe ou principal de service dans l’onglet Membres, puis sélectionnez votre principal de service. (Si vous n’utilisez pas Azure Managed Grafana, vous devez utiliser un principal de service pour l’accès aux connexions de données.)

  3. Créer la connexion de source de données Azure Monitor dans votre instance Azure Managed Grafana. Cette connexion permet au tableau de bord d’accéder aux données Azure Resource Graph.

  4. Téléchargez le tableau de bord GitOps Flux : Déploiements d’applications.

  5. Suivez les étapes pour importer le tableau de bord JSON dans Grafana.

Une fois que vous avez importé le tableau de bord, il affiche des informations à partir des clusters que vous surveillez, avec plusieurs panneaux qui fournissent des détails. Pour plus d’informations sur un élément, sélectionnez le lien permettant de visiter le portail Azure, où vous trouverez plus d’informations sur les configurations, les erreurs et les journaux.

Screenshot of the Flux Application Deployments Dashboard.

La table état du déploiement de l’extension flux répertorie tous les clusters où l’extension Flux est déployée, ainsi que l’état actuel du déploiement.

Screenshot showing the Flux Extension Deployments Status table in the Application Deployments dashboard.

Le tableau État de conformité de la configuration des flux répertorie toutes les configurations flux créées sur les clusters, ainsi que leur état de conformité. Pour afficher les journaux d’état et d’erreur pour les objets de configuration tels que les mises en production Helm et les kustomizations, sélectionnez le lien non conforme dans la colonne ComplianceState.

Screenshot showing the Flux Configuration Compliance Status table in the Application Deployments dashboard.

Le graphique Nombre de déploiements d'extensions de flux par statut affiche le nombre de clusters, en fonction de leur état d’approvisionnement.

Screenshot of the Flux Extension Deployments by Status pie chart in the Application Deployments dashboard.

Le graphique Nombre de configurations de flux par état de conformité montre le nombre de configurations flux, en fonction de leur état de conformité par rapport au référentiel source.

Screenshot of the Flux Configuration by Compliance Status chart on the Application Deployments dashboard.

Filtrer les données du tableau de bord pour suivre les déploiements d’applications

Vous pouvez filtrer les données dans le tableau de bord GitOps Flux - Déploiements d’applications pour modifier les informations affichées. Par exemple, vous pouvez afficher des données pour certains abonnements ou groupes de ressources uniquement, ou limiter les données à un cluster particulier. Pour ce faire, sélectionnez l’option de filtre dans les listes déroulantes de niveau supérieur ou dans n’importe quel en-tête de colonne dans les tables.

Par exemple, dans la table État de conformité de la configuration de flux, vous pouvez sélectionner une validation spécifique dans la colonne SourceLastSyncCommit. Pour ce faire, vous pouvez suivre l’état d’un déploiement de configuration sur tous les clusters affectés par cette validation.

Créer des alertes pour les échecs d’extension et de configuration

Une fois que vous avez importé le tableau de bord comme décrit dans la section précédente, vous pouvez configurer des alertes. Ces alertes vous avertissent lorsque les extensions de flux ou les configurations flux rencontrent des échecs.

Suivez les étapes ci-dessous pour créer une alerte. Les exemples de requêtes sont fournis pour détecter les échecs d’approvisionnement d’extensions ou de mise à niveau d’extension, ou pour détecter les échecs d’état de conformité.

  1. Dans le menu de navigation de gauche du tableau de bord, sélectionnez alertes.

  2. Sélectionnez Règles d’alerte.

  3. Sélectionnez + Créer une règle d’alerte. La nouvelle page de règle d’alerte s’ouvre, avec les alertes gérées Grafana option sélectionnée par défaut.

  4. Dans nom de règle, ajoutez un nom descriptif. Ce nom s’affiche dans la liste des règles d’alerte, et il sera utilisé comme étiquette alertname pour chaque instance d’alerte créée à partir de cette règle.

  5. Sous Définir une condition de requête et d’alerte:

    • Sélectionnez une source de données. La même source de données utilisée pour le tableau de bord peut être utilisée ici.

    • Pour Service, sélectionnez Azure Resource Graph.

    • Sélectionnez les abonnements dans la liste déroulante.

    • Entrez la requête que vous souhaitez utiliser. Par exemple, pour les échecs d’approvisionnement d’extensions ou de mise à niveau, vous pouvez entrer cette requête :

      kubernetesconfigurationresources
      | where type == "microsoft.kubernetesconfiguration/extensions"
      | extend provisioningState = tostring(properties.ProvisioningState)
      | where provisioningState == "Failed"
      | summarize count() by provisioningState
      

      Ou pour les échecs d’état de conformité, vous pouvez entrer cette requête :

      kubernetesconfigurationresources
      | where type == "microsoft.kubernetesconfiguration/fluxconfigurations"
      | extend complianceState=tostring(properties.complianceState)
      | where complianceState == "Non-Compliant"
      | summarize count() by complianceState
      
    • Pour zone Seuil, sélectionnez A pour le type d’entrée et définissez le seuil sur 0 pour recevoir des alertes même si une seule extension échoue sur le cluster. Marquez-la comme condition d’alerte .

    Screenshot showing the alert creation process.

  6. Spécifiez l’intervalle d’évaluation de l’alerte :

    • Pour Condition, sélectionnez la requête ou l’expression pour déclencher la règle d’alerte.
    • Pour Évaluer tout, entrez la fréquence d’évaluation sous la forme d’un multiple de 10 secondes.
    • Pour Évaluer pour, spécifiez la durée pendant laquelle la condition doit être vraie avant la création de l’alerte.
    • Dans Configurer aucune donnée et gestion des erreurs, indiquez ce qui doit se produire lorsque la règle d’alerte ne retourne aucune donnée ou retourne une erreur.
    • Pour vérifier les résultats de l’exécution de la requête, sélectionnez Aperçu.
  7. Ajoutez l’emplacement de stockage, le groupe de règles et toutes les métadonnées supplémentaires que vous souhaitez associer à la règle.

    • Pour Dossier, sélectionnez le dossier dans lequel la règle doit être stockée.
    • Pour Groupe, spécifiez un groupe prédéfini.
    • Si vous le souhaitez, ajoutez une description et un résumé pour personnaliser les messages d’alerte.
    • Ajoutez l’URL du Runbook, le panneau, le tableau de bord et les ID d’alerte en fonction des besoins.
  8. Si vous le souhaitez, ajoutez des étiquettes personnalisées. Ensuite, sélectionnez Enregistrer.

Vous pouvez également configurer des points de contact et configurer des stratégies de notification pour vos alertes.

Surveiller la consommation et les rapprochements des ressources

Suivez ces étapes pour importer des tableaux de bord qui vous permettent de surveiller la consommation des ressources Flux, les rapprochements, les demandes d’API et l’état du rapprochement.

  1. Suivez les étapes pour créer un espace de travail Azure Monitor.

  2. Créez une instance Azure Managed Grafana à l’aide du portail Azure ou Azure CLI.

  3. Activez la collecte de métriques Prometheus sur les clusters AKS et/ou clusters Kubernetes avec Arc que vous souhaitez surveiller.

  4. Configurez l’agent Azure Monitor pour supprimer les métriques Azure Managed Flux en créant un configmap:

    kind: ConfigMap
    apiVersion: v1
    data:
      schema-version:
          #string.used by agent to parse config. supported versions are {v1}. Configs with other schema versions will be rejected by the agent.
        v1
      config-version:
        #string.used by customer to keep track of this config file's version in their source control/repository (max allowed 10 chars, other chars will be truncated)
        ver1
      default-scrape-settings-enabled: |-
        kubelet = true
        coredns = false
        cadvisor = true
        kubeproxy = false
        apiserver = false
        kubestate = true
        nodeexporter = true
        windowsexporter = false
        windowskubeproxy = false
        kappiebasic = true
        prometheuscollectorhealth = false
      # Regex for which namespaces to scrape through pod annotation based scraping.
      # This is none by default. Use '.*' to scrape all namespaces of annotated pods.
      pod-annotation-based-scraping: |-
        podannotationnamespaceregex = "flux-system"
      default-targets-scrape-interval-settings: |-
        kubelet = "30s"
        coredns = "30s"
        cadvisor = "30s"
        kubeproxy = "30s"
        apiserver = "30s"
        kubestate = "30s"
        nodeexporter = "30s"
        windowsexporter = "30s"
        windowskubeproxy = "30s"
        kappiebasic = "30s"
        prometheuscollectorhealth = "30s"
        podannotations = "30s"
    metadata:
      name: ama-metrics-settings-configmap
      namespace: kube-system
    
  5. Téléchargez le plan de contrôle de flux et les tableaux de bord Flux Cluster Stats.

  6. Lier l’espace de travail Prometheus managé à l’instance Managed Grafana. Ceci prend quelques minutes.

  7. Suivez les étapes pour importer ces tableaux de bord JSON dans Grafana.

Une fois que vous avez importé les tableaux de bord, ils affichent des informations à partir des clusters que vous surveillez. Pour afficher des informations uniquement pour un cluster ou un espace de noms particulier, utilisez les filtres situés en haut de chaque tableau de bord.

Le tableau de bord plan de contrôle flux affiche des détails sur la consommation des ressources d’état, les rapprochements au niveau du cluster et les demandes d’API Kubernetes.

Screenshot of the Flux Control Plane dashboard.

Le tableau de bord Flux Cluster Stats affiche des détails sur le nombre de rapprochements, ainsi que l’état et la durée d’exécution de chaque rapprochement.

Screenshot of the Flux Cluster Stats dashboard.

Créer des alertes pour la consommation des ressources et les problèmes de rapprochement

Une fois que vous avez importé le tableau de bord comme décrit dans la section précédente, vous pouvez configurer des alertes. Ces alertes vous informent des problèmes de consommation et de rapprochement des ressources qui peuvent nécessiter une attention particulière.

Pour activer ces alertes, vous déployez un modèle Bicep similaire à celui présenté ici. Les règles d’alerte de ce modèle sont des exemples qui peuvent être modifiés selon les besoins.

Une fois que vous avez téléchargé le modèle Bicep et apporté vos modifications, suivez ces étapes pour déployer le modèle.

param azureMonitorWorkspaceName string
param alertReceiverEmailAddress string

param kustomizationLookbackPeriodInMinutes int = 5
param helmReleaseLookbackPeriodInMinutes int = 5
param gitRepositoryLookbackPeriodInMinutes int = 5
param bucketLookbackPeriodInMinutes int = 5
param helmRepoLookbackPeriodInMinutes int = 5
param timeToResolveAlerts string = 'PT10M'
param location string = resourceGroup().location

resource azureMonitorWorkspace 'Microsoft.Monitor/accounts@2023-04-03' = {
  name: azureMonitorWorkspaceName
  location: location
}

resource fluxRuleActionGroup 'Microsoft.Insights/actionGroups@2023-01-01' = {
  name: 'fluxRuleActionGroup'
  location: 'global'
  properties: {
    enabled: true
    groupShortName: 'fluxGroup'
    emailReceivers: [
      {
        name: 'emailReceiver'
        emailAddress: alertReceiverEmailAddress
      }
    ]
  }
}

resource fluxRuleGroup 'Microsoft.AlertsManagement/prometheusRuleGroups@2023-03-01' = {
  name: 'fluxRuleGroup'
  location: location
  properties: {
    description: 'Flux Prometheus Rule Group'
    scopes: [
      azureMonitorWorkspace.id
    ]
    enabled: true
    interval: 'PT1M'
    rules: [
      {
        alert: 'KustomizationNotReady'
        expression: 'sum by (cluster, namespace, name) (gotk_reconcile_condition{type="Ready", status="False", kind="Kustomization"}) > 0'
        for: 'PT${kustomizationLookbackPeriodInMinutes}M'
        labels: {
          description: 'Kustomization reconciliation failing for last ${kustomizationLookbackPeriodInMinutes} minutes.'
        }
        annotations: {
          description: 'Kustomization reconciliation failing for last ${kustomizationLookbackPeriodInMinutes} minutes.'
        }
        enabled: true
        severity: 3
        resolveConfiguration: {
          autoResolved: true
          timeToResolve: timeToResolveAlerts
        }
        actions: [
          {
            actionGroupId: fluxRuleActionGroup.id
          }
        ]
      }
      {
        alert: 'HelmReleaseNotReady'
        expression: 'sum by (cluster, namespace, name) (gotk_reconcile_condition{type="Ready", status="False", kind="HelmRelease"}) > 0'
        for: 'PT${helmReleaseLookbackPeriodInMinutes}M'
        labels: {
          description: 'HelmRelease reconciliation failing for last ${helmReleaseLookbackPeriodInMinutes} minutes.'
        }
        annotations: {
          description: 'HelmRelease reconciliation failing for last ${helmReleaseLookbackPeriodInMinutes} minutes.'
        }
        enabled: true
        severity: 3
        resolveConfiguration: {
          autoResolved: true
          timeToResolve: timeToResolveAlerts
        }
        actions: [
          {
            actionGroupId: fluxRuleActionGroup.id
          }
        ]
      }
      {
        alert: 'GitRepositoryNotReady'
        expression: 'sum by (cluster, namespace, name) (gotk_reconcile_condition{type="Ready", status="False", kind="GitRepository"}) > 0'
        for: 'PT${gitRepositoryLookbackPeriodInMinutes}M'
        labels: {
          description: 'GitRepository reconciliation failing for last ${gitRepositoryLookbackPeriodInMinutes} minutes.'
        }
        annotations: {
          description: 'GitRepository reconciliation failing for last ${gitRepositoryLookbackPeriodInMinutes} minutes.'
        }
        enabled: true
        severity: 3
        resolveConfiguration: {
          autoResolved: true
          timeToResolve: timeToResolveAlerts
        }
        actions: [
          {
            actionGroupId: fluxRuleActionGroup.id
          }
        ]
      }
      {
        alert: 'BucketNotReady'
        expression: 'sum by (cluster, namespace, name) (gotk_reconcile_condition{type="Ready", status="False", kind="Bucket"}) > 0'
        for: 'PT${bucketLookbackPeriodInMinutes}M'
        labels: {
          description: 'Bucket reconciliation failing for last ${bucketLookbackPeriodInMinutes} minutes.'
        }
        annotations: {
          description: 'Bucket reconciliation failing for last ${bucketLookbackPeriodInMinutes} minutes.'
        }
        enabled: true
        severity: 3
        resolveConfiguration: {
          autoResolved: true
          timeToResolve: timeToResolveAlerts
        }
        actions: [
          {
            actionGroupId: fluxRuleActionGroup.id
          }
        ]
      }
      {
        alert: 'HelmRepositoryNotReady'
        expression: 'sum by (cluster, namespace, name) (gotk_reconcile_condition{type="Ready", status="False", kind="HelmRepository"}) > 0'
        for: 'PT${helmRepoLookbackPeriodInMinutes}M'
        labels: {
          description: 'HelmRepository reconciliation failing for last ${helmRepoLookbackPeriodInMinutes} minutes.'
        }
        annotations: {
          description: 'HelmRepository reconciliation failing for last ${helmRepoLookbackPeriodInMinutes} minutes.'
        }
        enabled: true
        severity: 3
        resolveConfiguration: {
          autoResolved: true
          timeToResolve: timeToResolveAlerts
        }
        actions: [
          {
            actionGroupId: fluxRuleActionGroup.id
          }
        ]
      }
    ]
  }
}

Étapes suivantes