توزيع حاوية الكشف عن اللغة في خدمة Azure Kubernetes

تعرَّف على كيفية توزيع حاوية اكتشاف اللغة. يوضح لك هذا الإجراء كيفية إنشاء حاويات Docker المحلية، ودفع الحاويات إلى سجل الحاويات الخاص بك، وتشغيل الحاوية في مجموعة Kubernetes، واختبارها في مستعرض ويب.

المتطلبات الأساسية

يتطلب هذا الإجراء عدة أدوات يجب تثبيتها وتشغيلها محلياً. لا تستخدم Azure Cloud Shell.

  • استخدم اشتراك Azure. إذا لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.
  • Git لنظام التشغيل الخاص بك حتى تتمكن من نسخ العينة المستخدمة في هذا الإجراء.
  • Azure CLI.
  • محرك Docker وتحقق من أن Docker CLI يعمل في نافذة وحدة التحكم.
  • kubectl.
  • مورد Azure بمستوى الأسعار الصحيح. لا تعمل جميع مستويات الأسعار مع هذه الحاوية:
    • مورد اللغة مع F0 أو مستويات الأسعار القياسي فقط.
    • مورد خدمات Azure الذكاء الاصطناعي مع مستوى تسعير S0.

تشغيل العينة

يقوم هذا الإجراء بتحميل وتشغيل نموذج حاوية خدمات azure الذكاء الاصطناعي للكشف عن اللغة. يحتوي النموذج على حاويتين، واحدة لتطبيق العميل وواحدة لحاوية خدمات Azure الذكاء الاصطناعي. سنقوم بدفع كلتا الصورتين إلى Azure Container Registry. بمجرد تسجيلها في السجل الخاص بك، قم بإنشاء خدمة Azure Kubernetes للوصول إلى هذه الصور وتشغيل الحاويات. عند تشغيل الحاويات، استخدم kubectl CLI لمشاهدة أداء الحاويات. قم بالوصول إلى تطبيق العميل مع طلب HTTP وشاهد النتائج.

رسم تخطيطي يوضح الفكرة المفاهيمية لتشغيل حاوية على Kubernetes

حاويات العينة

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

حاوية الواجهة الأمامية

يعد موقع الويب هذا مكافئاً لتطبيقك الخاص من جانب العميل الذي يقوم بطلبات نقطة نهاية اكتشاف اللغة. عند انتهاء الإجراء، تحصل على اللغة المكتشفة لسلسلة من الأحرف عن طريق الوصول إلى حاوية موقع الويب في متصفح باستخدام http://<external-IP>/<text-to-analyze>. مثال على عنوان URL هذا هو http://132.12.23.255/helloworld!. النتيجة في المتصفح هي English.

حاوية اللغة

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

بالنسبة لهذه الحاوية، تعد واجهة برمجة التطبيقات هذه عبارة عن طلب POST لاكتشاف اللغة. كما هو الحال مع جميع حاويات خدمات Azure الذكاء الاصطناعي، يمكنك معرفة المزيد حول الحاوية من معلومات Swagger المستضافة الخاصة بها، http://<external-IP>:5000/swagger/index.html.

المنفذ 5000 هو المنفذ الافتراضي المستخدم مع حاويات خدمات Azure الذكاء الاصطناعي.

أنشئ خدمة تسجيل حاوية Azure

