Share via


GitOps (Flux v2) の状態とアクティビティを監視する

Azure Arc 対応 Kubernetes クラスターまたは Azure Kubernetes Service (AKS) クラスターで Flux v2 を使用して GitOps に関連する状態とアクティビティを監視するには、いくつかのオプションがあります。

このトピックでは、Flux のアクティビティと状態を監視する方法のいくつかを説明します。

Azure portal で Flux 構成を監視する

クラスターに Flux 構成を作成したら、クラスターに移動し、GitOps を選択して、Azure portal で状態情報を表示することができます。

クラスターのコンプライアンスとオブジェクトの詳細を表示する

コンプライアンスの状態は、クラスターの現在の状態が必要な状態になっているかどうかを示します。 指定できる値

  • 準拠している: クラスターの状態が必要な状態になっています。
  • 保留中: 更新された必要な状態が検出されましたが、その状態はまだクラスターで調整されていません。
  • 準拠していない: 現在の状態が必要な状態になっていません。

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

クラスターの調整の問題をデバッグするには、構成オブジェクトを選択します。 ここでは、Flux が各 Flux 構成向けに作成する各構成オブジェクトのログを表示できます。 ログを表示するオブジェクト名を選択します。

Screenshot showing detailed conditions for a configuration object.

Flux 構成が適用されて作成された Kubernetes オブジェクトを表示するには、クラスターの左側のナビゲーション ウィンドウの [Kubernetes リソース] セクションで [Workloads] を選択します。 ここでは、クラスターで作成されたすべてのリソースのすべての詳細を表示できます。

既定では、名前空間とサービス名でフィルター処理できます。 アプリケーションで使用している可能性のあるラベル フィルターを追加して、検索を絞り込むこともできます。

Flux の構成状態と詳細を表示する

各 Flux 構成の [状態] 列には、Flux 構成オブジェクトがクラスターに正常に作成されたかどうかが表示されます。

Flux 構成を選択すると、次の情報を含む [概要] ページが表示されます。

  • 最後の同期のソース コミット ID
  • 最新のソース更新プログラムのタイムスタンプ
  • 状態更新タイムスタンプ (最新の統計が取得された日時を示す)
  • リポジトリの URL とブランチ
  • さまざまな kustomization を表示するためのリンク

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

ダッシュボードを使用して GitOps の状態とアクティビティを監視する

Flux v2 を使用して GitOps の状態、コンプライアンス、リソース消費量、調整アクティビティを監視するのに役立つダッシュボードをご用意しています。 これらの JSON ダッシュボードを Grafana にインポートして、リアルタイムでデータを表示および分析できます。 この情報のアラートを設定することもできます。

これらのダッシュボードをインポートして使用するには、次のものが必要です。

  • 1 つ以上の既存の Arc 対応 Kubernetes クラスターまたは AKS クラスター。
  • クラスターに microsoft.flux 拡張機能がインストールされている。
  • クラスターに 1 つ以上の Flux 構成 が作成されている。

デプロイとコンプライアンスの状態を監視する

さまざまなクラスターの Flux 拡張機能のデプロイと状態、およびそれらのクラスターでの Flux 構成のコンプライアンス状態を監視できるダッシュボードをインポートするには、次の手順に従います。

Note

