التشغيل السريع: نشر نظام مجموعة Azure Kubernetes Service (AKS) باستخدام Terraform

خدمة Azure Kubernetes (AKS) هي خدمة Kubernetes مُدارة تتيح لك نشر المجموعات وإدارتها بسرعة. في هذه البداية السريعة، قمت بـ:

  • نشر نظام مجموعة AKS باستخدام Terraform.
  • قم بتشغيل نموذج تطبيق متعدد الحاويات مع مجموعة من الخدمات المصغرة والواجهات الأمامية على الويب التي تحاكي سيناريو البيع بالتجزئة.

إشعار

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

قبل البدء

إشعار

تجمع عقدة Azure Linux الآن في الاستفادة العامة (GA). للتعرف على المزايا وخطوات النشر، راجع مقدمة إلى مضيف حاوية Azure Linux ل AKS.

تسجيل الدخول إلى حساب Azure الخاص بك

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

سيناريوهات مصادقة Terraform وAzure

يدعم Terraform المصادقة على Azure فقط عبر Azure CLI. المصادقة باستخدام Azure PowerShell غير مدعومة. لذلك، بينما يمكنك استخدام الوحدة النمطية Azure PowerShell عند القيام بعمل Terraform الخاص بك، تحتاج أولا إلى المصادقة على Azure باستخدام Azure CLI.

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

المصادقة على Azure عبر حساب Microsoft

حساب Microsoft هو اسم مستخدم (مقترن ببريد إلكتروني وبيانات اعتماده) يستخدم لتسجيل الدخول إلى خدمات Microsoft - مثل Azure. يمكن إقران حساب Microsoft باشتراك واحد أو أكثر من اشتراكات Azure، حيث يكون أحد هذه الاشتراكات هو الاشتراك الافتراضي.

توضح لك الخطوات التالية كيفية القيام بالتالي:

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

  2. قم بتشغيل az login دون أي معلمات واتبع الإرشادات لتسجيل الدخول إلى Azure.

    az login
    

    النقاط الرئيسية:

    • عند تسجيل الدخول بنجاح، az login يعرض قائمة باشتراكات Azure المقترنة بحساب Microsoft الذي تم تسجيل الدخول إليه، بما في ذلك الاشتراك الافتراضي.
  3. لتأكيد اشتراك Azure الحالي، قم بتشغيل az account show.

    az account show
    
  4. لعرض جميع أسماء ومعرفات اشتراك Azure لحساب Microsoft معين، قم بتشغيل قائمة حسابات az.

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    النقاط الرئيسية:

    • استبدل <microsoft_account_email> العنصر النائب بعنوان البريد الإلكتروني لحساب Microsoft الذي تريد إدراج اشتراكات Azure الخاصة به.
    • باستخدام حساب Live - مثل Hotmail أو Outlook - قد تحتاج إلى تحديد عنوان البريد الإلكتروني المؤهل بالكامل. على سبيل المثال، إذا كان عنوان بريدك الإلكتروني هو admin@hotmail.com، فقد تحتاج إلى استبدال العنصر النائب ب live.com#admin@hotmail.com.
  5. لاستخدام اشتراك Azure معين، قم بتشغيل مجموعة حسابات az.

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    النقاط الرئيسية:

    • استبدل <subscription_id_or_subscription_name> العنصر النائب بمعرف الاشتراك الذي تريد استخدامه أو اسمه.
    • لا يعرض الاتصال az account set نتائج التبديل إلى اشتراك Azure المحدد. ومع ذلك، يمكنك استخدام az account show لتأكيد تغيير اشتراك Azure الحالي.
    • إذا قمت بتشغيل az account list الأمر من الخطوة السابقة، فسترى أن اشتراك Azure الافتراضي قد تغير إلى الاشتراك الذي حددته باستخدام az account set.

إنشاء كيان خدمة