لتوزيع الحاوية في خدمة Azure Kubernetes، يجب أن تكون صور الحاوية قابلة للوصول. قم بإنشاء خدمة Azure Container Registry الخاصة بك لاستضافة الصور.

  1. سجّل الدخول إلى Azure CLI

    az login
    
  2. قم بإنشاء مجموعة موارد باسم cogserv-container-rg للاحتفاظ بكل مورد تم إنشاؤه في هذا الإجراء.

    az group create --name cogserv-container-rg --location westus
    
  3. أنشئ Azure Container Registry الخاص بك بتنسيق اسمك ثم registry، مثل pattyregistry. لا تستخدم الشرطات أو تسطير الأحرف في الاسم.

    az acr create --resource-group cogserv-container-rg --name pattyregistry --sku Basic
    

    احفظ النتائج للحصول على خاصية loginServer. سيكون هذا جزءاً من عنوان الحاوية المستضافة، والذي سيتم استخدامه لاحقاً في ملف language.yml.

    az acr create --resource-group cogserv-container-rg --name pattyregistry --sku Basic
    
    {
        "adminUserEnabled": false,
        "creationDate": "2019-01-02T23:49:53.783549+00:00",
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistry",
        "location": "westus",
        "loginServer": "pattyregistry.azurecr.io",
        "name": "pattyregistry",
        "provisioningState": "Succeeded",
        "resourceGroup": "cogserv-container-rg",
        "sku": {
            "name": "Basic",
            "tier": "Basic"
        },
        "status": null,
        "storageAccount": null,
        "tags": {},
        "type": "Microsoft.ContainerRegistry/registries"
    }
    
  4. قم بتسجيل الدخول إلى سجل الحاوية الخاص بك. تحتاج إلى تسجيل الدخول قبل أن تتمكن من دفع الصور إلى السجل الخاص بك.

    az acr login --name pattyregistry
    

احصل على صورة Docker لموقع الويب

  1. نموذج التعليمات البرمجية المستخدمة في هذا الإجراء موجود في مستودع عينات حاويات خدمات Azure الذكاء الاصطناعي. نسخ المستودع للحصول على نسخة محلية من العينة.

    git clone https://github.com/Azure-Samples/cognitive-services-containers-samples
    

    بمجرد أن يصبح المستودع على جهاز الكمبيوتر المحلي لديك، ابحث عن موقع الويب في دليل dotnet Language FrontendService. يعمل موقع الويب هذا كتطبيق عميل يستدعي واجهة برمجة تطبيقات اكتشاف اللغة المستضافة في حاوية اكتشاف اللغة.

  2. بناء صورة Docker لهذا الموقع. تأكد من أن وحدة التحكم موجودة في دليل FrontendService حيث يوجد ملف Dockerfile عند تشغيل الأمر التالي:

    docker build -t language-frontend -t pattiyregistry.azurecr.io/language-frontend:v1 .
    

    لتتبع الإصدار في سجل الحاوية، أضف العلامة بتنسيق إصدار، مثل v1.

  3. ادفع الصورة إلى سجل الحاوية الخاص بك. قد يستغرق ذلك بضع دقائق.

    docker push pattyregistry.azurecr.io/language-frontend:v1
    

    إذا ظهر لك الخطأ unauthorized: authentication required، فقم بتسجيل الدخول باستخدام الأمر az acr login --name <your-container-registry-name>.

    عند الانتهاء من العملية، يجب أن تكون النتائج مشابهة لما يلي:

    The push refers to repository [pattyregistry.azurecr.io/language-frontend]
    82ff52ee6c73: Pushed
    07599c047227: Pushed
    816caf41a9a1: Pushed
    2924be3aed17: Pushed
    45b83a23806f: Pushed
    ef68f6734aa4: Pushed
    v1: digest: sha256:31930445deee181605c0cde53dab5a104528dc1ff57e5b3b34324f0d8a0eb286 size: 1580
    

احصل على صورة Docker للكشف عن اللغة

  1. اسحب أحدث إصدار من صورة Docker إلى الجهاز المحلي. قد يستغرق ذلك بضع دقائق. في حالة وجود إصدار أحدث من هذه الحاوية، قم بتغيير القيمة من 1.1.006770001-amd64-preview إلى الإصدار الأحدث.

    docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
    
  2. ضع علامة على الصورة مع سجل الحاوية الخاص بك. ابحث عن أحدث إصدار واستبدل الإصدار 1.1.006770001-amd64-preview إذا كان لديك إصدار أحدث.

    docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-preview
    
  3. ادفع الصورة إلى سجل الحاوية الخاص بك. قد يستغرق ذلك بضع دقائق.

    docker push pattyregistry.azurecr.io/language:1.1.006770001-amd64-preview
    

