Supervisión del estado y la actividad de GitOps (Flux v2)

Para supervisar el estado y la actividad relacionados con GitOps con Flux v2 en los clústeres de Kubernetes habilitados para Azure Arc o los clústeres de Azure Kubernetes Service (AKS), tiene varias opciones:

En este tema se describen algunas de las formas en que puede supervisar la actividad y el estado de Flux.

Supervisión de las configuraciones de Flux en Azure Portal

Después de crear configuraciones de Flux en el clúster, puede ver la información de estado en Azure Portal; para ello, vaya a un clúster y seleccione GitOps.

Visualización de detalles sobre el cumplimiento y los objetos del clúster

El estado de Cumplimiento muestra si el estado actual del clúster coincide con el estado deseado. Valores posibles:

  • Compatible: el estado del clúster coincide con el estado deseado.
  • Pendiente: se ha detectado un estado deseado actualizado, pero ese estado aún no se ha reconciliado en el clúster.
  • No compatible: el estado actual no coincide con el estado deseado.

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

Para ayudar a depurar problemas de conciliación de un clúster, seleccione Objetos de configuración. Aquí puede ver los registros de cada uno de los objetos de configuración que Crea Flux para cada configuración de Flux. Seleccione un nombre de objeto para ver sus registros.

Screenshot showing detailed conditions for a configuration object.

Para ver los objetos de Kubernetes que se han creado como resultado de las configuraciones de Flux que se aplican, seleccione Cargas de trabajo en la sección Recursos de Kubernetes del panel de navegación izquierdo del clúster. Aquí puede ver todos los detalles de los recursos que se han creado en el clúster.

De forma predeterminada, puede filtrar por espacio de nombres y nombre de servicio. También puede agregar cualquier filtro de etiqueta que pueda usar en las aplicaciones para ayudar a reducir la búsqueda.

Ver el estado y los detalles de la configuración de Flux

Para cada configuración de Flux, la columna Estado indica si el objeto de configuración flux se ha creado correctamente en el clúster.

Seleccione cualquier configuración de Flux para ver su página de Información general, incluida la siguiente información:

  • Identificador de confirmación de origen para la última sincronización
  • Marca de tiempo de la actualización de origen más reciente
  • Marca de tiempo de la actualización de estado (que indica cuándo se obtuvieron las estadísticas más recientes)
  • Dirección URL y rama del repositorio
  • Vínculos para ver diferentes personalizaciones

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

Uso de paneles para supervisar el estado y la actividad de GitOps

Proporcionamos paneles que le ayudarán a supervisar el estado, el cumplimiento, el consumo de recursos y la actividad de conciliación para GitOps con Flux v2. Estos paneles JSON se pueden importar a Grafana para ayudarle a ver y analizar los datos en tiempo real. También puede configurar alertas para esta información.

Para importar y usar estos paneles, necesita:

Supervisión del estado de implementación y cumplimiento

Siga estos pasos para importar paneles que le permiten supervisar la implementación y el estado de la extensión de Flux entre clústeres y el estado de cumplimiento de la configuración de Flux en esos clústeres.

Nota:

En estos pasos se describe el proceso para importar el panel a Azure Managed Grafana. También puede importar este panel a cualquier instancia de Grafana. Con esta opción, se debe usar una entidad de servicio. No se admite la identidad administrada para la conexión de datos fuera de Azure Managed Grafana.

  1. Cree una instancia de Azure Managed Grafana mediante Azure Portal o la CLI de Azure. Asegúrese de que puede acceder a Grafana seleccionando su punto de conexión en la página de Información general. Necesita al menos permisos de nivel de Editor de Grafana para ver y editar paneles. Para comprobar el acceso, vaya a Control de acceso (IAM) en la instancia de Grafana.

  2. Si usa una identidad administrada para la instancia de Azure Managed Grafana, siga estos pasos para asignarle el rol Lector de supervisión en las suscripciones:

    1. En Azure Portal, vaya a la suscripción que desea agregar.
    2. Seleccione Access Control (IAM) .
    3. Seleccione Agregar asignación de roles.
    4. Seleccione el rol Lector de supervisión y, a continuación, seleccione Siguiente.
    5. En la pestaña Miembros, seleccione Identidad administraday, después, elija Seleccionar miembros.
    6. En la lista Identidad administrada, seleccione la suscripción donde creó la instancia de Azure Managed Grafana. A continuación, seleccione Azure Managed Grafana y el nombre de la instancia de Azure Managed Grafana.
    7. Seleccione Revisar y asignar.

    Si usa una entidad de servicio, conceda el rol Lector de supervisión a la entidad de servicio que usará para la conexión del origen de datos. Siga estos mismos pasos, pero seleccione Usuario, grupo o entidad de servicio en la pestaña Miembros y, a continuación, seleccione la entidad de servicio. (Si no usa Azure Managed Grafana, debe usar una entidad de servicio para el acceso a la conexión de datos).

  3. Cree la conexión del origen de datos de Azure Monitor en la instancia de Azure Managed Grafana. Esta conexión permite al panel acceder a los datos de Azure Resource Graph.

  4. Descargue el panel GitOps Flux - Implementaciones de aplicaciones.

  5. Siga los pasos para importar el panel JSON a Grafana.

Después de importar el panel, mostrará información de los clústeres que está supervisando, con varios paneles que proporcionan detalles. Para más información sobre un elemento, seleccione el vínculo para visitar Azure Portal, donde puede encontrar más información sobre configuraciones, errores y registros.

Screenshot of the Flux Application Deployments Dashboard.

En la tabla Estado de implementación de la extensión Flux se enumeran todos los clústeres en los que se implementa la extensión Flux, junto con el estado de implementación actual.

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

En la tabla Estado de cumplimiento de configuración de Flux se enumeran todas las configuraciones de Flux creadas en los clústeres, junto con su estado de cumplimiento. Para ver los registros de estado y errores de objetos de configuración, como versiones de Helm y personalizaciones, seleccione el vínculo No compatible de la columna ComplianceState.

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

El gráfico Recuento de implementaciones de extensiones de Flux por estado muestra el recuento de clústeres, en función de su estado de aprovisionamiento.

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

El gráfico Recuento de configuraciones de Flux por estado de cumplimiento muestra el recuento de configuraciones de Flux, en función de su estado de cumplimiento con respecto al repositorio de origen.

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

Filtrar los datos del panel para realizar un seguimiento de las implementaciones de aplicaciones

Puede filtrar los datos en el panel de GitOps Flux - Implementaciones de aplicación para cambiar la información que se muestra. Por ejemplo, puede mostrar datos solo para determinadas suscripciones o grupos de recursos, o limitar los datos a un clúster determinado. Para ello, seleccione la opción de filtro en las listas desplegables de nivel superior o en cualquier encabezado de columna de las tablas.

Por ejemplo, en la tabla Estado de cumplimiento de configuración de Flux, puede seleccionar una confirmación específica en la columna SourceLastSyncCommit. Al hacerlo, puede realizar un seguimiento del estado de una implementación de configuración en todos los clústeres afectados por esa confirmación.

Creación de alertas para errores de extensión y configuración

Después de importar el panel como se describe en la sección anterior, puede configurar alertas. Estas alertas le notifican cuando las extensiones de Flux o las configuraciones de Flux experimentan errores.

