مراقبة حالة GitOps (Flux v2) ونشاطه

لمراقبة الحالة والنشاط المتعلقين ب GitOps باستخدام Flux v2 في مجموعات Kubernetes الممكنة في Azure Arc أو مجموعات Azure Kubernetes Service (AKS)، لديك العديد من الخيارات:

يصف هذا الموضوع بعض الطرق التي يمكنك من خلالها مراقبة نشاط Flux وحالتك.

مراقبة تكوينات Flux في مدخل Microsoft Azure

بعد إنشاء تكوينات Flux على مجموعتك، يمكنك عرض معلومات الحالة في مدخل Microsoft Azure عن طريق الانتقال إلى مجموعة وتحديد GitOps.

عرض التفاصيل حول توافق المجموعة والكائنات

توضح حالة التوافق ما إذا كانت الحالة الحالية لنظام المجموعة تطابق الحالة المطلوبة. القيم الممكنة:

  • متوافق: تطابق حالة نظام المجموعة الحالة المطلوبة.
  • معلق: تم الكشف عن حالة مطلوبة محدثة، ولكن لم تتم تسوية هذه الحالة بعد على نظام المجموعة.
  • غير متوافق: الحالة الحالية لا تتطابق مع الحالة المطلوبة.

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

للمساعدة في تصحيح مشكلات التسوية لنظام مجموعة، حدد كائنات التكوين. هنا، يمكنك عرض سجلات كل عنصر من عناصر التكوين التي ينشئها Flux لكل تكوين Flux. حدد اسم كائن لعرض سجلاته.

Screenshot showing detailed conditions for a configuration object.

لعرض كائنات Kubernetes التي تم إنشاؤها نتيجة لتطبيق تكوينات Flux، حدد Workloads في قسم موارد Kubernetes في جزء التنقل الأيسر للمجموعة. هنا، يمكنك عرض جميع تفاصيل أي موارد تم إنشاؤها على نظام المجموعة.

بشكل افتراضي، يمكنك التصفية حسب مساحة الاسم واسم الخدمة. يمكنك أيضا إضافة أي عامل تصفية تسمية قد تستخدمه في تطبيقاتك للمساعدة في تضييق نطاق البحث.

عرض حالة تكوين Flux وتفاصيله

لكل تكوين Flux، يشير عمود الحالة إلى ما إذا كان كائن تكوين Flux قد تم إنشاؤه بنجاح على نظام المجموعة.

حدد أي تكوين Flux لمشاهدة صفحة Overview الخاصة به، بما في ذلك المعلومات التالية:

  • معرف الالتزام بالمصدر لآخر مزامنة
  • الطابع الزمني لآخر تحديث مصدر
  • الطابع الزمني لتحديث الحالة (يشير إلى وقت الحصول على أحدث الإحصائيات)
  • عنوان URL للربيع والفرع
  • ارتباطات لعرض kustomizations مختلفة

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

استخدام لوحات المعلومات لمراقبة حالة GitOps ونشاطه

نحن نقدم لوحات معلومات لمساعدتك في مراقبة الحالة والامتثال واستهلاك الموارد ونشاط التسوية ل GitOps مع Flux v2. يمكن استيراد لوحات معلومات JSON هذه إلى Grafana لمساعدتك في عرض بياناتك وتحليلها في الوقت الفعلي. يمكنك أيضا إعداد تنبيهات لهذه المعلومات.

لاستيراد لوحات المعلومات هذه واستخدامها، تحتاج إلى:

  • مجموعة Kubernetes واحدة أو أكثر من مجموعات Kubernetes الممكنة بواسطة Arc أو مجموعات AKS.
  • ملحق microsoft.flux المثبت على المجموعات.
  • تم إنشاء تكوين Flux واحد على الأقل على المجموعات.

مراقبة حالة التوزيع والتوافق

اتبع هذه الخطوات لاستيراد لوحات المعلومات التي تتيح لك مراقبة نشر ملحق Flux وحالته عبر المجموعات وحالة التوافق لتكوين Flux على تلك المجموعات.

إشعار