يجب أن يكون لدى الأدوات التلقائية التي تنشر خدمات Azure أو تستخدمها - مثل Terraform - أذونات مقيدة دائما. بدلاً من قيام التطبيقات بتسجيل الدخول كمستخدم له امتيازات كاملة، يقدم Azure كيانات الخدمة.

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

  1. لإنشاء كيان خدمة، سجل الدخول إلى Azure. بعد المصادقة على Azure عبر حساب Microsoft، ارجع إلى هنا.

  2. إذا كنت تقوم بإنشاء كيان خدمة من Git Bash، فقم بتعيين MSYS_NO_PATHCONV متغير البيئة. (هذه الخطوة ليست ضرورية إذا كنت تستخدم Cloud Shell.)

    export MSYS_NO_PATHCONV=1    
    

    النقاط الرئيسية:

    • يمكنك تعيين MSYS_NO_PATHCONV متغير البيئة عالميا (لجميع جلسات العمل الطرفية) أو محليا (لجلسة العمل الحالية فقط). نظرا لأن إنشاء كيان خدمة ليس شيئا تقوم به في كثير من الأحيان، فإن العينة تعين قيمة جلسة العمل الحالية. لتعيين متغير البيئة هذا بشكل عام، أضف الإعداد إلى ~/.bashrc الملف.
  3. لإنشاء كيان خدمة، قم بتشغيل az ad sp create-for-rbac.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    النقاط الرئيسية:

    • يمكنك استبدال <service-principal-name> باسم مخصص للبيئة الخاصة بك أو حذف المعلمة بالكامل. إذا حذفت المعلمة، يتم إنشاء اسم كيان الخدمة استنادا إلى التاريخ والوقت الحاليين.
    • عند الانتهاء بنجاح، يعرض az ad sp create-for-rbac العديد من القيم. تُستخدم القيم appId وpassword وtenant في الخطوة التالية.
    • لا يمكن استرداد كلمة المرور إذا فقدت. على هذا النحو، يجب تخزين كلمة المرور الخاصة بك في مكان آمن. إذا نسيت كلمة المرور الخاصة بك، يمكنك إعادة تعيين بيانات اعتماد كيان الخدمة.
    • بالنسبة لهذه المقالة، يتم استخدام كيان خدمة مع دور مساهم . لمزيد من المعلومات حول أدوار التحكم في الوصول استنادا إلى الدور (RBAC)، راجع RBAC: الأدوار المضمنة.
    • يتضمن الإخراج من إنشاء كيان الخدمة بيانات اعتماد حساسة. تأكد من عدم تضمين بيانات الاعتماد هذه في التعليمات البرمجية الخاصة بك أو تحقق من بيانات الاعتماد في عنصر التحكم بالمصادر.
    • لمزيد من المعلومات حول الخيارات عند إنشاء كيان خدمة باستخدام Azure CLI، راجع المقالة إنشاء كيان خدمة Azure باستخدام Azure CLI.

تحديد بيانات اعتماد كيان الخدمة في متغيرات البيئة

بمجرد إنشاء كيان خدمة، يمكنك تحديد بيانات الاعتماد الخاصة به إلى Terraform عبر متغيرات البيئة.

  1. قم بتحرير ~/.bashrc الملف عن طريق إضافة متغيرات البيئة التالية.

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. لتنفيذ ~/.bashrc البرنامج النصي، قم بتشغيل source ~/.bashrc (أو ما يعادله . ~/.bashrcالمختصر ). يمكنك أيضا إنهاء Cloud Shell وإعادة فتحه لتشغيل البرنامج النصي تلقائيا.

    . ~/.bashrc
    
  3. بمجرد تعيين متغيرات البيئة، يمكنك التحقق من قيمها كما يلي:

    printenv | grep ^ARM*
    

