استخدام حاوية Computer Vision مع Kubernetes و Helm

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

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

المتطلبات الأساسية التالية قبل استخدام حاويات Computer Vision المحلية:

مطلوب الغرض
حساب Azure إذا لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.
Kubernetes CLI مطلوب Kubernetes CLI لإدارة بيانات الاعتماد المشتركة من سجل الحاوية. مطلوب أيضا Kubernetes قبل Helm، وهو مدير حزمة Kubernetes.
Helm CLI قم بتثبيت Helm CLI، والذي يستخدم لتثبيت مخطط helm (تعريف حزمة الحاوية).
مورد Computer Vision لاستخدام الحاوية، يجب أن يكون لديك:

مورد Azure Computer Vision ومفتاح API المقترن بنقطة النهاية URI. تتوفر كلتا القيمتين في صفحات Overview و Keys للمورد وهي مطلوبة لبدء الحاوية.

{API_KEY}: أحد مفتاحي الموارد المتوفرين في صفحة المفاتيح

{ENDPOINT_URI}: نقطة النهاية كما هو متوفر في صفحة نظرة عامة

جمع المعلمات المطلوبة

هناك حاجة إلى ثلاث معلمات أساسية لجميع حاويات الخدمات المعرفية. يجب أن تكون شروط ترخيص برامج Microsoft موجودة بقيمة قبول. هناك حاجة أيضا إلى URI نقطة النهاية ومفتاح API.

URI نقطة النهاية

{ENDPOINT_URI} تتوفر القيمة في صفحة نظرة عامة على مدخل Microsoft Azure لمورد الخدمات المعرفية المقابل. انتقل إلى صفحة نظرة عامة ، مرر مؤشر الماوس فوق نقطة النهاية، وتظهر أيقونة نسخ إلى الحافظة . انسخ نقطة النهاية واستخدمها عند الحاجة.

Screenshot that shows gathering the endpoint URI for later use.

المفاتيح

{API_KEY} يتم استخدام القيمة لبدء الحاوية وهي متوفرة في صفحة مفاتيح مدخل Microsoft Azure لمورد الخدمات المعرفية المقابل. انتقل إلى صفحة Keys ، وحدد أيقونة Copy to clipboard .

Screenshot that shows getting one of the two keys for later use.

هام

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

الكمبيوتر المضيف

المضيف هو كمبيوتر يستند إلى x64 يقوم بتشغيل حاوية Docker. يمكن أن يكون جهاز كمبيوتر في أماكن عملك أو خدمة استضافة Docker في Azure، مثل:

متطلبات الحاوية وتوصياتها

ملاحظة

تستند المتطلبات والتوصيات إلى معايير ذات طلب واحد في الثانية، باستخدام صورة 523 كيلوبايت لرسالة عمل ممسوحة ضوئيا تحتوي على 29 سطرا وإجمالي 803 أحرف. أدى التكوين الموصى به إلى استجابة أسرع بنسبة 2x تقريبا مقارنة بالحد الأدنى للتكوين.

يصف الجدول التالي تخصيص الحد الأدنى والموصى به للموارد لكل من حاويات Read OCR.

الحاوية الحدّ الأدنى المستحسنة
قراءة 3.2 2022-04-30 4 ذاكرات أساسية، ذاكرة 8 غيغابايت 8 نواة، ذاكرة 16 غيغا بايت
قراءة 3.2 2021-04-12 4 ذاكرات أساسية، ذاكرة 16 غيغابايت 8 نواة، ذاكرة 24 غيغابايت
قراءة 2.0-معاينة ذاكرة أساسية واحدة، 8 غيغابايت 8 نواة، ذاكرة 16 غيغا بايت
  • يجب أن يكون كل نواة 2.6 غيغاهيرتز على الأقل (غيغاهرتز) أو أسرع.

تتوافق الذاكرة والذاكرة مع --cpus الإعدادات و --memory ، والتي يتم استخدامها كجزء من docker run الأمر.

الاتصال إلى مجموعة Kubernetes

من المتوقع أن يكون للكمبيوتر المضيف مجموعة Kubernetes متوفرة. راجع هذا البرنامج التعليمي حول نشر مجموعة Kubernetes للحصول على فهم مفاهيمي لكيفية نشر مجموعة Kubernetes على كمبيوتر مضيف. يمكنك العثور على مزيد من المعلومات حول عمليات النشر في وثائق Kubernetes.

تكوين قيم مخطط Helm للنشر

ابدأ بإنشاء مجلد يسمى read. بعد ذلك، الصق محتوى YAML التالي في ملف جديد يسمى chart.yaml:

apiVersion: v2
name: read
version: 1.0.0
description: A Helm chart to deploy the Read OCR container to a Kubernetes cluster
dependencies:
- name: rabbitmq
  condition: read.image.args.rabbitmq.enabled
  version: ^6.12.0
  repository: https://kubernetes-charts.storage.googleapis.com/
- name: redis
  condition: read.image.args.redis.enabled
  version: ^6.0.0
  repository: https://kubernetes-charts.storage.googleapis.com/

لتكوين القيم الافتراضية لمخطط Helm، انسخ والصق YAML التالي في ملف يسمى values.yaml. استبدل التعليقات # {ENDPOINT_URI} و # {API_KEY} بقيمك الخاصة. تكوين resultExpirationPeriod وRedis و RabbitMQ إذا لزم الأمر.

# These settings are deployment specific and users can provide customizations
read:
  enabled: true
  image:
    name: cognitive-services-read
    registry:  mcr.microsoft.com/
    repository: azure-cognitive-services/vision/read
    tag: 3.2-preview.1
    args:
      eula: accept
      billing: # {ENDPOINT_URI}
      apikey: # {API_KEY}
      
      # Result expiration period setting. Specify when the system should clean up recognition results.
      # For example, resultExpirationPeriod=1, the system will clear the recognition result 1hr after the process.
      # resultExpirationPeriod=0, the system will clear the recognition result after result retrieval.
      resultExpirationPeriod: 1
      
      # Redis storage, if configured, will be used by read OCR container to store result records.
      # A cache is required if multiple read OCR containers are placed behind load balancer.
      redis:
        enabled: false # {true/false}
        password: password

      # RabbitMQ is used for dispatching tasks. This can be useful when multiple read OCR containers are
      # placed behind load balancer.
      rabbitmq:
        enabled: false # {true/false}
        rabbitmq:
          username: user
          password: password

هام

  • billing إذا لم يتم توفير القيمتين وapikey، تنتهي صلاحية الخدمات بعد 15 دقيقة. وبالمثل، يفشل التحقق لأن الخدمات غير متوفرة.

  • إذا قمت بنشر حاويات قراءة OCR متعددة خلف موازن تحميل، على سبيل المثال، ضمن Docker Compose أو Kubernetes، يجب أن يكون لديك ذاكرة تخزين مؤقت خارجية. نظرا لأن حاوية المعالجة وحاوية طلب GET قد لا تكون متماثلة، تقوم ذاكرة التخزين المؤقت الخارجية بتخزين النتائج ومشاركتها عبر الحاويات. للحصول على تفاصيل حول إعدادات ذاكرة التخزين المؤقت، راجع تكوين حاويات Computer Vision Docker.

إنشاء مجلد قوالب ضمن دليل القراءة . انسخ والصق YAML التالي في ملف يسمى deployment.yaml. deployment.yaml سيكون الملف بمثابة قالب Helm.

تنشئ القوالب ملفات بيان، وهي أوصاف موارد بتنسيق YAML يمكن أن يفهمها Kubernetes. - دليل قالب مخطط Helm

apiVersion: apps/v1
kind: Deployment
metadata:
  name: read
  labels:
    app: read-deployment
spec:
  selector:
    matchLabels:
      app: read-app
  template:
    metadata:
      labels:
        app: read-app       
    spec:
      containers:
      - name: {{.Values.read.image.name}}
        image: {{.Values.read.image.registry}}{{.Values.read.image.repository}}
        ports:
        - containerPort: 5000
        env:
        - name: EULA
          value: {{.Values.read.image.args.eula}}
        - name: billing
          value: {{.Values.read.image.args.billing}}
        - name: apikey
          value: {{.Values.read.image.args.apikey}}
        args:        
        - ReadEngineConfig:ResultExpirationPeriod={{ .Values.read.image.args.resultExpirationPeriod }}
        {{- if .Values.read.image.args.rabbitmq.enabled }}
        - Queue:RabbitMQ:HostName={{ include "rabbitmq.hostname" . }}
        - Queue:RabbitMQ:Username={{ .Values.read.image.args.rabbitmq.rabbitmq.username }}
        - Queue:RabbitMQ:Password={{ .Values.read.image.args.rabbitmq.rabbitmq.password }}
        {{- end }}      
        {{- if .Values.read.image.args.redis.enabled }}
        - Cache:Redis:Configuration={{ include "redis.connStr" . }}
        {{- end }}
      imagePullSecrets:
      - name: {{.Values.read.image.pullSecret}}      
