GitOps (Flux v2) の状態とアクティビティを監視する
Azure Arc 対応 Kubernetes クラスターまたは Azure Kubernetes Service (AKS) クラスターで Flux v2 を使用して GitOps に関連する状態とアクティビティを監視するには、いくつかのオプションがあります。
- Azure portal を使用して、個々のクラスター上の Flux の構成とリソースを監視します。
- Grafana ダッシュボードを使用して、デプロイとコンプライアンスの状態を監視します。
- Flux コントロール プレーンと Flux クラスター統計ダッシュボードを使用して、リソースの消費量と調整を監視します。
- クラスターからの Prometheus スクレイピングを有効にし、Azure Monitor ワークスペースのデータを使用して独自のダッシュボードを作成します。
- Prometheus スクレイピングで使用可能なデータを使用して、Azure Monitor でアラートを作成します。
このトピックでは、Flux のアクティビティと状態を監視する方法のいくつかを説明します。
Azure portal で Flux 構成を監視する
クラスターに Flux 構成を作成したら、クラスターに移動し、GitOps を選択して、Azure portal で状態情報を表示することができます。
クラスターのコンプライアンスとオブジェクトの詳細を表示する
コンプライアンスの状態は、クラスターの現在の状態が必要な状態になっているかどうかを示します。 指定できる値
- 準拠している: クラスターの状態が必要な状態になっています。
- 保留中: 更新された必要な状態が検出されましたが、その状態はまだクラスターで調整されていません。
- 準拠していない: 現在の状態が必要な状態になっていません。
クラスターの調整の問題をデバッグするには、構成オブジェクトを選択します。 ここでは、Flux が各 Flux 構成向けに作成する各構成オブジェクトのログを表示できます。 ログを表示するオブジェクト名を選択します。
Flux 構成が適用されて作成された Kubernetes オブジェクトを表示するには、クラスターのサービス メニューの [Kubernetes リソース] セクションで [Workloads] を選択します。 ここでは、クラスターで作成されたすべてのリソースのすべての詳細を表示できます。
既定では、名前空間とサービス名でフィルター処理できます。 アプリケーションで使用している可能性のあるラベル フィルターを追加して、検索を絞り込むこともできます。
Flux の構成状態と詳細を表示する
各 Flux 構成の [状態] 列には、Flux 構成オブジェクトがクラスターに正常に作成されたかどうかが表示されます。
Flux 構成を選択すると、次の情報を含む [概要] ページが表示されます。
- 最後の同期のソース コミット ID
- 最新のソース更新プログラムのタイムスタンプ
- 状態更新タイムスタンプ (最新の統計が取得された日時を示す)
- リポジトリの URL とブランチ
- さまざまな kustomization を表示するためのリンク
ダッシュボードを使用して 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 外のデータ接続ではサポートされていません。
Azure portal か Azure CLI を使用して、Azure Managed Grafana インスタンスを作成します。 [概要] ページでエンドポイントを選択して、Grafana にアクセスできることを確認します。 ダッシュボードを表示および編集するには、少なくとも Grafana Editor レベルのアクセス許可が必要です。 アクセスを確認するには、Grafana インスタンスでアクセス制御 (IAM) に移動します。
Azure Managed Grafana インスタンスのマネージド ID を使用している場合は、次の手順に従って、Azure Managed Grafana インスタンスを作成したサブスクリプションの監視閲覧者ロールを割り当てます。
- Azure portal で、追加するサブスクリプションに移動します。
- [アクセス制御 (IAM)] を選択します。
- [ロールの割り当ての追加] を選択します。
- [監視閲覧者] ロールを選択し、[次へ] を選択します。
- [メンバー] タブで、[マネージド ID] を選択し、[メンバーの選択] を選択します。
- マネージド ID の一覧から、サブスクリプションを選択し、Azure Managed Grafana と Azure Managed Grafana インスタンスの名前を選択します。
- [レビューと割り当て] を選択します。
サービス プリンシパルを使用している場合は、データ ソース接続に使用するサービス プリンシパルに 監視閲覧者 ロールを付与します。 同じ手順に従い、今度は [メンバー] タブで [ユーザー、グループ、またはサービス プリンシパル] を選択してから、サービス プリンシパルを選択します。 (Azure Managed Grafana を使用していない場合は、データ接続アクセスにサービス プリンシパルを使用する必要があります)。
Azure Managed Grafana インスタンスに Azure Monitor データ ソース接続を作成します。 この接続により、ダッシュボードは Azure Resource Graph データにアクセスできるようになります。
GitOps Flux - アプリケーション デプロイ ダッシュボードをダウンロードします。
手順に従って、JSON ダッシュボード Grafana にインポートします。
ダッシュボードをインポートすると、監視しているクラスターの情報と、詳細を提供するいくつかのパネルが表示されます。 項目の詳細を見るには、Azure portal にアクセスするためのリンクを選択します。Azure portal には、構成、エラー、ログに関する情報が表示されます。
[Flux 拡張機能のデプロイ状態] の表には、Flux 拡張機能がデプロイされているすべてのクラスターと、現在のデプロイ状態が一覧表示されます。
[Flux 構成のコンプライアンス状態] の表には、クラスターで作成されたすべての Flux 構成とそのコンプライアンス状態が一覧表示されます。 Helm リリースや kustomizations などの構成オブジェクトの状態とエラー ログを表示するには、[ComplianceState] 列から [非準拠] リンクを選択します。
[状態別の Flux 拡張機能のデプロイの数] のグラフには、クラスターのプロビジョニング状態に基づくクラスターの数が表示されます。
[コンプライアンス状態別の Flux 構成の数] のグラフには、ソース リポジトリに関するコンプライアンス状態に基づいて Flux 構成の数が表示されます。
ダッシュボード データをフィルター処理してアプリケーションのデプロイを追跡する
GitOps Flux - アプリケーション デプロイ ダッシュボードでデータをフィルター処理して、表示される情報を変更できます。 たとえば、特定のサブスクリプションまたはリソース グループのみのデータを表示したり、特定のクラスターにデータを制限したりできます。 これを行うには、一番上のドロップダウン、またはテーブル内の任意の列ヘッダーからフィルター オプションを選択します。
たとえば、[Flux 構成のコンプライアンス状態] の表で、[SourceLastSyncCommit] 列から特定のコミットを選択できます。 こうすると、そのコミットの影響を受けるすべてのクラスターに対する構成デプロイの状態を追跡できます。
拡張機能と構成のエラーに関するアラートを作成する
前のセクションで説明したようにダッシュボードをインポートしたら、アラートを設定できます。 これらのアラートは、Flux 拡張機能または Flux 構成でエラーが発生した場合に通知を送信します。
アラートを作成するには、次の手順に従います。 拡張機能のプロビジョニングの失敗やアップグレードの失敗を検出したり、コンプライアンス状態のエラーを検出したりするためのクエリ例が用意されています。
ダッシュボードの左側のナビゲーション メニューで、[アラート設定] を選択します。
警告ルールを選択します。
[+ アラート ルールの作成] を選択します。 新しい [アラート ルール] ページが開きます。既定では [Grafana マネージド アラート] オプションが選択されています。
[ルール名] で、わかりやすい名前を追加します。 この名前はアラート ルールの一覧に表示され、このルールに基づいて作成されたすべてのアラート インスタンスの
alertname
ラベルとして使用されます。[クエリとアラート条件の設定] で以下のようにします。
データ ソースを選択。 ここでは、ダッシュボードに使用されるのと同じデータ ソースを使用できます。
[サービス] で、[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 つの拡張機能が失敗した場合でもアラートを受信します。 これをアラート条件としてマークします。
アラートの評価間隔を指定します。
- [条件] で、アラート ルールをトリガーするクエリまたは式を選択します。
- [すべてを評価] で、評価頻度を 10 秒の倍数として入力します。
- [評価期間] で、アラートが作成されるまで条件を true にする必要がある期間を指定します。
- [データなしとエラー処理を構成する] で、アラート ルールがデータを返さない場合やエラーが返された場合にどうするかを指定します。
- クエリの実行結果を確認するには、[プレビュー] を選択します。
ストレージの場所、ルール グループ、およびルールに関連付けるその他のメタデータを追加します。
- [フォルダー] で、ルールを格納するフォルダーを選択します。
- [グループ] で、定義済みのグループを指定します。
- 必要に応じて、説明と概要を追加してアラート メッセージをカスタマイズします。
- 必要に応じて、Runbook の URL、パネル、ダッシュボード、アラート ID を追加します。
必要に応じて、カスタム ラベルを追加します。 その後、 [保存] を選びます。
また、連絡先ポイントとアラートの通知ポリシーを構成することもできます。
リソースの消費量と調整を監視する
Flux リソースの消費量、調整、API 要求、および調整の状態を監視できるダッシュボードをインポートするには、次の手順に従います。
Azure Monitor ワークスペースを作成するの手順に従います。
Azure portal か Azure CLI を使用して、Azure Managed Grafana インスタンスを作成します。
監視する AKS クラスターまたは Arc 対応 Kubernetes クラスターで Prometheus メトリック収集を有効にします。
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
Flux コントロール プレーン と Flux クラスター統計 ダッシュボードをダウンロードします。
Managed Prometheus ワークスペースを Managed Grafana インスタンスにリンクします。 このプロセスが完了するには数分かかります。
手順に従って、JSON ダッシュボード Grafana にインポートします。
ダッシュボードをインポートすると、監視しているクラスターの情報が表示されます。 特定のクラスターまたは名前空間の情報のみを表示するには、各ダッシュボードの上部付近にあるフィルターを使用します。
Flux コントロール プレーン ダッシュボードには、状態リソースの消費量、クラスター レベルでの調整、Kubernetes API 要求に関する詳細が表示されます。
Flux クラスター統計 ダッシュボードには、リコンサイルの数に関する詳細と、各調整の状態と実行時間が表示されます。
リソース消費と調整の問題に関するアラートを作成する
前のセクションで説明したようにダッシュボードをインポートしたら、アラートを設定できます。 これらのアラートは、注意が必要になる可能性があるリソースの消費量と調整の問題について通知します。
これらのアラートを有効にするには、次に示すような 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
}
]
}
]
}
}
次のステップ
- Flux v2 で GitOps を使用して構成とアプリケーションのデプロイを管理するのチュートリアルを確認します。
- Azure Monitor Container Insights について学習します。