النقاط الرئيسية:

  • كما هو الحال مع أي متغير بيئة، للوصول إلى قيمة اشتراك Azure من داخل برنامج نصي Terraform، استخدم بناء الجملة التالي: ${env.<environment_variable>}. على سبيل المثال، للوصول إلى ARM_SUBSCRIPTION_ID القيمة، حدد ${env.ARM_SUBSCRIPTION_ID}.
  • يؤدي إنشاء خطط تنفيذ Terraform وتطبيقها إلى إجراء تغييرات على اشتراك Azure المقترن بكيان الخدمة. قد تكون هذه الحقيقة مربكة في بعض الأحيان إذا قمت بتسجيل الدخول إلى اشتراك Azure واحد وتشير متغيرات البيئة إلى اشتراك Azure ثان. لنلق نظرة على المثال التالي لشرحه. لنفترض أن لديك اشتراكين في Azure: SubA وSubB. إذا كان اشتراك Azure الحالي هو SubA (يتم تحديده عبر az account show) بينما تشير متغيرات البيئة إلى SubB، فإن أي تغييرات يتم إجراؤها بواسطة Terraform تكون على SubB. لذلك، ستحتاج إلى تسجيل الدخول إلى اشتراك SubB لتشغيل أوامر Azure CLI أو أوامر Azure PowerShell لعرض التغييرات.

تحديد بيانات اعتماد كيان الخدمة في كتلة موفر Terraform

تحدد كتلة موفر Azure بناء الجملة الذي يسمح لك بتحديد معلومات مصادقة اشتراك Azure.

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

تنبيه

يمكن أن تكون القدرة على تحديد بيانات اعتماد اشتراك Azure في ملف تكوين Terraform ملائمة - خاصة عند الاختبار. ومع ذلك، لا ينصح بتخزين بيانات الاعتماد في ملف نصي واضح يمكن عرضه من قبل الأفراد غير الموثوق بهم.

تنفيذ كود Terraform

إشعار

يوجد نموذج التعليمات البرمجية لهذه المقالة في مستودع Azure Terraform GitHub. يمكنك عرض ملف السجل الذي يحتوي على نتائج الاختبار من الإصدارات الحالية والسابقة من Terraform.

راجع المزيد من المقالات ونماذج التعليمات البرمجية التي توضح كيفية استخدام Terraform لإدارة موارد Azure

  1. إنشاء دليل يمكنك استخدامه لاختبار نموذج التعليمات البرمجية Terraform وجعله دليلك الحالي.

  2. قم بإنشاء ملف باسم providers.tf وأدخل التعليمة البرمجية التالية:

    terraform {
      required_version = ">=1.0"
    
      required_providers {
        azapi = {
          source  = "azure/azapi"
          version = "~>1.5"
        }
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
        time = {
          source  = "hashicorp/time"
          version = "0.9.1"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. قم بإنشاء ملف باسم ssh.tf وأدخل التعليمة البرمجية التالية:

    resource "random_pet" "ssh_key_name" {
      prefix    = "ssh"
      separator = ""
    }
    
    resource "azapi_resource_action" "ssh_public_key_gen" {
      type        = "Microsoft.Compute/sshPublicKeys@2022-11-01"
      resource_id = azapi_resource.ssh_public_key.id
      action      = "generateKeyPair"
      method      = "POST"
    
      response_export_values = ["publicKey", "privateKey"]
    }
    
    resource "azapi_resource" "ssh_public_key" {
      type      = "Microsoft.Compute/sshPublicKeys@2022-11-01"
      name      = random_pet.ssh_key_name.id
      location  = azurerm_resource_group.rg.location
      parent_id = azurerm_resource_group.rg.id
    }
    
    output "key_data" {
      value = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey
    }
    
  4. قم بإنشاء ملف باسم main.tf وأدخل التعليمة البرمجية التالية:

    # Generate random resource group name
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    resource "random_pet" "azurerm_kubernetes_cluster_name" {
      prefix = "cluster"
    }
    
    resource "random_pet" "azurerm_kubernetes_cluster_dns_prefix" {
      prefix = "dns"
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
      location            = azurerm_resource_group.rg.location
      name                = random_pet.azurerm_kubernetes_cluster_name.id
      resource_group_name = azurerm_resource_group.rg.name
      dns_prefix          = random_pet.azurerm_kubernetes_cluster_dns_prefix.id
    
      identity {
        type = "SystemAssigned"
      }
    
      default_node_pool {
        name       = "agentpool"
        vm_size    = "Standard_D2_v2"
        node_count = var.node_count
      }
      linux_profile {
        admin_username = var.username
    
        ssh_key {
          key_data = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey
        }
      }
      network_profile {
        network_plugin    = "kubenet"
        load_balancer_sku = "standard"
      }
    }
    
  5. قم بإنشاء ملف باسم variables.tf وأدخل التعليمة البرمجية التالية:

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "node_count" {
      type        = number
      description = "The initial quantity of nodes for the node pool."
      default     = 3
    }
    
    variable "msi_id" {
      type        = string
      description = "The Managed Service Identity ID. Set this value if you're running this example using Managed Identity as the authentication method."
      default     = null
    }
    
    variable "username" {
      type        = string
      description = "The admin username for the new cluster."
      default     = "azureadmin"
    }
    
  6. قم بإنشاء ملف باسم outputs.tf وأدخل التعليمة البرمجية التالية:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "kubernetes_cluster_name" {
      value = azurerm_kubernetes_cluster.k8s.name
    }
    
    output "client_certificate" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_certificate
      sensitive = true
    }
    
    output "client_key" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_key
      sensitive = true
    }
    
    output "cluster_ca_certificate" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].cluster_ca_certificate
      sensitive = true
    }
    
    output "cluster_password" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].password
      sensitive = true
    }
    
    output "cluster_username" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].username
      sensitive = true
    }
    
    output "host" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].host
      sensitive = true
    }
    
    output "kube_config" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config_raw
      sensitive = true
    }
    

