تكوين مناطق التوفر في خدمة Azure Kubernetes (AKS)

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

يؤدي استخدام خدمة Azure Kubernetes (AKS) مع مناطق التوفر إلى توزيع الموارد فعليا عبر مناطق توفر مختلفة داخل منطقة واحدة، ما يحسن الموثوقية. نشر العقد في عدة مناطق لا يحمل تكاليف إضافية. توضح لك هذه المقالة كيفية تكوين موارد AKS لاستخدام مناطق التوفر باستخدام Azure CLI أو Terraform.

المتطلبات المسبقه

  • اشتراك Azure نشط. في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.

  • قم بتعيين سياق اشتراكك باستخدام az account set الأمر. على سبيل المثال:

    az account set --subscription "00000000-0000-0000-0000-000000000000"
    
  • تم تثبيت Azure CLI وتكوينه. للحصول على تعليمات التثبيت، راجع تثبيت Azure CLI.

  • تم تركيب Kubectl . يمكنك تثبيته محليا باستخدام الأمر az aks install-cli .

  • تم تثبيت Terraform محليا. للحصول على تعليمات التثبيت، راجع تثبيت Terraform.

القيود والاعتبارات

ضع القيود والاعتبارات التالية في اعتبارك عند استخدام مناطق التوفر في AKS:

مكونات عنقود AKS

يوضح المخطط التالي المكونات المختلفة لمجموعة AKS، بما في ذلك مكونات AKS المستضافة من قبل مايكروسوفت ومكونات AKS في اشتراك Azure الخاص بك:

رسم تخطيطي يوضح مكونات AKS المختلفة، بما في ذلك مكونات AKS التي تستضيفها مكونات Microsoft وAKS في اشتراك Azure الخاص بك.

وحدة تحكم AKS

تستضيف مايكروسوفت مستوى التحكم AKS، وخادم واجهة برمجة التطبيقات Kubernetes، وخدمات مثل scheduler و etcd كخدمات مدارة. تقوم Microsoft بنسخ مستوى التحكم نسخا متماثلا في مناطق متعددة.

يتم نشر الموارد الأخرى من نظام المجموعة في مجموعة موارد مدارة في اشتراك Azure الخاص بك. افتراضيا، تسبق هذه المجموعة من الموارد MC_ ( للعنقود المدار) وتحتوي على الموارد الموصوفة في الأقسام التالية.

تجمعات العقد

يتم إنشاء تجمعات العقد كمجموعات مقياس الجهاز الظاهري في اشتراك Azure الخاص بك.

عند إنشاء عنقود AKS، يتطلب ذلك مجموعة عقد نظام واحدة. يتم إنشاء هذا التجمع تلقائيا ويستضيف وحدات النظام الحيوية مثل CoreDNS و metrics-server. يمكنك إضافة المزيد من تجمعات عقد المستخدم إلى مجموعة AKS لاستضافة تطبيقاتك.

يمكنك نشر مجموعات العقد بثلاث طرق: تمتد للمناطق، أو محاذاة للمناطق، أو إقليمية (دون استخدام مناطق التوافر).

يوضح المخطط التالي توزيع العقد عبر مناطق التوافر في كل من النماذج الثلاثة:

رسم تخطيطي يوضح توزيع عقدة AKS عبر مناطق التوفر في نماذج مختلفة.

يتم تكوين مناطق تجمع العقد في النظام عند إنشاء عنقود أو تجمع عقد.

مجموعات العقد الممتدة للمناطق

في مجموعات العقد الممتدة للمناطق، تنتشر العقد عبر جميع المناطق المختارة. يوازن AKS تلقائيا عدد العقد بين المناطق. إذا حدث انقطاع في المنطقة، قد تتأثر العقد داخل المنطقة المتأثرة، لكن العقد في مناطق التوافر الأخرى تبقى غير متأثرة.

مجموعات العقد المحازمة مع المناطق

ملاحظة

إذا تم نشر حمل عمل واحد عبر تجمعات العقد، نوصي بإعداد --balance-similar-node-groupstrue للحفاظ على توزيع متوازن للعقد عبر المناطق لأحمال العمل الخاصة بك أثناء عمليات التوسيع.

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

تجمعات العقد الإقليمية

يستخدم وضع المنطقة عندما لا تحدد تعيين منطقة في قالب النشر (على سبيل المثال، "zones"=[] أو "zones"=null).

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

عمليات النشر

تستخدم Azure Kubernetes Service (AKS) البودات، والتخزين ووحدات التخزين، وموازنات التحميل عبر المناطق للحفاظ على توفر عالي لتطبيقاتك.

السنفات

كوبيرنتس على دراية بمناطق توفر Azure ويمكنه موازنة الكبسولات عبر العقد في مناطق مختلفة. في حالة عدم توفر منطقة، ينقل Kubernetes القرون بعيدا عن العقد المتأثرة تلقائيا.

