تطبيق ترقيات الأمان التلقائية على عقد Azure Kubernetes Service (AKS) باستخدام GitHub Actions

تعد تحديثات الأمان جزءًا أساسيًّا من الحفاظ على أمان نظام مجموعة AKS الخاصة بك والتوافق مع أحدث الإصلاحات لنظام التشغيل الأساسي. تتضمن هذه التحديثات إصلاحات أمان نظام التشغيل أو تحديثات النواة. تتطلب بعض التحديثات إعادة تشغيل عقدة ما لإكمال العملية.

توضح هذه المقالة كيف يمكنك أتمتة عملية تحديث عقد AKS باستخدام GitHub Actions وAzure CLI لإنشاء مهمة تحديث استنادا cron إلى تلك التي تعمل تلقائيا.

إشعار

يمكنك أيضا إجراء ترقيات صورة العقدة تلقائيا وجدولة هذه الترقيات باستخدام الصيانة المخطط لها. لمزيد من المعلومات، راجع ترقية صور العقدة تلقائيا.

قبل البدء

  • تفترض هذه المقالة أن لديك مجموعة AKS موجودة. إذا كنت بحاجة إلى نظام مجموعة AKS، قم بإنشاء مجموعة باستخدام Azure CLI أو Azure PowerShell أو مدخل Microsoft Azure.
  • تفترض هذه المقالة أيضا أن لديك حساب GitHub ومستودع ملف تعريف لاستضافة إجراءاتك. إذا لم يكن لديك مستودع، فبادر بإنشاء مستودع بنفس اسم مستخدم GitHub الخاص بك.
  • تحتاج إلى تثبيت الإصدار 2.0.59 من Azure CLI أو إصدار أحدث وتكوينه. قم بتشغيل az --version للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فراجع تثبيت Azure CLI.

تحديث العقد باستخدام az aks upgrade

az aks upgrade يمنحك الأمر طريقة صفر للتعطل لتطبيق التحديثات. ينفذ الأمر الإجراءات التالية:

  1. تطبيق آخر التحديثات على جميع عقد نظام المجموعة.
  2. التطويق (يجعل العقدة غير متوفرة لجدولة أحمال العمل الجديدة) ويصرف (ينقل أحمال العمل الموجودة إلى عقدة أخرى) حركة المرور إلى العقد.
  3. إعادة تشغيل العقد.
  4. تمكين العقد المحدثة من تلقي نسبة استخدام الشبكة مرة أخرى.

لا تعيد AKS تشغيل العقد تلقائيا إذا قمت بتحديثها باستخدام أسلوب مختلف.

إشعار

يعمل التشغيل az aks upgrade مع العلامة --node-image-only فقط على ترقية صور العقدة. يؤدي تشغيل الأمر بدون العلامة إلى ترقية كل من صور العقدة وإصدار وحدة التحكم Kubernetes. لمزيد من المعلومات، راجع مستندات الترقيات المدارة على العقد ومستندات ترقيات نظام المجموعة.

تعمل جميع عقد Kubernetes في جهاز ظاهري Azure (VM) يستند إلى Windows أو Linux. تستخدم الأجهزة الظاهرية المستندة إلى Linux صورة Ubuntu مع نظام التشغيل الذي تم تكوينه للتحقق تلقائيا من وجود تحديثات كل ليلة.

عند استخدام az aks upgrade الأمر ، ينشئ Azure CLI زيادة في العقد الجديدة بأحدث تحديثات الأمان والنواة. يتم تطويق هذه العقد الجديدة في البداية لمنع جدولة أي تطبيقات إليها حتى يكتمل التحديث. بعد اكتمال التحديث، يطوق Azure العقد القديمة ويستنزفها ويفك تسجيل العقد الجديدة، وينقل جميع التطبيقات المجدولة إلى العقد الجديدة.

هذه العملية أفضل من تحديث نواة نظام Linux يدويًّا لأن Linux يتطلب إعادة تشغيل عند تثبيت تحديث نواة جديد. إذا قمت بتحديث نظام التشغيل يدويًّا، تحتاج أيضًا إلى إعادة تشغيل الجهاز الظاهري، وتطويق جميع التطبيقات وتصريفها يدويًّا.

إنشاء إجراء GitHub موقوت

cron هي أداة مساعدة تسمح لك بتشغيل مجموعة من الأوامر أو المهام، على جدول تلقائي. لإنشاء وظيفة لتحديث عقد AKS الخاصة بك على جدول تلقائي، تحتاج إلى مستودع لاستضافة إجراءاتك. عادة ما يتم تكوين إجراءات GitHub في نفس المستودع مثل التطبيق الخاص بك، ولكن يمكنك استخدام أي مستودع.

  1. انتقل إلى المستودع الخاص بك على GitHub.

  2. حدد الإجراءات.

  3. حدد سير عمل>جديد إعداد سير عمل بنفسك.

  4. إنشاء إجراء GitHub يسمى ترقية صور عقدة نظام المجموعة مع مشغل جدول زمني للتشغيل كل 15 يوما في الساعة 3 صباحا. انسخ التعليمات البرمجية التالية في YAML:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    
  5. إنشاء مهمة تسمى upgrade-node التي تعمل على عامل Ubuntu وتتصل بحساب Azure CLI لتنفيذ أمر ترقية العقدة. انسخ التعليمات البرمجية التالية في YAML تحت on المفتاح :

    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
    