تهيئة Terraform

قم بتشغيل terraform init لتهيئة توزيع Terraform. يقوم هذا الأمر بتنزيل موفر Azure المطلوب لإدارة موارد Azure.

terraform init -upgrade

النقاط الرئيسية:

  • تقوم -upgrade المعلمة بترقية مكونات الموفر الإضافية الضرورية إلى أحدث إصدار يتوافق مع قيود إصدار التكوين.

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

قم بتشغيل خطة terraform لإنشاء خطة تنفيذ.

terraform plan -out main.tfplan

النقاط الرئيسية:

  • ينشئ الأمر terraform plan خطة تنفيذ، لكنه لا ينفذها. بدلًا من ذلك، يحدد الإجراءات الضرورية لإنشاء التكوين المحدد في ملفات التكوين الخاصة بك. يسمح لك هذا النمط بالتحقق مما إذا كانت خطة التنفيذ تتطابق مع توقعاتك قبل إجراء أي تغييرات على الموارد الفعلية.
  • تسمح المعلمة -out الاختيارية بتحديد ملف الإخراج للخطة. يضمن استخدام -out المعلمة أن الخطة التي راجعتها هي بالضبط ما يتم تطبيقها.

تطبيق خطة تنفيذ Terraform

قم بتشغيل تطبيق terraform لتطبيق خطة التنفيذ على البنية الأساسية السحابية الخاصة بك.

terraform apply main.tfplan

النقاط الرئيسية:

  • يفترض الأمر المثال terraform apply أنك قمت بتشغيل terraform plan -out main.tfplanمسبقا .
  • إذا قمت بتحديد اسم ملف مختلف للمعلمة -out، فاستخدم نفس اسم الملف في الاستدعاء terraform apply.
  • إذا لم تستخدم المعلمة -out، استدع terraform apply دون أي معلمات.

تحقق من النتائج

  1. احصل على اسم مجموعة موارد Azure باستخدام الأمر التالي.

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. عرض اسم مجموعة Kubernetes الجديدة باستخدام الأمر az aks list .

    az aks list \
      --resource-group $resource_group_name \
      --query "[].{\"K8s cluster name\":name}" \
      --output table
    
  3. احصل على تكوين Kubernetes من حالة Terraform وقم بتخزينه في ملف kubectl يمكنه القراءة باستخدام الأمر التالي.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  4. تحقق من أن الأمر السابق لم يضيف حرف ASCII EOT باستخدام الأمر التالي.

    cat ./azurek8s
    

    النقاط الرئيسية:

    • إذا رأيت << EOT في البداية وفي EOT النهاية، فقم بإزالة هذه الأحرف من الملف. وإلا، فقد تتلقى رسالة الخطأ التالية: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
  5. قم بتعيين متغير بيئة حتى kubectl تتمكن من التقاط التكوين الصحيح باستخدام الأمر التالي.

    export KUBECONFIG=./azurek8s
    
  6. تحقق من صحة نظام المجموعة باستخدام kubectl get nodes الأمر .

    kubectl get nodes
    