كما هو موثق في مرجع كوبيرنتيز Well-Known التسميات، والتعليقات، والتلوث، يستخدم كوبيرنيتس التسمية topology.kubernetes.io/zone لتوزيع الكبسولات تلقائيا في وحدة تحكم النسخ أو الخدمة عبر المناطق المتاحة المتاحة.

maxSkew تصف المعلمة درجة توزيع القرون بشكل غير متساو. بافتراض وجود ثلاث مناطق وثلاث نسخ مقلدة، فإن تعيين هذه القيمة يضمن 1 أن كل منطقة لديها على الأقل كبسولة واحدة تعمل. على سبيل المثال:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: my-app
      containers:
      - name: my-container
        image: my-image

التخزين ووحدات التخزين

بشكل افتراضي، تستخدم إصدارات Kubernetes 1.29 وما بعدها أقراص Azure Managed باستخدام التخزين الاحتياطي للمناطق لمطالبات الحجم الدائمة (PVCs). يتم تكرار هذه الأقراص بين المناطق لتعزيز مرونة تطبيقاتك.

المثال التالي يظهر جهاز PVC يستخدم قرص SSD في Azure Standard في التخزين الاحتياطي حسب المنطقة:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: azure-managed-disk
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: managed-csi
  #storageClassName: managed-csi-premium
  resources:
    requests:
      storage: 5Gi

بالنسبة إلى عمليات النشر المتوافقة مع المنطقة، يمكنك إنشاء فئة تخزين جديدة مع تعيين المعلمة skuname إلى LRS (التخزين المتكرر محليا). يمكنك بعد ذلك استخدام فئة التخزين الجديدة في PVC الخاص بك.

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

يوضح المثال التالي فئة تخزين قياسي SSD قياسية للتخزين المكرر محليا:

kind: StorageClass
metadata:
  name: azuredisk-csi-standard-lrs
provisioner: disk.csi.azure.com
parameters:
  skuname: StandardSSD_LRS
  #skuname: PremiumV2_LRS

موازنات التحميل

هام

ابتداء من 30 سبتمبر 2025، لم تعد خدمة Azure Kubernetes Service (AKS) تدعم Load Balancer الأساسي. لتجنب أي اضطرابات محتملة في الخدمة، نوصي باستخدام موازن التحميل القياسي للنشر الجديد وترقية أي عمليات نشر موجودة إلى موازن التحميل القياسي. لمزيد من المعلومات حول هذا التقاعد، راجع مشكلة GitHub للتقاعدوإعلان تقاعد تحديثات Azure. للبقاء على اطلاع بالإعلانات والتحديثات، تابع ملاحظات إصدار AKS.

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

المثال التالي يوضح خدمة تستخدم Azure Load Balancer:

apiVersion: v1
kind: Service
metadata:
  name: example
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080

إنشاء مجموعات عقد باستخدام Azure CLI

استخدم Azure CLI لإنشاء مجموعة AKS وتجمعات عقد تمتد عبر المناطق مع مناطق التوفر وتجمعات العقد المحاذية للمناطق مع مناطق التوفر.

إنشاء تجمعات عقد تمتد للمناطق

يمكنك تحديد المناطق باستخدام المعامل عند --zones إنشاء عنقود AKS باستخدام az aks create الأوامر أو مجموعة العقد باستخدام الأمر az aks nodepool add . على سبيل المثال:

# Create an AKS cluster with a zone-spanning system node pool in all three availability zones with one node in each availability zone
az aks create \
  --resource-group example-rg \
  --name example-cluster \
  --node-count 3 \
  --zones 1 2 3

# Add one new zone-spanning user node pool with two nodes in each availability zone
az aks nodepool add \
  --resource-group example-rg \
  --cluster-name example-cluster \
  --name userpoola  \
  --node-count 6 \
  --zones 1 2 3

إنشاء تجمعات عقد محاذية للمناطق

تنشئ الأوامر التالية ثلاث مجموعات عقد لمنطقة بها ثلاث مناطق توفر باستخدام az aks nodepool add الأمر مع المعامل --zones لتحديد المنطقة لكل تجمع عقد:

# Add three new zone-aligned user node pools with two nodes in each
az aks nodepool add \
  --resource-group example-rg \
  --cluster-name example-cluster \
  --name userpoolx  \
  --node-count 2 \
  --zones 1

az aks nodepool add \
  --resource-group example-rg \
  --cluster-name example-cluster \
  --name userpooly  \
  --node-count 2 \
  --zones 2

az aks nodepool add \
  --resource-group example-rg \
  --cluster-name example-cluster \
  --name userpoolz  \
  --node-count 2 \
  --zones 3

إنشاء ملف تكوين Terraform