احصل على بيانات اعتماد Container Registry

الخطوات التالية ضرورية للحصول على المعلومات المطلوبة لتوصيل سجل الحاوية بخدمة Azure Kubernetes التي تنشئها لاحقاً في هذا الإجراء.

  1. إنشاء مدير الخدمة.

    az ad sp create-for-rbac
    

    احفظ قيمة النتائج appId للمعلمة المحال إليه في الخطوة 3، <appId>. احفظ password لمعلمة سر العميل للقسم التالي <client-secret>.

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "azure-cli-2018-12-31-18-39-32",
      "name": "http://azure-cli-2018-12-31-18-39-32",
      "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. احصل على معرف تسجيل الحاوية الخاص بك.

    az acr show --resource-group cogserv-container-rg --name pattyregistry --query "id" --o table
    

    احفظ ناتج قيمة معلمة النطاق، <acrId>، في الخطوة التالية. ستبدو مثل هذا:

    /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistry
    

    احفظ القيمة الكاملة للخطوة 3 في هذا القسم.

  3. لمنح الوصول الصحيح لمجموعة AKS لاستخدام الصور المخزنة في سجل الحاوية، قم بإنشاء مهمة تعيين. استبدل <appId> و<acrId> بالقيم التي تم جمعها في الخطوتين السابقتين.

    az role assignment create --assignee <appId> --scope <acrId> --role Reader
    

أنشئ خدمة Azure Kubernetes

  1. أنشئ مجموعة Kubernetes. جميع قيم المعلمات من الأقسام السابقة باستثناء معلمة الاسم. اختر اسماً يشير إلى من قام بإنشائه والغرض منه، مثل patty-kube.

    az aks create --resource-group cogserv-container-rg --name patty-kube --node-count 2  --service-principal <appId>  --client-secret <client-secret>  --generate-ssh-keys
    

    قد تستغرق هذه الخطوة بضع دقائق. النتيجة هي:

    {
      "aadProfile": null,
      "addonProfiles": null,
      "agentPoolProfiles": [
        {
          "count": 2,
          "dnsPrefix": null,
          "fqdn": null,
          "maxPods": 110,
          "name": "nodepool1",
          "osDiskSizeGb": 30,
          "osType": "Linux",
          "ports": null,
          "storageProfile": "ManagedDisks",
          "vmSize": "Standard_DS1_v2",
          "vnetSubnetId": null
        }
      ],
      "dnsPrefix": "patty-kube--65a101",
      "enableRbac": true,
      "fqdn": "patty-kube--65a101-341f1f54.hcp.westus.azmk8s.io",
      "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/cogserv-container-rg/providers/Microsoft.ContainerService/managedClusters/patty-kube",
      "kubernetesVersion": "1.9.11",
      "linuxProfile": {
        "adminUsername": "azureuser",
        "ssh": {
          "publicKeys": [
            {
              "keyData": "ssh-rsa AAAAB3NzaC...ohR2d81mFC
            }
          ]
        }
      },
      "location": "westus",
      "name": "patty-kube",
      "networkProfile": {
        "dnsServiceIp": "10.0.0.10",
        "dockerBridgeCidr": "172.17.0.1/16",
        "networkPlugin": "kubenet",
        "networkPolicy": null,
        "podCidr": "10.244.0.0/16",
        "serviceCidr": "10.0.0.0/16"
      },
      "nodeResourceGroup": "MC_patty_westus",
      "provisioningState": "Succeeded",
      "resourceGroup": "cogserv-container-rg",
      "servicePrincipalProfile": {
        "clientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "keyVaultSecretRef": null,
        "secret": null
      },
      "tags": null,
      "type": "Microsoft.ContainerService/ManagedClusters"
    }
    

    تم إنشاء الخدمة ولكنها لا تحتوي على حاوية موقع الويب أو حاوية الكشف عن اللغة حتى الآن.

  2. احصل على بيانات اعتماد مجموعة Kubernetes.

    az aks get-credentials --resource-group cogserv-container-rg --name patty-kube
    