النقاط الرئيسية:

  • عند إنشاء نظام مجموعة AKS، تم تمكين المراقبة لالتقاط مقاييس السلامة لكل من عقد نظام المجموعة والقرون. تتوفر مقاييس الصحة هذه في مدخل Microsoft Azure. لمزيد من المعلومات حول مراقبة صحة الحاوية، راجع مراقبة صحة خدمة Azure Kubernetes.
  • العديد من القيم الرئيسية المصنفة كمخرجات عند تطبيق خطة تنفيذ Terraform. على سبيل المثال، يتم إخراج عنوان المضيف واسم مستخدم نظام مجموعة AKS وكلمة مرور نظام مجموعة AKS.

قم بنشر التطبيق

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

لقطة شاشة لبنية نموذج Azure Store.

  • واجهة المتجر: تطبيق ويب للعملاء لعرض المنتجات وتقديم الطلبات.
  • خدمة المنتج: تعرض معلومات المنتج.
  • خدمة الطلب: يضع الطلبات.
  • Rabbit MQ: قائمة انتظار الرسائل لقائمة انتظار الطلبات.

إشعار

لا نوصي بتشغيل حاويات ذات حالة، مثل Rabbit MQ، دون تخزين مستمر للإنتاج. يتم استخدام هذه هنا للتبسيط، ولكن نوصي باستخدام الخدمات المدارة، مثل Azure CosmosDB أو ناقل خدمة Azure.

  1. أنشئ ملفا باسم aks-store-quickstart.yaml وانسخه في البيان التالي:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rabbitmq
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "password"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins            
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: order-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: order-service
      template:
        metadata:
          labels:
            app: order-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: order-service
            image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "password"
            - name: ORDER_QUEUE_NAME
              value: "orders"
            - name: FASTIFY_ADDRESS
              value: "0.0.0.0"
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
          initContainers:
          - name: wait-for-rabbitmq
            image: busybox
            command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;']
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 1m
                memory: 7Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env: 
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

    للحصول على تصنيف تفصيلي لملفات بيان YAML، راجع عمليات التوزيع وبيانات YAML.

    إذا قمت بإنشاء ملف YAML وحفظه محليا، فيمكنك تحميل ملف البيان إلى الدليل الافتراضي في CloudShell عن طريق تحديد الزر تحميل/تنزيل الملفات وتحديد الملف من نظام الملفات المحلي.

  2. انشر التطبيق باستخدام kubectl apply الأمر وحدد اسم بيان YAML.

    kubectl apply -f aks-store-quickstart.yaml
    

    يوضح إخراج المثال التالي عمليات التوزيع والخدمات:

    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    

اختبر التطبيق

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

  1. تحقق من حالة pods المنشورة kubectl get pods باستخدام الأمر . جعل جميع الحجيرات قبل Running المتابعة.

    kubectl get pods
    
  2. تحقق من وجود عنوان IP عام لتطبيق المتجر الأمامي. راقب التقدم باستخدام الأمر ⁧kubectl get service⁩ مع الوسيطة --watch.

    kubectl get service store-front --watch
    

    يظهر إخراج EXTERNAL-IP للخدمة store-front في البداية على أنه معلق:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  3. بمجرد تغيير عنوان EXTERNAL-IP من معلق إلى عنوان IP عام فعلي، استخدم CTRL-C لتعطيل عملية kubectl المراقبة.

    يوضح المثال التالي إخراج لعنوان IP عام صالحاً تم تعيينه للخدمة:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  4. افتح مستعرض ويب إلى عنوان IP الخارجي للخدمة لمشاهدة تطبيق Azure Store قيد التنفيذ.

    لقطة شاشة لتطبيق عينة AKS Store.

