Bereitstellen eines Spracherkennungscontainers in Azure Kubernetes Service
Hier erfahren Sie, wie Sie den Sprachenerkennungscontainer bereitstellen. In dem Verfahren wird gezeigt, wie Sie die lokalen Docker-Container erstellen, Container per Push in Ihre eigene private Containerregistrierung übertragen, den Container in einem Kubernetes-Cluster ausführen und ihn in einem Webbrowser testen.
Voraussetzungen
Für dieses Verfahren müssen mehrere Tools lokal installiert und ausgeführt werden. Verwenden Sie nicht Azure Cloud Shell.
- Verwenden Sie ein Azure-Abonnement. Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
- Git für Ihr Betriebssystem, um das in diesem Verfahren verwendete Beispiel klonen zu können.
- Azure-Befehlszeilenschnittstelle.
- Docker-Engine. (Vergewissern Sie sich, dass die Docker-Befehlszeilenschnittstelle in einem Konsolenfenster funktioniert.)
- kubectl.
- Eine Azure-Ressource mit dem korrekten Tarif. Nicht alle Tarife können mit diesem Container verwendet werden:
- Language-Ressource nur mit F0- oder Standard-Tarif
- Azure KI Services-Ressource mit dem S0-Tarif.
Ausführen des Beispiels
Bei dieser Prozedur wird das Azure KI Services-Containerbeispiel für die Spracherkennung geladen und ausgeführt. Das Beispiel enthält zwei Container: einen für die Clientanwendung und einen für den Azure KI Services-Container. Wir übertragen beide Images per Push in die Azure Container Registry. Nachdem sie sich in Ihrer eigenen Registrierung befinden, erstellen Sie eine Azure Kubernetes Service-Instanz, um auf diese Images zuzugreifen und die Container auszuführen. Wenn die Container ausgeführt werden, verwenden Sie die Befehlszeilenschnittstelle kubectl, um die Leistung der Container zu überwachen. Greifen Sie über eine HTTP-Anforderung auf die Clientanwendung zu, und sehen Sie sich die Ergebnisse an.
Die Beispielcontainer
Das Beispiel enthält zwei Containerimages, eines davon für die Front-End-Website. Bei dem zweiten Image handelt es sich um den Sprachenerkennungscontainer, der die erkannte Sprache (Kultur) eines Texts zurückgibt. Am Ende des Verfahrens kann auf beide Container über eine externe IP-Adresse zugegriffen werden.
Der Container „language-frontend“
Diese Website entspricht Ihrer eigenen clientseitigen Anwendung, die Anforderungen an den Endpunkt für die Sprachenerkennung richtet. Nach Abschluss des Verfahrens erhalten Sie die erkannte Sprache einer Zeichenfolge, indem Sie in einem Browser mit http://<external-IP>/<text-to-analyze>
auf den Websitecontainer zugreifen. Diese URL kann beispielsweise wie folgt aussehen: http://132.12.23.255/helloworld!
. Im Browser wird das Ergebnis English
zurückgegeben.
Der Container „language“
In diesem speziellen Verfahren ist der Sprachenerkennungscontainer für beliebige externe Anforderungen verfügbar. Da der Container in keiner Weise verändert wurde, steht die für den Azure KI Services-Container spezifische Spracherkennungsstandard-API zur Verfügung.
Für diesen Container handelt es sich bei der API um eine POST-Anforderung für die Sprachenerkennung. Wie bei allen Azure KI-Containern können Sie in den gehosteten Swagger-Informationen – http://<external-IP>:5000/swagger/index.html
– mehr über den Container erfahren.
Port 5000 ist der Standardport für Azure KI-Container.
Erstellen des Azure Container Registry-Diensts
Damit der Container in Azure Kubernetes Service bereitgestellt werden kann, muss der Zugriff auf die Containerimages möglich sein. Erstellen Sie Ihren eigenen Azure Container Registry-Dienst, um die Images zu hosten.
Melden Sie sich bei der Azure-Befehlszeilenschnittstelle an.
az login
Erstellen Sie eine Ressourcengruppe namens
cogserv-container-rg
für alle Ressourcen, die im Rahmen dieses Verfahrens erstellt werden.az group create --name cogserv-container-rg --location westus
Erstellen Sie Ihre eigene Azure Container Registry-Instanz mit einer Kombination aus Ihrem Namen und
registry
(Beispiel:pattyregistry
). Fügen Sie keine Binde- oder Unterstriche in den Namen ein.az acr create --resource-group cogserv-container-rg --name pattyregistry --sku Basic
Speichern Sie die Ergebnisse, um die Eigenschaft loginServer zu erhalten. Sie wird später in der Datei
language.yml
als Teil der Adresse des gehosteten Containers verwendet.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" }
Melden Sie sich bei Ihrer Containerregistrierung an. Sie müssen angemeldet sein, um Images per Push in die Registrierung übertragen zu können.
az acr login --name pattyregistry
Abrufen des Docker-Images für die Website
Der in dieser Prozedur verwendete Beispielcode befindet sich im Repository mit den Azure KI-Containerbeispielen. Klonen Sie das Repository, um eine lokale Kopie des Beispiels zu erhalten.
git clone https://github.com/Azure-Samples/cognitive-services-containers-samples
Wenn sich das Repository auf Ihrem lokalen Computer befindet, suchen Sie im Verzeichnis \dotnet\Language\FrontendService nach der Website. Diese Website fungiert als die Clientanwendung, die die im Sprachenerkennungscontainer gehostete Sprachenerkennungs-API aufruft.
Erstellen Sie das Docker-Image für diese Website. Achten Sie beim Ausführen des folgenden Befehls darauf, dass sich die Konsole im Verzeichnis \FrontendService mit dem Dockerfile befindet:
docker build -t language-frontend -t pattiyregistry.azurecr.io/language-frontend:v1 .
Wenn Sie die Version für Ihre Containerregistrierung nachverfolgen möchten, fügen Sie das Tag mit einem Versionsformat hinzu (beispielsweise
v1
).Übertragen des Images mithilfe von Push an Ihre Containerregistrierung. Dies kann einige Minuten dauern.
docker push pattyregistry.azurecr.io/language-frontend:v1
Sollte ein Fehler vom Typ
unauthorized: authentication required
auftreten, melden Sie sich mit dem Befehlaz acr login --name <your-container-registry-name>
an.Nach Abschluss des Prozesses sollten die Ergebnisse in etwa wie folgt aussehen:
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
Abrufen des Docker-Images für die Sprachenerkennung
Pullen Sie die neueste Version des Docker-Images auf den lokalen Computer. Dies kann einige Minuten dauern. Sollte eine neuere Version dieses Containers vorhanden sein, ändern Sie den Wert von
1.1.006770001-amd64-preview
in die neuere Version.docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
Markieren Sie das Image mit Ihrer Containerregistrierung. Suchen Sie die neueste Version, und ersetzen Sie die Version
1.1.006770001-amd64-preview
, falls Sie über eine neuere Version verfügen.docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Übertragen des Images mithilfe von Push an Ihre Containerregistrierung. Dies kann einige Minuten dauern.
docker push pattyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Abrufen von Anmeldeinformationen für die Containerregistrierung
Die folgenden Schritte sind erforderlich, um die erforderlichen Informationen für die Verbindungsherstellung zwischen Ihrer Containerregistrierung und der Azure Kubernetes Service-Instanz abzurufen, die Sie später in diesem Verfahren erstellen.
Erstellen Sie den Dienstprinzipal.
az ad sp create-for-rbac
Speichern Sie den
appId
-Ergebniswert für den assignee-Parameter in Schritt 3 (<appId>
). Speichern Sie das Kennwort (password
) für den client-secret-Parameter im nächsten Abschnitt (<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" }
Rufen Sie Ihre Containerregistrierungs-ID ab.
az acr show --resource-group cogserv-container-rg --name pattyregistry --query "id" --output table
Speichern Sie die Ausgabe für den scope-Parameterwert (
<acrId>
) im nächsten Schritt. Er sieht wie folgt aus:/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistry
Speichern Sie den vollständigen Wert für Schritt 3 in diesem Abschnitt.
Erstellen Sie eine Rollenzuweisung, um den korrekten Zugriff für den AKS-Cluster zu gewähren und die Verwendung von in der Containerregistrierung gespeicherten Images zu ermöglichen. Ersetzen Sie
<appId>
und<acrId>
durch die Werte aus den beiden vorherigen Schritten.az role assignment create --assignee <appId> --scope <acrId> --role Reader
Erstellen von Azure Kubernetes Service
Erstellen Sie den Kubernetes-Cluster. Mit Ausnahme des Namensparameters stammen alle Parameterwerte aus den vorherigen Abschnitten. Wählen Sie einen Namen, der Aufschluss über Ersteller und Zweck gibt (beispielsweise
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
Dieser Schritt kann einige Minuten dauern. Es wird folgendes Ergebnis ausgegeben:
{ "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" }
Der Dienst wird erstellt, verfügt aber noch nicht über den Websitecontainer oder den Sprachenerkennungscontainer.
Rufen Sie die Anmeldeinformationen des Kubernetes-Clusters ab.
az aks get-credentials --resource-group cogserv-container-rg --name patty-kube
Laden der Orchestrierungsdefinition in Ihren Kubernetes-Dienst
In diesem Abschnitt wird die Befehlszeilenschnittstelle kubectl verwendet, um mit der Azure Kubernetes Service-Instanz zu kommunizieren.
Vergewissern Sie sich vor dem Laden der Orchestrierungsdefinition, dass kubectl Zugriff auf die Knoten hat.
kubectl get nodes
Die Antwort sieht wie folgt aus:
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
Kopieren Sie die folgende Datei, und nennen Sie sie
language.yml
. Die Datei enthält die Abschnitteservice
unddeployment
für die beiden Containertypen (Websitecontainerlanguage-frontend
und Erkennungscontainerlanguage
).# 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
Ändern Sie die Bereitstellungszeilen für „language-frontend“ in der Datei
language.yml
auf der Grundlage der folgenden Tabelle, um die Imagenamen, das Clientgeheimnis und die Sprachdiensteinstellungen Ihrer eigenen Containerregistrierung hinzufügen.Bereitstellungseinstellungen für „language-frontend“ Zweck Zeile 32
image
-EigenschaftSpeicherort des Front-End-Images in Ihrer Containerregistrierung <container-registry-name>.azurecr.io/language-frontend:v1
Zeile 44
name
-EigenschaftGeheimnis der Containerregistrierung für das Image (weiter oben als <client-secret>
bezeichnet).Ändern Sie die Bereitstellungszeilen für „language“ in der Datei
language.yml
auf der Grundlage der folgenden Tabelle, um die Imagenamen, das Clientgeheimnis und die Sprachdiensteinstellungen Ihrer eigenen Containerregistrierung hinzufügen.Bereitstellungseinstellungen für „language“ Zweck Zeile 78
image
-EigenschaftSpeicherort des Sprachimages in Ihrer Containerregistrierung <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
Zeile 95
name
-EigenschaftGeheimnis der Containerregistrierung für das Image (weiter oben als <client-secret>
bezeichnet).Zeile 91
apiKey
-EigenschaftIhr Ressourcenschlüssel für den Sprachdienst Zeile 92
billing
-EigenschaftDer Abrechnungsendpunkt für Ihre Sprachdienstressource. https://westus.api.cognitive.microsoft.com/text/analytics/v2.1
Da apiKey und Abrechnungsendpunkt im Rahmen der Kubernetes-Orchestrierungsdefinition festgelegt werden, müssen sie dem Websitecontainer nicht bekannt sein und nicht zusammen mit der Anforderung übergeben werden. Der Websitecontainer verweist auf den Sprachenerkennungscontainer anhand des Orchestratornamens
language
.Laden Sie die Orchestrierungsdefinitionsdatei für dieses Beispiel aus dem Ordner, in dem Sie die Datei
language.yml
erstellt und gespeichert haben.kubectl apply -f language.yml
Die Antwort lautet:
service "language-frontend" created deployment.apps "language-frontend" created service "language" created deployment.apps "language" created
Abrufen der externen IP-Adressen von Containern
Vergewissern Sie sich für die beiden Container, dass die Dienste language-frontend
und language
ausgeführt werden, und rufen Sie die externe IP-Adresse ab.
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
Falls EXTERNAL-IP
für den Dienst als ausstehend angezeigt wird, führen Sie den Befehl erneut aus, bis die IP-Adresse angezeigt wird, und fahren Sie erst dann mit dem nächsten Schritt fort.
Testen des Sprachenerkennungscontainers
Navigieren Sie in einem Browser zu der externen IP-Adresse des Containers language
aus dem vorherigen Abschnitt: http://<external-ip>:5000/swagger/index.html
. Sie können das Feature Try it
der API verwenden, um den Endpunkt für die Sprachenerkennung zu testen.
Testen des Clientanwendungscontainers
Ändern Sie die URL im Browser in die externe IP-Adresse des Containers language-frontend
. Verwenden Sie dabei das folgende Format: http://<external-ip>/helloworld
. Der Text helloworld
aus der englischen Kultur wird als English
vorhergesagt.
Bereinigen von Ressourcen
Wenn Sie den Cluster nicht mehr benötigen, löschen Sie die Azure-Ressourcengruppe.
az group delete --name cogserv-container-rg
Verwandte Informationen
- kubectl for Docker Users (kubectl für Docker-Benutzer)