次の手順では、ダッシュボードを Azure Managed Grafana にインポートするプロセスについて説明します。 また、このダッシュボードを任意の Grafana インスタンスにインポートすることもできます。 このオプションでは、サービス プリンシパルを使用する必要があります。マネージド ID は、Azure Managed Grafana 外のデータ接続ではサポートされていません。

  1. Azure portalAzure CLI を使用して、Azure Managed Grafana インスタンスを作成します。 [概要] ページでエンドポイントを選択して、Grafana にアクセスできることを確認します。 ダッシュボードを表示および編集するには、少なくとも Grafana Editor レベルのアクセス許可が必要です。 アクセスを確認するには、Grafana インスタンスでアクセス制御 (IAM) に移動します。

  2. Azure Managed Grafana インスタンスのマネージド ID を使用している場合は、次の手順に従って、サブスクリプションの監視閲覧者ロールを割り当てます。

    1. Azure portal で、追加するサブスクリプションに移動します。
    2. [アクセス制御 (IAM)] を選択します。
    3. [ロールの割り当ての追加] を選択します。
    4. [監視閲覧者] ロールを選択し、[次へ] を選択します。
    5. [メンバー] タブで、[マネージド ID] を選択し、[メンバーの選択] を選択します。
    6. マネージド ID の一覧から、Azure Managed Grafana インスタンスを作成したサブスクリプションを選択します。 その後、Azure Managed Grafana と Azure Managed Grafana インスタンスの名前を選択します。
    7. [レビューと割り当て] を選択します。

    サービス プリンシパルを使用している場合は、データ ソース接続に使用するサービス プリンシパルに 監視閲覧者 ロールを付与します。 同じ手順に従い、今度は [メンバー] タブで [ユーザー、グループ、またはサービス プリンシパル] を選択してから、サービス プリンシパルを選択します。 (Azure Managed Grafana を使用していない場合は、データ接続アクセスにサービス プリンシパルを使用する必要があります)。

  3. Azure Managed Grafana インスタンスに Azure Monitor データ ソース接続を作成します。 この接続により、ダッシュボードは Azure Resource Graph データにアクセスできるようになります。

  4. GitOps Flux - アプリケーション デプロイ ダッシュボードをダウンロードします。

  5. 手順に従って、JSON ダッシュボード Grafana にインポートします。

ダッシュボードをインポートすると、監視しているクラスターの情報と、詳細を提供するいくつかのパネルが表示されます。 項目の詳細を見るには、Azure portal にアクセスするためのリンクを選択します。Azure portal には、構成、エラー、ログに関する詳細情報が表示されます。

Screenshot of the Flux Application Deployments Dashboard.

[Flux 拡張機能のデプロイ状態] の表には、Flux 拡張機能がデプロイされているすべてのクラスターと、現在のデプロイ状態が一覧表示されます。

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

[Flux 構成のコンプライアンス状態] の表には、クラスターで作成されたすべての Flux 構成とそのコンプライアンス状態が一覧表示されます。 Helm リリースや kustomizations などの構成オブジェクトの状態とエラー ログを表示するには、[ComplianceState] 列から [非準拠] リンクを選択します。

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

[状態別の Flux 拡張機能のデプロイの数] のグラフには、クラスターのプロビジョニング状態に基づくクラスターの数が表示されます。

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

[コンプライアンス状態別の Flux 構成の数] のグラフには、ソース リポジトリに関するコンプライアンス状態に基づいて Flux 構成の数が表示されます。

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

ダッシュボード データをフィルター処理してアプリケーションのデプロイを追跡する

GitOps Flux - アプリケーション デプロイ ダッシュボードでデータをフィルター処理して、表示される情報を変更できます。 たとえば、特定のサブスクリプションまたはリソース グループのみのデータを表示したり、特定のクラスターにデータを制限したりできます。 これを行うには、一番上のドロップダウン、またはテーブル内の任意の列ヘッダーからフィルター オプションを選択します。

たとえば、[Flux 構成のコンプライアンス状態] の表で、[SourceLastSyncCommit] 列から特定のコミットを選択できます。 こうすると、そのコミットの影響を受けるすべてのクラスターに対する構成デプロイの状態を追跡できます。

拡張機能と構成のエラーに関するアラートを作成する

前のセクションで説明したようにダッシュボードをインポートしたら、アラートを設定できます。 これらのアラートは、Flux 拡張機能または Flux 構成でエラーが発生した場合に通知を送信します。