قم بتحميل تعريف التزامن في خدمة Kubernetes الخاصة بك

يستخدم هذا القسم واجهة سطر الأوامر kubectl للتحدث مع خدمة Azure Kubernetes.

  1. قبل تحميل تعريف التزامن، تحقق من أن kubectl لديه حق الوصول إلى العقد.

    kubectl get nodes
    

    يبدو الرد كما يلي:

    NAME                       STATUS    ROLES     AGE       VERSION
    aks-nodepool1-13756812-0   Ready     agent     6m        v1.9.11
    aks-nodepool1-13756812-1   Ready     agent     6m        v1.9.11
    
  2. انسخ الملف التالي وقم بتسميته language.yml. يحتوي الملف على قسم service وقسم deployment لكلٍّ من نوعي الحاوية، language-frontend وحاوية موقع الويب language وحاوية الكشف language.

    # A service which exposes the .net frontend app container through a dependable hostname: http://language-frontend:5000
    apiVersion: v1
    kind: Service
    metadata:
      name: language-frontend
      labels:
        run: language-frontend
    spec:
      selector:
        app: language-frontend
      type: LoadBalancer
      ports:
      - name: front
        port: 80
        targetPort: 80
        protocol: TCP
    ---
    # A deployment declaratively indicating how many instances of the .net frontend app container we want up
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: language-frontend
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: language-frontend
        spec:
          containers:
          - name: language-frontend
            image: # < URI of the Frontend App image >
            ports:
            - name: public-port
              containerPort: 80
            livenessProbe:
              httpGet:
                path: /status
                port: public-port
              initialDelaySeconds: 30
              timeoutSeconds: 1
              periodSeconds: 10
          imagePullSecrets:
            - name: # < Name of the registry secret providing access to the frontend image >
          automountServiceAccountToken: false
    ---
    # A service which exposes the cognitive-service containers through a dependable hostname: http://language:5000
    apiVersion: v1
    kind: Service
    metadata:
      name: language
      labels:
        run: language
    spec:
      selector:
        app: language
      type: LoadBalancer
      ports:
      - name: language
        port: 5000
        targetPort: 5000
        protocol: TCP
    ---
    # A deployment declaratively indicating how many instances of the cognitive-service container we want up
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: language
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: language
        spec:
          containers:
          - name: language
            image: # < URI of the Language Image >
            ports:
            - name: public-port
              containerPort: 5000
            livenessProbe:
              httpGet:
                path: /status
                port: public-port
              initialDelaySeconds: 30
              timeoutSeconds: 1
              periodSeconds: 10
            args:
                - "eula=accept"
                - "apikey=" # < API Key for the Language Service >
                - "billing=" # < Language billing endpoint URI >
    
          imagePullSecrets:
            - name: # < Name of the registry secret providing access to the Language image >
    
          automountServiceAccountToken: false
    
  3. قم بتغيير سطور توزيع الواجهة الأمامية للغة language.yml استناداً إلى الجدول التالي لإضافة أسماء صور تسجيل الحاوية الخاصة بك، وسر العميل، وإعدادات خدمة اللغة.

    إعدادات توزيع الواجهة الأمامية للغة الغرض
    السطر 32
    image خاصية
    موقع الصورة لصورة الواجهة الأمامية في Container Registry
    <container-registry-name>.azurecr.io/language-frontend:v1
    السطر 44
    name خاصية
    سر سجل الحاوية للصورة، والمشار إليه بـ <client-secret> في قسم سابق.
  4. قم بتغيير سطور توزيع اللغة لـ language.yml استناداً إلى الجدول التالي لإضافة أسماء صور تسجيل الحاوية الخاصة بك، وسر العميل، وإعدادات خدمة اللغة.

    إعدادات توزيع اللغة الغرض
    السطر 78
    image خاصية
    موقع الصورة لصورة اللغة في Container Registry
    <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
    السطر 95
    name خاصية
    سر سجل الحاوية للصورة، والمشار إليه بـ <client-secret> في قسم سابق.
    السطر 91
    apiKey خاصية
    مفتاح موارد خدمة اللغة الخاصة بك
    السطر 92
    billing خاصية
    نقطة نهاية الفوترة لمورد خدمة اللغة.
    https://westus.api.cognitive.microsoft.com/text/analytics/v2.1

    نظراً لأنه تم تعيين apiKey ونقطة نهاية الفوترة كجزء من تعريف تزامن Kubernetes، فلن تحتاج حاوية موقع الويب إلى معرفة هذه الأمور أو تمريرها كجزء من الطلب. تشير حاوية موقع الويب إلى حاوية اكتشاف اللغة باسم المنسق language.

  5. قم بتحميل ملف تعريف التزامن لهذه العينة من المجلد حيث أنشأت وحفظت language.yml.

    kubectl apply -f language.yml
    

    الجواب:

    service "language-frontend" created
    deployment.apps "language-frontend" created
    service "language" created
    deployment.apps "language" created
    