--- 
apiVersion: v1
kind: Service
metadata:
  name: read-service
spec:
  type: LoadBalancer
  ports:
  - port: 5000
  selector:
    app: read-app

في مجلد القوالب نفسه، انسخ وظائف المساعد التالية والصقها في helpers.tpl. helpers.tpl يحدد الوظائف المفيدة للمساعدة في إنشاء قالب Helm.

ملاحظة

تحتوي هذه المقالة على مراجع لمصطلح slave، هو مصطلح لم تعد Microsoft تستخدمه. عند إزالة المصطلح من البرنامج، سنزيله من هذه المقالة.

{{- define "rabbitmq.hostname" -}}
{{- printf "%s-rabbitmq" .Release.Name -}}
{{- end -}}

{{- define "redis.connStr" -}}
{{- $hostMain := printf "%s-redis-master:6379" .Release.Name }}
{{- $hostReplica := printf "%s-redis-slave:6379" .Release.Name -}}
{{- $passWord := printf "password=%s" .Values.read.image.args.redis.password -}}
{{- $connTail := "ssl=False,abortConnect=False" -}}
{{- printf "%s,%s,%s,%s" $hostMain $hostReplica $passWord $connTail -}}
{{- end -}}

يحدد القالب خدمة موازن التحميل ونشر الحاوية/الصورة للقراءة.

حزمة Kubernetes (مخطط Helm)

يحتوي مخطط Helm على تكوين صورة (صور) docker التي سيتم سحبها من سجل الحاوية mcr.microsoft.com .

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

تسحب مخططات Helm المتوفرة صور docker لخدمة Computer Vision، والخدمة المقابلة من سجل الحاوية mcr.microsoft.com .

تثبيت مخطط Helm على نظام مجموعة Kubernetes

لتثبيت مخطط helm، سنحتاج إلى تنفيذ helm install الأمر . تأكد من تنفيذ أمر التثبيت من الدليل أعلى read المجلد.

helm install read ./read

فيما يلي مثال على الإخراج الذي قد تتوقع رؤيته من تنفيذ التثبيت الناجح:

NAME: read
LAST DEPLOYED: Thu Sep 04 13:24:06 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                    READY  STATUS             RESTARTS  AGE
read-57cb76bcf7-45sdh   0/1    ContainerCreating  0         0s

==> v1/Service
NAME     TYPE          CLUSTER-IP    EXTERNAL-IP  PORT(S)         AGE
read     LoadBalancer  10.110.44.86  localhost    5000:31301/TCP  0s

==> v1beta1/Deployment
NAME    READY  UP-TO-DATE  AVAILABLE  AGE
read    0/1    1           0          0s

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

kubectl get all

يجب أن تتوقع رؤية شيء مشابه للإخراج التالي:

kubectl get all
NAME                        READY   STATUS    RESTARTS   AGE
pod/read-57cb76bcf7-45sdh   1/1     Running   0          17s

NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/kubernetes     ClusterIP      10.96.0.1      <none>        443/TCP          45h
service/read           LoadBalancer   10.110.44.86   localhost     5000:31301/TCP   17s

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/read   1/1     1            1           17s

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/read-57cb76bcf7   1         1         1       17s

نشر حاويات v3 متعددة على مجموعة Kubernetes

بدءا من الإصدار 3 من الحاوية، يمكنك استخدام الحاويات بالتوازي على كل من مستوى المهمة والصفحة.

حسب التصميم، تحتوي كل حاوية v3 على مرسل وعامل التعرف. المرسل مسؤول عن تقسيم مهمة متعددة الصفحات إلى مهام فرعية متعددة في صفحة واحدة. تم تحسين عامل التعرف للتعرف على مستند صفحة واحدة. لتحقيق التوازي على مستوى الصفحة، قم بنشر حاويات v3 متعددة خلف موازن التحميل والسماح للحاويات بمشاركة التخزين العالمي وقوائم الانتظار.

ملاحظة

حاليا يتم دعم Azure Storage وAzure Queue فقط.

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

تعرض حاوية v3 واجهة برمجة تطبيقات فحص الحياة تحت /ContainerLiveness المسار. استخدم مثال التوزيع التالي لتكوين فحص حية ل Kubernetes.

انسخ والصق YAML التالي في ملف يسمى deployment.yaml. استبدل التعليقات # {ENDPOINT_URI} و # {API_KEY} بقيمك الخاصة. # {AZURE_STORAGE_CONNECTION_STRING} استبدل التعليق بسلسلة اتصال تخزين Azure. قم بتكوين replicas الرقم الذي تريده، والذي تم تعيينه إلى 3 في المثال التالي.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: read
  labels:
    app: read-deployment