アラートを作成するには、次の手順に従います。 拡張機能のプロビジョニングの失敗やアップグレードの失敗を検出したり、コンプライアンス状態のエラーを検出したりするためのクエリ例が用意されています。

  1. ダッシュボードの左側のナビゲーション メニューで、[アラート設定] を選択します。

  2. 警告ルールを選択します。

  3. [+ アラート ルールの作成] を選択します。 新しい [アラート ルール] ページが開きます。既定では [Grafana マネージド アラート] オプションが選択されています。

  4. [ルール名] で、わかりやすい名前を追加します。 この名前はアラート ルールの一覧に表示され、このルールに基づいて作成されたすべてのアラート インスタンスの alertname ラベルとして使用されます。

  5. [クエリとアラート条件の設定] で以下のようにします。

    • データ ソースを選択。 ここでは、ダッシュボードに使用されるのと同じデータ ソースを使用できます。

    • [サービス] で、[Azure Resource Graph] を選択します。

    • ドロップダウン リストからサブスクリプションを選択します。

    • 使用するクエリを入力します。 たとえば、拡張機能のプロビジョニングの失敗やアップグレードの失敗の場合は、次のクエリを入力できます。

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

      または、コンプライアンス状態エラーの場合は、次のクエリを入力できます。

      kubernetesconfigurationresources
      | where type == "microsoft.kubernetesconfiguration/fluxconfigurations"
      | extend complianceState=tostring(properties.complianceState)
      | where complianceState == "Non-Compliant"
      | summarize count() by complianceState
      
    • [しきい値] ボックスで、入力の種類として A を選択し、しきい値を 0 に設定して、クラスターで 1 つの拡張機能が失敗した場合でもアラートを受信します。 これをアラート条件としてマークします。

    Screenshot showing the alert creation process.

  6. アラートの評価間隔を指定します。

    • [条件] で、アラート ルールをトリガーするクエリまたは式を選択します。
    • [すべてを評価] で、評価頻度を 10 秒の倍数として入力します。
    • [評価期間] で、アラートが作成されるまで条件を true にする必要がある期間を指定します。
    • [データなしとエラー処理を構成する] で、アラート ルールがデータを返さない場合やエラーが返された場合にどうするかを指定します。
    • クエリの実行結果を確認するには、[プレビュー] を選択します。
  7. ストレージの場所、ルール グループ、およびルールに関連付ける追加のメタデータを追加します。

    • [フォルダー] で、ルールを格納するフォルダーを選択します。
    • [グループ] で、定義済みのグループを指定します。
    • 必要に応じて、説明と概要を追加してアラート メッセージをカスタマイズします。
    • 必要に応じて、Runbook の URL、パネル、ダッシュボード、アラート ID を追加します。
  8. 必要に応じて、カスタム ラベルを追加します。 その後、 [保存] を選びます。

また、連絡先ポイントを構成したり、アラートの通知ポリシーを構成したりすることもできます。

リソースの消費量と調整を監視する

Flux リソースの消費量、調整、API 要求、および調整の状態を監視できるダッシュボードをインポートするには、次の手順に従います。

  1. Azure Monitor ワークスペースを作成するの手順に従います。

  2. Azure portalAzure CLI を使用して、Azure Managed Grafana インスタンスを作成します。

  3. 監視する AKS クラスターまたは Arc 対応 Kubernetes クラスターで Prometheus メトリック収集を有効にします。

  4. configmap を作成して、Azure Managed Flux メトリックをスクレイピングするように Azure Monitor エージェントを構成します。

    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. Flux コントロール プレーンFlux クラスター統計 ダッシュボードをダウンロードします。

  6. Managed Prometheus ワークスペースを Managed Grafana インスタンスにリンクします。 完了するまで数分かかります。

  7. 手順に従って、JSON ダッシュボード Grafana にインポートします。

ダッシュボードをインポートすると、監視しているクラスターの情報が表示されます。 特定のクラスターまたは名前空間の情報のみを表示するには、各ダッシュボードの上部付近にあるフィルターを使用します。

Flux コントロール プレーン ダッシュボードには、状態リソースの消費量、クラスター レベルでの調整、Kubernetes API 要求に関する詳細が表示されます。

Screenshot of the Flux Control Plane dashboard.

Flux クラスター統計 ダッシュボードには、リコンサイルの数に関する詳細と、各調整の状態と実行時間が表示されます。

Screenshot of the Flux Cluster Stats dashboard.

リソース消費と調整の問題に関するアラートを作成する

前のセクションで説明したようにダッシュボードをインポートしたら、アラートを設定できます。 これらのアラートは、注意が必要になる可能性があるリソースの消費量と調整の問題について通知します。

これらのアラートを有効にするには、次に示すような Bicep テンプレートをデプロイします。 このテンプレートのアラート ルールはサンプルです。必要に応じて変更できます。

Bicep テンプレートをダウンロードして変更を行ったら、次の手順に従ってテンプレートをデプロイします。

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

次のステップ