تنظيف الموارد

حذف موارد AKS

عندما لم تعد بحاجة إلى الموارد التي تم إنشاؤها عبر Terraform، قم بالخطوات التالية:

  1. قم بتشغيل خطة terraform وحدد العلامة destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    النقاط الرئيسية:

    • ينشئ الأمر terraform plan خطة تنفيذ، لكنه لا ينفذها. بدلًا من ذلك، يحدد الإجراءات الضرورية لإنشاء التكوين المحدد في ملفات التكوين الخاصة بك. يسمح لك هذا النمط بالتحقق مما إذا كانت خطة التنفيذ تتطابق مع توقعاتك قبل إجراء أي تغييرات على الموارد الفعلية.
    • تسمح المعلمة -out الاختيارية بتحديد ملف الإخراج للخطة. يضمن استخدام -out المعلمة أن الخطة التي راجعتها هي بالضبط ما يتم تطبيقها.
  2. قم بتشغيل تطبيق terraform لتطبيق خطة التنفيذ.

    terraform apply main.destroy.tfplan
    

حذف كيان الخدمة

  1. احصل على معرف كيان الخدمة باستخدام الأمر التالي.

    sp=$(terraform output -raw sp)
    
  2. احذف كيان الخدمة باستخدام الأمر az ad sp delete .

    az ad sp delete --id $sp
    

استنساخ قالب Azure Developer CLI

يسمح لك Azure Developer CLI بتنزيل العينات بسرعة من مستودع Azure-Samples . في التشغيل السريع، يمكنك تنزيل aks-store-demo التطبيق. لمزيد من المعلومات حول حالات الاستخدام العام، راجع azd نظرة عامة.

  1. استنساخ قالب العرض التوضيحي لتخزين AKS من مستودع Azure-Samples باستخدام azd init الأمر مع المعلمة --template .

    azd init --template Azure-Samples/aks-store-demo
    
  2. أدخل اسم بيئة لمشروعك يستخدم الأحرف الأبجدية الرقمية والواصلات فقط، مثل aks-terraform-1.

    Enter a new environment name: aks-terraform-1
    

تسجيل الدخول إلى حساب Azure Cloud الخاص بك

يحتوي القالب azd على جميع التعليمات البرمجية اللازمة لإنشاء الخدمات، ولكن تحتاج إلى تسجيل الدخول إلى حساب Azure الخاص بك لاستضافة التطبيق على AKS.

  1. سجل الدخول إلى حسابك باستخدام azd auth login الأمر .

    azd auth login
    
  2. انسخ رمز الجهاز الذي يظهر في الإخراج واضغط على Enter لتسجيل الدخول.

    Start by copying the next code: XXXXXXXXX
    Then press enter and continue to log in from your browser...
    

    هام

    إذا كنت تستخدم جهازا ظاهريا خارج الشبكة أو GitHub Codespace، تتسبب بعض نهج أمان Azure في حدوث تعارضات عند استخدامها لتسجيل الدخول باستخدام azd auth login. إذا واجهت مشكلة هنا، يمكنك اتباع الحل البديل azd auth المقدم، والذي يتضمن استخدام curl طلب إلى عنوان URL المضيف المحلي الذي تمت إعادة توجيهك إليه بعد تشغيل azd auth login.

  3. قم بالمصادقة باستخدام بيانات الاعتماد الخاصة بك على صفحة تسجيل الدخول الخاصة بمؤسستك.

  4. تأكد من أنك تحاول الاتصال من Azure CLI.

  5. تحقق من الرسالة "اكتملت مصادقة رمز الجهاز. تسجيل الدخول إلى Azure." يظهر في المحطة الطرفية الأصلية.

    Waiting for you to complete authentication in the browser...
    Device code authentication completed.
    Logged in to Azure.
    

الحل البديل لمصادقة azd