spec:
  selector:
    matchLabels:
      app: read-app
  replicas: # {NUMBER_OF_READ_CONTAINERS}
  template:
    metadata:
      labels:
        app: read-app
    spec:
      containers:
      - name: cognitive-services-read
        image: mcr.microsoft.com/azure-cognitive-services/vision/read
        ports:
        - containerPort: 5000
        env:
        - name: EULA
          value: accept
        - name: billing
          value: # {ENDPOINT_URI}
        - name: apikey
          value: # {API_KEY}
        - name: Storage__ObjectStore__AzureBlob__ConnectionString
          value: # {AZURE_STORAGE_CONNECTION_STRING}
        - name: Queue__Azure__ConnectionString
          value: # {AZURE_STORAGE_CONNECTION_STRING}
        livenessProbe:
          httpGet:
            path: /ContainerLiveness
            port: 5000
          initialDelaySeconds: 60
          periodSeconds: 60
          timeoutSeconds: 20
--- 
apiVersion: v1
kind: Service
metadata:
  name: azure-cognitive-service-read
spec:
  type: LoadBalancer
  ports:
  - port: 5000
    targetPort: 5000
  selector:
    app: read-app

شغّل الأمر التالي:

kubectl apply -f deployment.yaml

فيما يلي مثال على المخرجات التي قد تراها من تنفيذ توزيع ناجح:

deployment.apps/read created
service/azure-cognitive-service-read created

يمكن أن يستغرق نشر Kubernetes عدة دقائق لإكماله. للتأكد من نشر كل من القرون والخدمات بشكل صحيح وإتاحتها، قم بتنفيذ الأمر التالي:

kubectl get all

يجب أن تشاهد إخراج وحدة التحكم مشابها للآتي:

kubectl get all
NAME                       READY   STATUS    RESTARTS   AGE
pod/read-6cbbb6678-58s9t   1/1     Running   0          3s
pod/read-6cbbb6678-kz7v4   1/1     Running   0          3s
pod/read-6cbbb6678-s2pct   1/1     Running   0          3s

NAME                                   TYPE           CLUSTER-IP   EXTERNAL-IP    PORT(S)          AGE
service/azure-cognitive-service-read   LoadBalancer   10.0.134.0   <none>         5000:30846/TCP   17h
service/kubernetes                     ClusterIP      10.0.0.1     <none>         443/TCP          78d

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/read   3/3     3            3           3s

NAME                             DESIRED   CURRENT   READY   AGE
replicaset.apps/read-6cbbb6678   3         3         3       3s

التحقق من تشغيل حاوية

هناك عدة طرق للتحقق من تشغيل الحاوية. حدد موقع عنوان IP الخارجي والمنفذ المكشوف للحاوية المعنية، وافتح مستعرض الويب المفضل لديك. استخدم عناوين URL للطلب المختلفة التي تلي للتحقق من تشغيل الحاوية. عناوين URL لطلب المثال المذكورة هنا هي http://localhost:5000، ولكن قد تختلف الحاوية المحددة. تأكد من الاعتماد على عنوان IP الخارجي للحاوية والمنفذ المكشوف.

URL للطلب الغرض
http://localhost:5000/ توفر الحاوية صفحةً رئيسيةً.
http://localhost:5000/ready عند طلب الحصول على، يوفر عنوان URL هذا التحقق من أن الحاوية جاهزة لقبول استعلام مقابل النموذج. يمكن استخدام هذا الطلب لفحوصات فعالية Kubernetes واستعداده.
http://localhost:5000/status مطلوب أيضا مع GET، يتحقق عنوان URL هذا مما إذا كان مفتاح api المستخدم لبدء الحاوية صالحا دون التسبب في استعلام نقطة النهاية. يمكن استخدام هذا الطلب لفحوصات فعالية Kubernetes واستعداده.
http://localhost:5000/swagger توفر الحاوية مجموعةً كاملةً من الوثائق لنقاط النهاية وميزة Try it out. باستخدام هذه الميزة، يمكنك إدخال إعداداتك في نموذج HTML مستند إلى الويب وإجراء الاستعلام دون الحاجة إلى كتابة أي تعليمة برمجية. بعد إرجاع الاستعلام، يتم توفير مثال لأمر CURL لتوضيح عناوين HTTP وتنسيق النص الأساسي المطلوب.

Container's home page

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

لمزيد من التفاصيل حول تثبيت التطبيقات باستخدام Helm في خدمة Azure Kubernetes (AKS)، تفضل بزيارة هنا.