إعداد Azure CLI في سير العمل

  1. في شريط Search Marketplace for Actions ، ابحث عن Azure Login.

  2. حدد تسجيل الدخول إلى Azure.

    تظهر نتائج البحث سطرين، ويسمى الإجراء الأول

  3. ضمن Installation، حدد إصدارا، مثل v1.4.6، وانسخ قصاصة التعليمات البرمجية للتثبيت.

  4. steps أضف المفتاح والمعلومات التالية من قصاصة التعليمات البرمجية للتثبيت إلى YAML:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
        steps:
          - name: Azure Login
            uses: Azure/login@v1.4.6
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    

إنشاء بيانات اعتماد ل Azure CLI

  1. في نافذة متصفح جديدة، قم بإنشاء كيان خدمة جديد باستخدام az ad sp create-for-rbac الأمر . تأكد من استبدال *{subscriptionID}* بمعرف الاشتراك الخاص بك.

    إشعار

    ينشئ Contributor هذا المثال الدور في نطاق الاشتراك . يمكنك توفير الدور والنطاق الذي يلبي احتياجاتك. لمزيد من المعلومات، راجع أدوار Azure المضمنة ومستويات نطاق Azure RBAC.

    az ad sp create-for-rbac --role Contributor --scopes /subscriptions/{subscriptionID} -o json
    

    يجب أن يكون الإخراج مشابها لإخراج المثال التالي:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "xxxxx-xxx-xxxx-xx-xx-xx-xx-xx",
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. انسخ الإخراج وانتقل إلى مستودع GitHub الخاص بك.

  3. حدد Settings>Secrets and variables>Actions>New repository secret.

  4. لـ الاسم، أدخل AZURE_CREDENTIALS.

  5. بالنسبة إلى البيانات السرية، انسخ محتويات الإخراج الذي تلقيته عند إنشاء كيان الخدمة.

  6. حدد إضافة سر.

إنشاء الخطوات لتنفيذ أوامر Azure CLI

  1. انتقل إلى نافذتك باستخدام YAML لسير العمل.

  2. في شريط Search Marketplace for Actions ، ابحث عن إجراء Azure CLI.

  3. حدد إجراء Azure CLI.

    نتيجة البحث عن

  4. ضمن Installation، حدد إصدارا، مثل v1.0.8، وانسخ قصاصة التعليمات البرمجية للتثبيت.

  5. الصق محتويات الإجراء في YAML أسفل *Azure Login* الخطوة، على غرار المثال التالي:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
        steps:
          - name: Azure Login
            uses: Azure/login@v1.4.6
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
          - name: Upgrade node images
            uses: Azure/cli@v1.0.8
            with:
              inlineScript: az aks upgrade --resource-group <resourceGroupName> --name <aksClusterName> --node-image-only --yes
    

    تلميح

    يمكنك فصل --resource-group المعلمات و --name عن الأمر عن طريق إنشاء أسرار مستودع جديدة كما فعلت ل AZURE_CREDENTIALS.

    إذا قمت بإنشاء أسرار لهذه المعلمات، تحتاج إلى استبدال العناصر النائبة <resourceGroupName> و <aksClusterName> بنظيرتها السرية. على سبيل المثال، ${{secrets.RESOURCE_GROUP_NAME}} و ${{secrets.AKS_CLUSTER_NAME}}

  6. أعد تسمية YAML إلى upgrade-node-images.yml.

  7. حدد Commit changes...، وأضف رسالة تثبيت، ثم حدد Commit changes.

تشغيل إجراء GitHub يدويًّا

يمكنك تشغيل سير العمل يدويا بالإضافة إلى التشغيل المجدول عن طريق إضافة مشغل جديد on يسمى workflow_dispatch.

إشعار

إذا كنت ترغب في ترقية تجمع عقدة واحدة بدلا من كافة تجمعات العقد على نظام المجموعة، أضف المعلمة --name az aks nodepool upgrade إلى الأمر لتحديد اسم تجمع العقدة. على سبيل المثال:

az aks nodepool upgrade --resource-group <resourceGroupName> --cluster-name <aksClusterName> --name <nodePoolName> --node-image-only
  • أضف المشغل workflow_dispatch أسفل on المفتاح:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
      workflow_dispatch:
    

    يجب أن يبدو YAML مشابها للمثال التالي:

        name: Upgrade cluster node images
        on:
          schedule:
            - cron: '0 3 */15 * *'
          workflow_dispatch:
        jobs:
          upgrade-node:
            runs-on: ubuntu-latest
            steps:
              - name: Azure Login
                uses: Azure/login@v1.4.6
                with:
                  creds: ${{ secrets.AZURE_CREDENTIALS }}
              - name: Upgrade node images
                uses: Azure/cli@v1.0.8
                with:
                  inlineScript: az aks upgrade -g {resourceGroupName} -n {aksClusterName} --node-image-only --yes
              # Code for upgrading one or more node pools
    

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

لمزيد من المعلومات حول ترقيات AKS، راجع المقالات والموارد التالية:

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