تصف هذه الخطوات عملية استيراد لوحة المعلومات إلى Azure Managed Grafana. يمكنك أيضا استيراد لوحة المعلومات هذه إلى أي مثيل Grafana. مع هذا الخيار، يجب استخدام كيان الخدمة؛ الهوية المدارة غير مدعومة لاتصال البيانات خارج Azure Managed Grafana.

  1. إنشاء مثيل Azure Managed Grafana باستخدام مدخل Azure أو Azure CLI. تأكد من قدرتك على الوصول إلى Grafana عن طريق تحديد نقطة النهاية الخاصة بها في صفحة نظرة عامة. تحتاج على الأقل إلى أذونات على مستوى محرر Grafana لعرض لوحات المعلومات وتحريرها. يمكنك التحقق من وصولك بالانتقال إلى التحكم في الوصول (IAM) على مثيل Grafana.

  2. إذا كنت تستخدم هوية مدارة لمثيل Azure Managed Grafana، فاتبع هذه الخطوات لتعيين دور قارئ المراقبة على الاشتراك (الاشتراكات):

    1. في مدخل Microsoft Azure، انتقل إلى الاشتراك الذي تريد إضافته.
    2. حدد Access control (IAM).
    3. حدد Add role assignment.
    4. حدد دور قارئ المراقبة، ثم حدد التالي.
    5. في علامة التبويب الأعضاء ، حدد الهوية المدارة، ثم اختر تحديد أعضاء.
    6. من قائمة الهوية المدارة، حدد الاشتراك الذي أنشأت فيه مثيل Azure Managed Grafana. ثم حدد Azure Managed Grafana واسم مثيل Azure Managed Grafana.
    7. حدد Review + Assign.

    إذا كنت تستخدم كيان خدمة، فامنح دور قارئ المراقبة إلى كيان الخدمة الذي ستستخدمه لاتصال مصدر البيانات. اتبع هذه الخطوات نفسها، ولكن حدد المستخدم أو المجموعة أو كيان الخدمة في علامة التبويب الأعضاء ، ثم حدد كيان الخدمة. (إذا كنت لا تستخدم Azure Managed Grafana، فيجب عليك استخدام كيان خدمة للوصول إلى اتصال البيانات.)

  3. إنشاء اتصال مصدر بيانات Azure Monitor في مثيل Azure Managed Grafana. يتيح هذا الاتصال للوحة المعلومات الوصول إلى بيانات Azure Resource Graph.

  4. قم بتنزيل لوحة معلومات GitOps Flux - Application Deployments.

  5. اتبع الخطوات لاستيراد لوحة معلومات JSON إلى Grafana.

بعد استيراد لوحة المعلومات، ستعرض معلومات من المجموعات التي تراقبها، مع العديد من اللوحات التي توفر التفاصيل. لمزيد من التفاصيل حول عنصر ما، حدد الارتباط لزيارة مدخل Microsoft Azure، حيث يمكنك العثور على مزيد من المعلومات حول التكوينات والأخطاء والسجلات.

Screenshot of the Flux Application Deployments Dashboard.

يسرد جدول Flux Extension Deployment Status جميع المجموعات حيث يتم نشر ملحق Flux، جنبا إلى جنب مع حالة النشر الحالية.

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

يسرد جدول Flux Configuration Compliance Status جميع تكوينات 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 - Application Deployments Dashboard لتغيير المعلومات المعروضة. على سبيل المثال، يمكنك إظهار البيانات لاشتراكات أو مجموعات موارد معينة فقط، أو تقييد البيانات بمجموعة معينة. للقيام بذلك، حدد خيار التصفية إما من القوائم المنسدلة للمستوى الأعلى أو من أي رأس عمود في الجداول.

على سبيل المثال، في جدول حالة توافق تكوين Flux، يمكنك تحديد تثبيت معين من العمود SourceLastSyncCommit . من خلال القيام بذلك، يمكنك تتبع حالة نشر التكوين إلى جميع المجموعات المتأثرة بهذا التثبيت.

إنشاء تنبيهات لفشل الامتداد والتكوين

بعد استيراد لوحة المعلومات كما هو موضح في القسم السابق، يمكنك إعداد التنبيهات. تعلمك هذه التنبيهات عندما تواجه ملحقات Flux أو تكوينات Flux فشلا.