يتطلب هذا الحل البديل تثبيت Azure CLI .

  1. افتح نافذة طرفية وسجل الدخول باستخدام Azure CLI باستخدام az login الأمر مع تعيين المعلمة --scope إلى https://graph.microsoft.com/.default.

    az login --scope https://graph.microsoft.com/.default
    

    يجب إعادة توجيهك إلى صفحة مصادقة في علامة تبويب جديدة لإنشاء رمز مميز للوصول إلى المستعرض، كما هو موضح في المثال التالي:

    https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?clientid=<your_client_id>.
    
  2. انسخ عنوان URL المضيف المحلي لصفحة الويب التي تلقيتها بعد محاولة تسجيل الدخول باستخدام azd auth login.

  3. في نافذة طرفية جديدة، استخدم الطلب التالي curl لتسجيل الدخول. تأكد من استبدال <localhost> العنصر النائب بعنوان URL المضيف المحلي الذي نسخته في الخطوة السابقة.

    curl <localhost>
    

    يقوم تسجيل الدخول الناجح بمخرجات صفحة ويب HTML، كما هو موضح في المثال التالي:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="refresh" content="60;url=https://docs.microsoft.com/cli/azure/">
        <title>Login successfully</title>
        <style>
            body {
                font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            }
    
            code {
                font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
                display: inline-block;
                background-color: rgb(242, 242, 242);
                padding: 12px 16px;
                margin: 8px 0px;
            }
        </style>
    </head>
    <body>
        <h3>You have logged into Microsoft Azure!</h3>
        <p>You can close this window, or we will redirect you to the <a href="https://docs.microsoft.com/cli/azure/">Azure CLI documentation</a> in 1 minute.</p>
        <h3>Announcements</h3>
        <p>[Windows only] Azure CLI is collecting feedback on using the <a href="https://learn.microsoft.com/windows/uwp/security/web-account-manager">Web Account Manager</a> (WAM) broker for the login experience.</p>
        <p>You may opt-in to use WAM by running the following commands:</p>
        <code>
            az config set core.allow_broker=true<br>
            az account clear<br>
            az login
        </code>
    </body>
    </html>
    
  4. أغلق المحطة الطرفية الحالية وافتح المحطة الطرفية الأصلية. يجب أن تشاهد قائمة JSON باشتراكاتك.

  5. انسخ id حقل الاشتراك الذي تريد استخدامه.

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

    az account set --subscription <subscription_id>
    

إنشاء الموارد ونشرها لنظام المجموعة

لنشر التطبيق، يمكنك استخدام azd up الأمر لإنشاء كافة الكائنات المطلوبة لتشغيل تطبيق AKS Store.

  • azure.yaml يحدد الملف الحالة المطلوبة لنظام المجموعة، مثل صور الحاوية التي يجب إحضارها ويتضمن عمليات نشر وخدمات Kubernetes التالية:

رسم تخطيطي يوضح بنية نموذج Azure Store.

  • واجهة المتجر: تطبيق ويب للعملاء لعرض المنتجات وتقديم الطلبات.
  • خدمة المنتج: تعرض معلومات المنتج.
  • خدمة الطلب: يضع الطلبات.
  • Rabbit MQ: قائمة انتظار الرسائل لقائمة انتظار الطلبات.

إشعار

لا نوصي بتشغيل حاويات ذات حالة، مثل Rabbit MQ، دون تخزين مستمر للإنتاج. يتم استخدام هذه هنا للتبسيط، ولكن نوصي باستخدام الخدمات المدارة، مثل Azure Cosmos DB أو ناقل خدمة Azure.

توزيع موارد التطبيق