ملفات تكوين تيرافورم تحدد البنية التحتية التي ينشئها ويديرها تيرافورم.

  1. أنشئ ملفا مسمى main.tf وأضف الكود التالي لتعريف نسخة Terraform وتحديد مزود Azure:

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. أضف الكود التالي إلى main.tf لإنشاء مجموعة موارد Azure. لا تتردد في تغيير اسم وموقع مجموعة الموارد حسب الحاجة.

    resource "azurerm_resource_group" "example" {
     name     = "aks-rg"
     location = "East US"
    }
    

إنشاء عنقود AKS مع مجموعة عقد نظام تمتد للمناطق

أضف الكود التالي لإنشاء main.tf عنقود AKS مع تجمع عقد نظام يمتد عبر المناطق في جميع مناطق التوافر الثلاث مع عقدة واحدة في كل منطقة توافر:

resource "azurerm_kubernetes_cluster" "example" {
  name                = "aks-zones"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  dns_prefix          = "akszones"
  default_node_pool {
    name       = "system"
    node_count = 1
    vm_size    = "Standard_DS2_v2"
    zones      = ["1", "2", "3"]
  }
  identity {
    type = "SystemAssigned"
  }
}

إضافة مجموعات عقد مستخدمين تمتد للمناطق إلى عنقود AKS

أضف الكود التالي لإنشاء main.tf تجمع عقد مستخدم جديد يمتد للمنطقة مع عقدتين في كل منطقة توافر:

resource "azurerm_kubernetes_cluster_node_pool" "zonespan" {
  name                  = "userpool"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
  vm_size               = "Standard_DS2_v2"
  node_count            = 2
  zones                 = ["1", "2", "3"]
}

إضافة تجمعات عقد المستخدم المحاطة بالمناطق إلى عنقود AKS

أضف الكود التالي لإنشاء main.tf ثلاث مجموعات جديدة من عقد المستخدم المحاطة بالمناطق مع عقدتين في كل منطقة توافر:

resource "azurerm_kubernetes_cluster_node_pool" "zone1" {
  name                  = "userpool1"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
  vm_size               = "Standard_DS2_v2"
  node_count            = 1
  zones                 = ["1"]
}
resource "azurerm_kubernetes_cluster_node_pool" "zone2" {
  name                  = "userpool2"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
  vm_size               = "Standard_DS2_v2"
  node_count            = 1
  zones                 = ["2"]
}
resource "azurerm_kubernetes_cluster_node_pool" "zone3" {
  name                  = "userpool3"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
  vm_size               = "Standard_DS2_v2"
  node_count            = 1
  zones                 = ["3"]
}

تهيئة Terraform

قم بتهيئة Terraform في الدليل الذي يحتوي على ملفك main.tf باستخدام الأمر.terraform init يقوم هذا الأمر بتنزيل مزود Azure المطلوب لإدارة موارد Azure باستخدام Terraform.

terraform init

إنشاء خطة تنفيذ Terraform

إنشاء خطة تنفيذ Terraform باستخدام terraform plan الأمر . هذا الأمر يوضح لك الموارد التي سيقوم Terraform بإنشائها أو تعديلها في اشتراكك في Azure.

terraform plan

تطبيق تكوين Terraform

بعد مراجعة وتأكيد خطة التنفيذ، طبق تكوين Terraform باستخدام terraform apply الأمر. يقوم هذا الأمر بإنشاء أو تعديل الموارد المعرفة في ملفك main.tf ضمن اشتراك Azure الخاص بك.

terraform apply

تحقق من تكوين منطقة التوافر

بعد إنشاء عنقود AKS وتجمعات العقد، يمكنك التحقق من توزيع العقد عبر مناطق التوفر باستخدام az aks show الأمر الذي يحتوي على --query المعلمة لتصفية المخرج. على سبيل المثال:

az aks show \
 --name example-cluster \
 --resource-group example-rg \
 --query agentPoolProfiles[].availabilityZones \
 --output tsv

التحقق من مواقع العقد

تحقق من توزيع العقد عبر مناطق التوافر باستخدام الأمر التالي kubectl get nodes :

kubectl get nodes -o custom-columns='NAME:metadata.name, REGION:metadata.labels.topology\.kubernetes\.io/region, ZONE:metadata.labels.topology\.kubernetes\.io/zone'

مثال على الإخراج:

NAME                                REGION   ZONE
aks-nodepool1-12345678-vmss000000   eastus   eastus-1
aks-nodepool1-12345678-vmss000001   eastus   eastus-2
aks-nodepool1-12345678-vmss000002   eastus   eastus-3

قائمة بوحدات التشغيل والعقد

تحقق من أي الوحدات والعقد تعمل باستخدام kubectl describe الأمر. على سبيل المثال:

kubectl describe pod | grep -e "^Name:" -e "^Node:"

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