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

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

  • نشر مجموعة AKS مع الإعدادات الافتراضية باستخدام Azure CLI.
  • نشر تطبيق متعدد الحاويات مع مجموعة من الخدمات المصغرة وواجهات الويب الأمامية التي تحاكي سيناريو البيع بالتجزئة.

Note

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

إذا كنت تريد فقط نشر عنقود خدمة Azure Kubernetes، اختر Deploy to Azure لفتح متصفحك في بوابة Azure واختر تشغيل جميع الخطوات.

نشر في Azure

قبل البدء

يضمن هذا التشغيل السريع الفهم الأساسي لمفاهيم Kubernetes. لمزيد من المعلومات، راجع مفاهيم Kubernetes الأساسية الخاصة بخدمة Azure Kubernetes Service (AKS).

تسجيل موفري الموارد

قد تحتاج إلى تسجيل موفري الموارد في اشتراك Azure الخاص بك. على سبيل المثال ، Microsoft.ContainerService مطلوب.

قم بتشغيل الأمر التالي للتحقق من حالة التسجيل.

az provider show --namespace Microsoft.ContainerService --query registrationState

إذا لزم الأمر، قم بتسجيل موفر الموارد.

az provider register --namespace Microsoft.ContainerService

تعريف متغيرات البيئة

حدد متغيرات البيئة التالية للاستخدام خلال هذا التشغيل السريع.

export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
export RESOURCE_GROUP="myAKSResourceGroup$RANDOM_STRING"
export CLUSTER_NAME="myAKSCluster$RANDOM_STRING"
export USER_NP='userpool1'
export LOCATION="westus"

يخزن المتغير RANDOM_STRING سلسلة عشوائية مكونة من 10 أرقام. يتم ربط RANDOM_STRING قيم المتغيرين RESOURCE_GROUP مع CLUSTER_NAME القيمة لإنشاء أسماء فريدة. يخزن هذا USER_NP الاسم لمجموعة عقد وضع المستخدم. LOCATION المتغير له قيمة westus2. يمكنك استخدام هذه القيم المتغيرة أو إنشاء قيمك الخاص. استخدم echo الأمر لعرض قيم متغيرة مثل echo $RANDOM_STRING.

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

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

أنشئ مجموعة موارد مستخدماً الأمر az group create.

az group create --name $RESOURCE_GROUP --location $LOCATION

تبدو النتيجة مثل المثال التالي.