احصل على عناوين IP خارجية للحاويات

بالنسبة للحاويتين، تحقق من تشغيل خدمتي language-frontend وlanguage واحصل على عنوان IP الخارجي.

kubectl get all
NAME                                     READY     STATUS    RESTARTS   AGE
pod/language-586849d8dc-7zvz5            1/1       Running   0          13h
pod/language-frontend-68b9969969-bz9bg   1/1       Running   1          13h

NAME                        TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
service/kubernetes          ClusterIP      10.0.0.1      <none>          443/TCP          14h
service/language            LoadBalancer   10.0.39.169   104.42.172.68   5000:30161/TCP   13h
service/language-frontend   LoadBalancer   10.0.42.136   104.42.37.219   80:30943/TCP     13h

NAME                                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/language            1         1         1            1           13h
deployment.extensions/language-frontend   1         1         1            1           13h

NAME                                                 DESIRED   CURRENT   READY     AGE
replicaset.extensions/language-586849d8dc            1         1         1         13h
replicaset.extensions/language-frontend-68b9969969   1         1         1         13h

NAME                                DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/language            1         1         1            1           13h
deployment.apps/language-frontend   1         1         1            1           13h

NAME                                           DESIRED   CURRENT   READY     AGE
replicaset.apps/language-586849d8dc            1         1         1         13h
replicaset.apps/language-frontend-68b9969969   1         1         1         13h

إذا تم عرض EXTERNAL-IP للخدمة على أنه معلق، أعد تشغيل الأمر حتى يظهر عنوان IP قبل الانتقال إلى الخطوة التالية.

اختبر حاوية اكتشاف اللغة

افتح متصفحاً وانتقل إلى عنوان IP الخارجي للحاوية language من القسم السابق: http://<external-ip>:5000/swagger/index.html. يمكنك استخدام ميزة Try it الخاصة بواجهة برمجة التطبيقات لاختبار نقطة نهاية اكتشاف اللغة.

لقطة شاشة توضح وثائق اختيال الحاوية

اختبر حاوية تطبيق العميل

قم بتغيير عنوان URL في المتصفح إلى عنوان IP الخارجي للحاوية language-frontend باستخدام التنسيق التالي: http://<external-ip>/helloworld. تم توقع نص الثقافة الإنجليزية لـ helloworld كـ English.

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

عند الانتهاء من نظام المجموعة، احذف مجموعة موارد Azure.

az group delete --name cogserv-container-rg

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

حاويات خدمات Azure الذكاء الاصطناعي