اتبع الخطوات أدناه لإنشاء تنبيه. يتم توفير أمثلة للاستعلامات للكشف عن توفير الملحق أو فشل ترقية الملحق، أو للكشف عن فشل حالة التوافق.

  1. في قائمة التنقل اليسرى من لوحة المعلومات، حدد Alerting.

  2. حدد قواعد التنبيه.

  3. حدد + Create alert rule. تفتح صفحة قاعدة التنبيه الجديدة، مع تحديد خيار التنبيهات المدارة من 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
      
    • بالنسبة إلى المربع Threshold، حدد A لنوع الإدخال وقم بتعيين الحد إلى 0 لتلقي التنبيهات حتى إذا فشل ملحق واحد فقط على نظام المجموعة. ضع علامة على هذا كشرط التنبيه.

    Screenshot showing the alert creation process.

  6. حدد الفاصل الزمني لتقييم التنبيه:

    • بالنسبة إلى Condition، حدد الاستعلام أو التعبير لتشغيل قاعدة التنبيه.
    • بالنسبة إلى Evaluate every، أدخل تكرار التقييم كمضاعف 10 ثوان.
    • بالنسبة إلى Evaluate for، حدد المدة التي يجب أن يكون فيها الشرط صحيحا قبل إنشاء التنبيه.
    • في Configure no data and error handling، قم بالإشارة إلى ما يجب أن يحدث عندما لا ترجع قاعدة التنبيه أي بيانات أو ترجع خطأ.
    • للتحقق من النتائج من تشغيل الاستعلام، حدد معاينة.
  7. أضف موقع التخزين ومجموعة القواعد وأي بيانات تعريف إضافية تريد إقرانها بالقاعدة.

    • بالنسبة إلى المجلد، حدد المجلد الذي يجب تخزين القاعدة فيه.
    • بالنسبة للمجموعة، حدد مجموعة معرفة مسبقا.
    • إذا رغبت في ذلك، أضف وصفا وملخصا لتخصيص رسائل التنبيه.
    • أضف عنوان URL لدفتر التشغيل واللوحة ولوحة المعلومات ومعرفات التنبيه حسب الحاجة.
  8. إذا رغبت في ذلك، أضف أي تسميات مخصصة. ثم حدد حفظ.

يمكنك أيضا تكوين نقاط الاتصال وتكوين نهج الإعلامات للتنبيهات الخاصة بك.

مراقبة استهلاك الموارد والتسويات

اتبع هذه الخطوات لاستيراد لوحات المعلومات التي تتيح لك مراقبة استهلاك موارد Flux، والتسويات، وطلبات واجهة برمجة التطبيقات، وحالة التسوية.

  1. اتبع الخطوات لإنشاء مساحة عمل Azure Monitor.

  2. إنشاء مثيل Azure Managed Grafana باستخدام مدخل Azure أو Azure CLI.

  3. قم بتمكين مجموعة مقاييس Prometheus على مجموعات AKS و/أو مجموعات Kubernetes الممكنة بواسطة Arc التي تريد مراقبتها.

  4. تكوين عامل Azure Monitor لاستخراج مقاييس Azure Managed Flux عن طريق إنشاء 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. قم بتنزيل لوحات معلومات Flux Control Plane و Flux Cluster Stats .

  6. ربط مساحة عمل Prometheus المدارة بمثيل Grafana المدار. يستغرق هذا بضع دقائق حتى يكتمل.

  7. اتبع الخطوات لاستيراد لوحات معلومات JSON هذه إلى Grafana.

بعد استيراد لوحات المعلومات، ستعرض معلومات من المجموعات التي تراقبها. لإظهار المعلومات فقط لمجموعة معينة أو مساحة اسم معينة، استخدم عوامل التصفية بالقرب من أعلى كل لوحة معلومات.

تعرض لوحة معلومات Flux Control Plane تفاصيل حول استهلاك موارد الحالة، والتسويات على مستوى نظام المجموعة، وطلبات واجهة برمجة تطبيقات Kubernetes.

Screenshot of the Flux Control Plane dashboard.

تعرض لوحة معلومات Flux Cluster Stats تفاصيل حول عدد المصلحين، بالإضافة إلى حالة كل مطابق ومدة تنفيذه.

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

الخطوات التالية