azd ينشئ قالب هذا التشغيل السريع مجموعة موارد جديدة مع نظام مجموعة AKS وAzure Key Vault. يخزن key vault أسرار العميل ويشغل الخدمات في pets مساحة الاسم.

  1. إنشاء كافة موارد التطبيق باستخدام azd up الأمر .

    azd up
    

    azd up يقوم بتشغيل جميع الخطافات داخل azd-hooks المجلد لتسجيل خدمات التطبيق وتوفيرها ونشرها مسبقا.

    تخصيص الخطافات لإضافة تعليمات برمجية مخصصة إلى azd مراحل سير العمل. لمزيد من المعلومات، راجع azd مرجع الخطافات .

  2. حدد اشتراك Azure لاستخدام الفوترة.

    ? Select an Azure Subscription to use:  [Use arrows to move, type to filter]
    > 1. My Azure Subscription (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
    
  3. حدد منطقة لنشر التطبيق الخاص بك إليها.

    Select an Azure location to use:  [Use arrows to move, type to filter]
      1.  (South America) Brazil Southeast (brazilsoutheast)
      2.  (US) Central US (centralus)
      3.  (US) East US (eastus)
    > 43. (US) East US 2 (eastus2)
      4.  (US) East US STG (eastusstg)
      5.  (US) North Central US (northcentralus)
      6.  (US) South Central US (southcentralus)
    

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

    SUCCESS: Your workflow to provision and deploy to Azure completed in 9 minutes 40 seconds.
    

إنشاء خطط Terraform

داخل قالب Azure Developer، /infra/terraform يحتوي المجلد على جميع التعليمات البرمجية المستخدمة لإنشاء خطة Terraform.

ينشر Terraform الأوامر ويشغلها باستخدام terraform apply كجزء من azdخطوة التزويد. بمجرد الانتهاء، يجب أن تشاهد إخراجا مشابها للمثال التالي:

Plan: 5 to add, 0 to change, 0 to destroy.
...
Saved the plan to: /workspaces/aks-store-demo/.azure/aks-terraform-azd/infra/terraform/main.tfplan

اختبر التطبيق

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

  1. قم بتعيين مساحة الاسم كمساحة pets اسم تجريبية kubectl set-context باستخدام الأمر .

    kubectl config set-context --current --namespace=pets
    
  2. تحقق من حالة pods المنشورة kubectl get pods باستخدام الأمر . تأكد من أن جميع القرون Running قبل المتابعة.

    kubectl get pods
    
  3. تحقق من وجود عنوان IP عام للتطبيق الأمامي للمتجر وراقب التقدم باستخدام kubectl get service الأمر مع الوسيطة --watch .

    kubectl get service store-front --watch
    

    يظهر إخراج EXTERNAL-IP للخدمة store-front في البداية على أنه معلق:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  4. بمجرد تغيير عنوان EXTERNAL-IP من معلق إلى عنوان IP عام فعلي، استخدم CTRL-C لتعطيل عملية kubectl المراقبة.

    يظهر إخراج العينة التالي عنوان IP عاما صالحا تم تعيينه للخدمة:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  5. افتح مستعرض ويب إلى عنوان IP الخارجي للخدمة لمشاهدة تطبيق Azure Store قيد التنفيذ.

    لقطة شاشة لتطبيق عينة AKS Store.

قم بحذف نظام المجموعة

بمجرد الانتهاء من التشغيل السريع، قم بتنظيف الموارد غير الضرورية لتجنب رسوم Azure.

  1. احذف جميع الموارد التي تم إنشاؤها في التشغيل السريع باستخدام azd down الأمر .

    azd down
    
  2. تأكد من قرارك بإزالة جميع الموارد المستخدمة من اشتراكك عن طريق الكتابة y والضغط على Enter.

    ? Total resources to delete: 14, are you sure you want to continue? (y/N)
    
  3. السماح بالتطهير لإعادة استخدام متغيرات التشغيل السريع إذا كان ذلك ممكنا عن طريق الكتابة y والضغط على Enter.

    [Warning]: These resources have soft delete enabled allowing them to be recovered for a period or time after deletion. During this period, their names can't be reused. In the future, you can use the argument --purge to skip this confirmation.
    

استكشاف أخطاء Terraform على Azure وإصلاحها

استكشاف المشكلات الشائعة وإصلاحها عند استخدام Terraform على Azure.

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

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

لمعرفة المزيد حول AKS والمرور عبر مثال كامل على التعليمات البرمجية للتوزيع، تابع البرنامج التعليمي لنظام مجموعة Kubernetes.