Siga los pasos siguientes para crear una alerta. Se proporcionan consultas de ejemplo para detectar errores de aprovisionamiento de extensiones o de actualización de extensiones, o para detectar errores de estado de cumplimiento.

  1. En el menú de navegación izquierdo del panel, seleccione Alertas.

  2. Selección de Reglas de alerta.

  3. Seleccione + Crear regla de alertas. Se abre la página nueva regla de alertas, con la opción Alertas administradas de Grafana seleccionada de forma predeterminada.

  4. En Nombre de regla, agregue un nombre descriptivo. Este nombre se muestra en la lista de reglas de alertas y se usará como la etiqueta alertname para cada instancia de alerta creada a partir de esta regla.

  5. En Establecer una consulta y una condición de alerta:

    • Seleccionar un origen de datos. Aquí se puede usar el mismo origen de datos que se usa para el panel.

    • En Servicio, seleccione Azure Resource Graph.

    • Seleccione las suscripciones en la lista desplegable.

    • Escriba la consulta que desea usar. Por ejemplo, para errores de aprovisionamiento o actualización de extensiones, puede escribir esta consulta:

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

      O bien, para errores de estado de cumplimiento, puede escribir esta consulta:

      kubernetesconfigurationresources
      | where type == "microsoft.kubernetesconfiguration/fluxconfigurations"
      | extend complianceState=tostring(properties.complianceState)
      | where complianceState == "Non-Compliant"
      | summarize count() by complianceState
      
    • En cuadro Umbral, seleccione A para el tipo de entrada y establezca el umbral en 0 para recibir alertas incluso si solo se produce un error en una extensión en el clúster. Marque esto como la Condición de alerta.

    Screenshot showing the alert creation process.

  6. Especifique el intervalo de evaluación de alertas:

    • En Condición, seleccione la consulta o expresión para desencadenar la regla de alerta.
    • En Evaluar cada, escriba la frecuencia de evaluación como múltiplo de 10 segundos.
    • En Evaluar para, especifique cuánto tiempo debe cumplirse la condición antes de crear la alerta.
    • En Configurar ningún dato y control de errores, indique lo que debe ocurrir cuando la regla de alerta no devuelve datos ni devuelve un error.
    • Para comprobar los resultados de la ejecución de la consulta, seleccione Vista previa.
  7. Agregue la ubicación de almacenamiento, el grupo de reglas y los metadatos adicionales que quiera asociar a la regla.

    • En Carpeta, seleccione la carpeta donde se debe almacenar la regla.
    • En Grupo, especifique un grupo predefinido.
    • Si lo desea, agregue una descripción y un resumen para personalizar los mensajes de alerta.
    • Agregue los identificadores de dirección URL, panel, panel y alertas de runbook según sea necesario.
  8. Si lo desea, agregue etiquetas personalizadas. Después, seleccione Guardar.

También puede configurar puntos de contacto y configurar directivas de notificación para las alertas.

Supervisión del consumo de recursos y las reconciliaciones

Siga estos pasos para importar paneles que le permiten supervisar el consumo de recursos de Flux, las reconciliaciones, las solicitudes de API y el estado del reconciliador.

  1. Siga los pasos para crear un área de trabajo de Azure Monitor.

  2. Cree una instancia de Azure Managed Grafana mediante Azure Portal o la CLI de Azure.

  3. Habilite la recopilación de métricas de Prometheus en los clústeres de AKS o en los clústeres de Kubernetes habilitados para Arc que quiera supervisar.

  4. Configure el agente de Azure Monitor para extraer las métricas de Azure Managed Flux mediante la creación de un mapa de configuración:

    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. Descargue los paneles Plano de control de Flux y Estadísticas de clúster de Flux.

  6. Vincule el área de trabajo de Prometheus administrado a la instancia de Grafana administrado. Este procedimiento tarda unos minutos en completarse.

  7. Siga los pasos para importar estos paneles JSON a Grafana.

Después de importar los paneles, mostrarán información de los clústeres que está supervisando. Para mostrar información solo para un clúster o espacio de nombres determinado, use los filtros cerca de la parte superior de cada panel.

El panel Plano de control de Flux muestra detalles sobre el consumo de recursos de estado, las reconciliaciones en el nivel de clúster y las solicitudes de API de Kubernetes.

Screenshot of the Flux Control Plane dashboard.

El panel Estadísticas de clúster de Flux muestra detalles sobre el número de reconciliadores, junto con el estado y la duración de ejecución de cada reconciliador.

Screenshot of the Flux Cluster Stats dashboard.

Creación de alertas para problemas de conciliación y consumo de recursos

Después de importar el panel como se describe en la sección anterior, puede configurar alertas. Estas alertas le notifican los problemas de conciliación y consumo de recursos que pueden requerir atención.

Para habilitar estas alertas, implemente una plantilla de Bicep similar a la que se muestra aquí. Las reglas de alerta de esta plantilla son ejemplos que se pueden modificar según sea necesario.

Una vez que haya descargado la plantilla de Bicep y realizado los cambios, siga estos pasos para implementar la plantilla.

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

Pasos siguientes