{
  "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myAKSResourceGroup<randomStringValue>",
  "location": "westus",
  "managedBy": null,
  "name": "myAKSResourceGroup<randomStringValue>",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

إنشاء نظام مجموعة AKS

أنشئ نظام مجموعة AKS باستخدام الأمر az aks create. ينشئ المثال التالي مجموعة مع عقدة واحدة ويمكن هوية مدارة معينة من قبل النظام.

az aks create \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --node-count 1 \
  --generate-ssh-keys

عند إنشاء مجموعة جديدة، تقوم AKS تلقائيا بإنشاء مجموعة موارد ثانية لتخزين موارد AKS. لمزيد من المعلومات، يمكنك الاطلاع على إجابة سؤال لماذا يتم إنشاء مجموعتي موارد باستخدام AKS؟

يحدد العنقود في هذا المثال عدد عقد واحدة لتوفير الوقت والموارد. في بيئة الإنتاج، التوصية هي عدد العقد بثلاث أو أكثر. الافتراضي az aks create يصبح ثلاث عقد إذا لم تحدد عدد العقد.

إضافة مجموعة عقد وضع المستخدم

يجب أن تعمل التطبيقات على مجموعات عقد وضع المستخدم بدلا من تجمع عقد وضع النظام الافتراضي. توفر مجموعات عقد المستخدمين عزلا ومرونة أفضل لأعباء عمل التطبيقات. أضف مجموعة عقد مستخدمين إلى مجموعتك باستخدام أمر az aks nodepool add .

az aks nodepool add \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $USER_NP \
  --node-count 1 \
  --mode User

مثل العنقود، حددنا عقدة واحدة، لكن الافتراضي هو ثلاث عقد إذا لم تحدد عدد العقد.

بعد إنشاء تجمع عقد المستخدمين، يمكنك التحقق من أن مجموعتك تحتوي على تجمع عقد نظام ومجموعة عقد مستخدمين باستخدام أمر az aks nodepool list .

az aks nodepool list \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --query "[].{Count:count, Mode:mode, NodePool:name, ResourceGroup:resourceGroup}"
[
  {
    "Count": 1,
    "Mode": "System",
    "NodePool": "nodepool1",
    "ResourceGroup": "myAKSResourceGroup1234554321"
  },
  {
    "Count": 1,
    "Mode": "User",
    "NodePool": "userpool1",
    "ResourceGroup": "myAKSResourceGroup1234554321"
  }
]

الاتصال بنظام المجموعة

لإدارة نظام مجموعة Kubernetes، استخدم سطر أوامر العميلkubectl. kubectl سيكون مثبتاً بالفعل في حال كنت تستخدم Azure Cloud Shell. للتثبيت kubectl محليا، استخدم الأمر az aks install-cli .

  1. قم بتكوين kubectl للاتصال بكتلة Kubernetes مستخدماً الأمر az aks get-credentials. هذا الأمر يقوم بتحميل بيانات الاعتماد وضبط Kubernetes CLI لاستخدامها.

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. تحقق من الاتصال بنظام مجموعتك مستخدماً أمرkubectl get. يعمل هذا الأمر على استرجاع قائمة نظام المجموعة العنقودية.

    kubectl get nodes
    
    NAME                                STATUS   ROLES    AGE     VERSION
    aks-nodepool1-123456789-vmss000000   Ready    <none>   15m     v1.34.4
    aks-userpool1-123456789-vmss000000   Ready    <none>   5m36s   v1.34.4
    

    هناك عقدتان، nodepool1 وهي مجموعة عقد النظام التي تم إنشاؤها مع العنقود وهي userpool1 مجموعة عقد المستخدم المضافة إلى العنقود.

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

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

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

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

Note

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

  1. قم بإنشاء ملف باسم aks-store-quickstart.yaml وانسخه في البيان التالي. استبدل البدلتين المؤقتتين بكلمة <defaultPassword> مرورك الخاصة. تستخدم هذه كلمة المرور للمستخدم الافتراضي للمثيرة RabbitMQ .

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: rabbitmq
    spec:
      serviceName: rabbitmq
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            kubernetes.io/os: linux
            kubernetes.azure.com/mode: user
          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: "<defaultPassword>"
            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
            kubernetes.azure.com/mode: user
          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: "<defaultPassword>"
            - 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
            startupProbe:
              httpGet:
                path: /health
                port: 3000
              failureThreshold: 5
              initialDelaySeconds: 20
              periodSeconds: 10
            readinessProbe:
              httpGet:
                path: /health
                port: 3000
              failureThreshold: 3
              initialDelaySeconds: 3
              periodSeconds: 5
            livenessProbe:
              httpGet:
                path: /health
                port: 3000
              failureThreshold: 5
              initialDelaySeconds: 3
              periodSeconds: 3
          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
            kubernetes.azure.com/mode: user
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            env:
            - name: AI_SERVICE_URL
              value: "http://ai-service:5001/"
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 2m
                memory: 20Mi
            readinessProbe:
              httpGet:
                path: /health
                port: 3002
              failureThreshold: 3
              initialDelaySeconds: 3
              periodSeconds: 5
            livenessProbe:
              httpGet:
                path: /health
                port: 3002
              failureThreshold: 5
              initialDelaySeconds: 3
              periodSeconds: 3
    ---
    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
            kubernetes.azure.com/mode: user
          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
            startupProbe:
              httpGet:
                path: /health
                port: 8080
              failureThreshold: 3
              initialDelaySeconds: 5
              periodSeconds: 5
            readinessProbe:
              httpGet:
                path: /health
                port: 8080
              failureThreshold: 3
              initialDelaySeconds: 3
              periodSeconds: 3
            livenessProbe:
              httpGet:
                path: /health
                port: 8080
              failureThreshold: 5
              initialDelaySeconds: 3
              periodSeconds: 3
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

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

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

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

    kubectl apply -f aks-store-quickstart.yaml
    
  3. شغل الأمر التالي للتحقق من نشر التطبيق على مجموعة عقد المستخدمين.

    kubectl get pods -o wide
    

    سيظهر الناتج أن وحدات rabbitmq، وorder-service، وproduct-service، وstore-front تعمل على عقدة في مجموعة عقد المستخدم.

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

يمكنك التحقق من أن التطبيق قيد التشغيل عن طريق زيارة عنوان IP العام أو عنوان URL للتطبيق.

شغل الأوامر التالية لعرض عنوان URL التطبيق:

runtime="5 minutes"
endtime=$(date -ud "$runtime" +%s)
while [[ $(date -u +%s) -le $endtime ]]
do
   STATUS=$(kubectl get pods -l app=store-front -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}')
   echo $STATUS
   if [ "$STATUS" == 'True' ]
   then
      export IP_ADDRESS=$(kubectl get service store-front --output 'jsonpath={..status.loadBalancer.ingress[0].ip}')
      echo "service IP address: $IP_ADDRESS"
      break
   else
      sleep 10
   fi
done

يظهر الناتج عنوان IP العام للتطبيق في العنوان <applicationIPAddress> المؤقت. تستخدم عنوان IP هذا لعرض التطبيق في الخطوات التالية.

service IP Address: <applicationIPAddress>

شغل الأمر التالي لإرسال طلب إلى عنوان URL التطبيق. استبدلها <applicationIPAddress> بعنوان IP الخاص بالخدمة.

curl <applicationIPAddress>

يعيد الأمر مخرجات HTML تظهر أن التطبيق يستجيب للطلب.

<!doctype html>
<html lang="">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Contoso Pet Store</title>
    <script type="module" crossorigin src="/assets/index-CLiaTzSi.js"></script>
    <link rel="stylesheet" crossorigin href="/assets/index-Cv6jORyk.css">
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

لعرض موقع التطبيق، افتح متصفح وأدخل عنوان IP للخدمة. تبدو الصفحة مثل المثال التالي.

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

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

إذا لم تكن تخطط لعمل درس AKS، قم بتنظيف الموارد غير الضرورية لتجنب رسوم الفوترة على Azure. يمكنك إزالة مجموعة الموارد وخدمة الحاوية وجميع الموارد ذات الصلة باستخدام الأمر az group delete .

az group delete --name $RESOURCE_GROUP --no-wait --yes

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

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

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

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