Distribuire il contenitore di rilevamento della lingua nel servizio Azure Kubernetes
Informazioni su come distribuire il contenitore di rilevamento della lingua. Questa procedura illustra come creare i contenitori Docker locali, eseguire il push dei contenitori in un registro contenitori privato, eseguire il contenitore in un cluster Kubernetes e testarlo in un Web browser.
Prerequisiti
Questa procedura richiede diversi strumenti che devono essere installati ed eseguiti in locale. Non usare Azure Cloud Shell.
- Usare una sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
- Git per il sistema operativo, in modo che sia possibile clonare l'esempio usato in questa procedura.
- Interfaccia della riga di comando di Azure.
- Motore Docker e verificare che l'interfaccia della riga di comando di Docker funzioni in una finestra della console.
- kubectl.
- Una risorsa di Azure con il piano tariffario corretto. Non tutti i piani tariffari funzionano con questo contenitore:
- Risorsa Lingua solo con piano tariffario Standard o F0.
- Risorsa Servizi di Azure AI con piano tariffario S0.
Esecuzione dell'esempio
Questa procedura carica ed esegue l'esempio di contenitore di Servizi di Azure AI per il rilevamento della lingua. L'esempio include due contenitori, uno per l'applicazione client e uno per il contenitore di Servizi di Azure AI. Verrà eseguito il push di entrambe queste immagini nel Registro Azure Container. Una volta che si trovano nel proprio registro, creare un servizio Azure Kubernetes per accedere a queste immagini ed eseguire i contenitori. Quando i contenitori sono in esecuzione, usare l'interfaccia della riga di comando di kubectl per osservare le prestazioni dei contenitori. Accedere all'applicazione client con una richiesta HTTP e visualizzare i risultati.
I contenitori di esempio
L'esempio include due immagini del contenitore, una delle quali per il sito Web front-end. La seconda immagine è il contenitore di rilevamento della lingua che restituisce la lingua rilevata (impostazioni cultura) del testo. Al termine, entrambi i contenitori saranno accessibili da un indirizzo IP esterno.
Il contenitore della lingua front-end
Questo sito Web è equivalente alla propria applicazione lato client che effettua le richieste dell'endpoint di rilevamento lingua. Al termine della procedura, si ottiene la lingua rilevata di una stringa di caratteri accedendo al contenitore del sito Web in un browser con http://<external-IP>/<text-to-analyze>
. Un esempio di questo URL è http://132.12.23.255/helloworld!
. Il risultato nel browser è English
.
Il contenitore della lingua
Il contenitore di rilevamento della lingua, in questa procedura specifica, è accessibile a tutte le richieste esterne. Il contenitore non è stato modificato, in modo che sia disponibile l'API Rilevamento lingua standard di Servizi di Azure AI specifica del contenitore.
Per questo contenitore, tale API è una richiesta POST per il rilevamento della lingua. Come per tutti i contenitori di Servizi di Azure AI, altre informazioni sul contenitore sono disponibili nelle relative informazioni Swagger ospitate, http://<external-IP>:5000/swagger/index.html
.
La porta 5000 è la porta predefinita usata con i contenitori di Servizi di Azure AI.
Creare un'istanza del servizio Registro Azure Container
Per distribuire il contenitore nel servizio Azure Kubernetes, le immagini del contenitore devono essere accessibili. Creare il proprio servizio Registro Azure Container per ospitare le immagini.
Accedere all'interfaccia della riga di comando di Azure
az login
Creare un gruppo di risorse denominato
cogserv-container-rg
per contenere tutte le risorse create in questa procedura.az group create --name cogserv-container-rg --location westus
Creare quindi il Registro Azure Container con il formato del proprio nome e quindi
registry
, ad esempiopattyregistry
. Non usare trattini o caratteri di sottolineatura nel nome.az acr create --resource-group cogserv-container-rg --name pattyregistry --sku Basic
Salvare i risultati per ottenere la proprietà loginServer. Questa farà parte dell'indirizzo del contenitore ospitato, usato successivamente nel file
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" }
Accedere al registro contenitori. È necessario accedere prima di eseguire il push di immagini nel registro.
az acr login --name pattyregistry
Ottenere l'immagine Docker del sito Web
Il codice di esempio usato in questa procedura è nel repository di esempi di contenitori di Servizi di Azure AI. Clonare il repository per avere una copia locale dell'esempio.
git clone https://github.com/Azure-Samples/cognitive-services-containers-samples
Dopo aver aggiunto il repository nel computer locale, trovare il sito Web nella directory \dotnet\Language\FrontendService. Questo sito Web funge da applicazione client che chiama l'API di rilevamento lingua ospitata nel contenitore di rilevamento della lingua.
Compilare l'immagine Docker per questo sito Web. Verificare che la console sia nella directory \FrontendService in cui si trova il documento Dockerfile quando si esegue il comando seguente:
docker build -t language-frontend -t pattiyregistry.azurecr.io/language-frontend:v1 .
Per tenere traccia della versione del registro contenitori, aggiungere il tag con un formato di versione, ad esempio
v1
.Eseguire il push dell'immagine nel registro contenitori. Il processo può richiedere alcuni minuti.
docker push pattyregistry.azurecr.io/language-frontend:v1
Se si verifica un errore
unauthorized: authentication required
, accedere con il comandoaz acr login --name <your-container-registry-name>
.Al termine del processo, il risultato dovrebbe essere simile al seguente:
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
Ottenere l'immagine Docker di rilevamento lingua
Eseguire il pull dell'ultima versione dell'immagine Docker nel computer locale. Il processo può richiedere alcuni minuti. Se è disponibile una versione più recente di questo contenitore, modificare il valore da
1.1.006770001-amd64-preview
alla versione più recente.docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
Assegnare all'immagine il tag del registro contenitori. Trovare l'ultima versione e sostituire la versione
1.1.006770001-amd64-preview
se si ha una versione più recente.docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Eseguire il push dell'immagine nel registro contenitori. Il processo può richiedere alcuni minuti.
docker push pattyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Ottenere le credenziali del registro contenitori
I passaggi seguenti servono per ottenere le informazioni necessarie per la connessione del registro contenitori al servizio Azure Kubernetes creato più avanti in questa procedura.
Creare un'entità servizio.
az ad sp create-for-rbac
Salvare il valore
appId
dei risultati per il parametro assignee nel passaggio 3,<appId>
. Salvare ilpassword
per il parametro del segreto client della sezione successiva<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" }
Ottenere l'ID del registro contenitori.
az acr show --resource-group cogserv-container-rg --name pattyregistry --query "id" --output table
Salvare l'output per il valore del parametro di ambito,
<acrId>
, nel passaggio successivo. L'aspetto sarà simile al seguente:/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistry
Salvare il valore completo per il passaggio 3 di questa sezione.
Per concedere l'accesso corretto al cluster del servizio Azure Kubernetes per l'uso delle immagini archiviate nel registro contenitori, creare un'assegnazione di ruolo. Sostituire
<appId>
e<acrId>
con i valori raccolti nei due passaggi precedenti.az role assignment create --assignee <appId> --scope <acrId> --role Reader
Creare il servizio Azure Kubernetes
Creare il cluster del servizio Azure Kubernetes. Tutti i valori dei parametri provengono dalle sezioni precedenti, ad eccezione del parametro del nome. Scegliere un nome che indichi chi ha creato il servizio e lo scopo, ad esempio
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
Questo passaggio potrebbe richiedere alcuni minuti. Il risultato è:
{ "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" }
Il servizio viene creato, ma non ha ancora il contenitore del sito Web o il contenitore di rilevamento della lingua.
Ottenere le credenziali del cluster Kubernetes.
az aks get-credentials --resource-group cogserv-container-rg --name patty-kube
Caricare la definizione di orchestrazione nel servizio Kubernetes
Questa sezione usa l'interfaccia della riga di comando di kubectl per comunicare con il servizio Azure Kubernetes.
Prima di caricare la definizione di orchestrazione, controllare che kubectl abbia accesso ai nodi.
kubectl get nodes
La risposta ha un aspetto simile al seguente:
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
Copiare il file seguente e denominarlo
language.yml
. Il file ha una sezioneservice
e una sezionedeployment
per ognuno dei due tipi di contenitore, il contenitore del sito Weblanguage-frontend
e il contenitore di rilevamentolanguage
.# 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
Modificare le righe nella sezione relativa alla distribuzione del contenitore language-frontend in
language.yml
sulla base della tabella seguente per aggiungere il nome della propria immagine del registro contenitori, il segreto client e le impostazioni del servizio Lingua.Impostazioni di distribuzione del contenitore language-frontend Scopo Riga 32
Proprietàimage
Percorso dell'immagine di language-frontend nel registro contenitori <container-registry-name>.azurecr.io/language-frontend:v1
Riga 44
Proprietàname
Segreto del registro contenitori per l'immagine, definito <client-secret>
in una sezione precedente.Modificare le righe nella sezione relativa alla distribuzione del contenitore della lingua in
language.yml
sulla base della tabella seguente per aggiungere il nome della propria immagine del registro contenitori, il segreto client e le impostazioni del servizio Lingua.Impostazioni di distribuzione del contenitore language Scopo Riga 78
Proprietàimage
Percorso dell'immagine di language nel registro contenitori <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
Riga 95
Proprietàname
Segreto del registro contenitori per l'immagine, definito <client-secret>
in una sezione precedente.Riga 91
ProprietàapiKey
Chiave della risorsa del servizio Lingua Riga 92
Proprietàbilling
Endpoint di fatturazione per la risorsa del servizio Lingua. https://westus.api.cognitive.microsoft.com/text/analytics/v2.1
Poiché chiave API ed endpoint di fatturazione vengono impostati nell'ambito della definizione di orchestrazione Kubernetes, il contenitore del sito Web non ha bisogno di conoscere questi valori o passarli come parte della richiesta. Il contenitore del sito Web fa riferimento al contenitore di rilevamento della lingua in base al nome dell'agente di orchestrazione
language
.Caricare il file di definizione dell'orchestrazione per questo esempio dalla cartella in cui è stato creato e salvato il file
language.yml
.kubectl apply -f language.yml
La risposta è:
service "language-frontend" created deployment.apps "language-frontend" created service "language" created deployment.apps "language" created
Ottenere gli indirizzi IP esterni dei contenitori
Per i due contenitori, verificare che i servizi language-frontend
e language
siano in esecuzione e ottenere l'indirizzo IP esterno.
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
Se il valore EXTERNAL-IP
per il servizio viene visualizzato come in sospeso, eseguire nuovamente il comando finché l'indirizzo IP non viene visualizzato prima di procedere al passaggio successivo.
Testare il contenitore di rilevamento della lingua
Aprire un browser e passare all'indirizzo IP esterno del contenitore language
nella sezione precedente: http://<external-ip>:5000/swagger/index.html
. È possibile usare la funzionalità Try it
dell'API e testare l'endpoint di rilevamento della lingua.
Testare il contenitore dell'applicazione client
Modificare l'URL nel browser impostando l'indirizzo IP esterno del contenitore language-frontend
nel formato seguente: http://<external-ip>/helloworld
. Il testo helloworld
nelle impostazioni cultura inglese viene stimato come English
.
Pulire le risorse
Quando il cluster non è più necessario, eliminare il gruppo di risorse di Azure.
az group delete --name cogserv-container-rg