Distribuera en språkidentifieringscontainer till Azure Kubernetes Service
Lär dig hur du distribuerar språkidentifieringscontainern. Den här proceduren visar hur du skapar lokala Docker-containrar, push-erar containrarna till ditt eget privata containerregister, kör containern i ett Kubernetes-kluster och testar den i en webbläsare.
Förutsättningar
Den här proceduren kräver flera verktyg som måste installeras och köras lokalt. Använd inte Azure Cloud Shell.
- Använd en Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.
- Git för ditt operativsystem så att du kan klona exemplet som används i den här proceduren.
- Azure CLI.
- Docker-motorn och verifiera att Docker CLI fungerar i ett konsolfönster.
- kubectl.
- En Azure-resurs med rätt prisnivå. Det är inte alla prisnivåer som fungerar med den här containern:
- Språkresurs med prisnivåerna F0 eller Standard.
- Cognitive Services resurs med prisnivån S0.
Köra exemplet
Den här proceduren läser in och kör Cognitive Services containerexempel för språkidentifiering. Exemplet har två containrar, en för klientprogrammet och en för Cognitive Services containern. Vi skickar båda avbildningarna till Azure Container Registry. När de finns i ditt eget register skapar du en Azure Kubernetes Service för att komma åt avbildningarna och köra containrarna. När containrarna körs använder du kubectl CLI för att se containrarnas prestanda. Öppna klientprogrammet med en HTTP-begäran och se resultatet.

Exempelcontainrarna
Exemplet har två containeravbildningar, en för webbplatsen för frontend. Den andra bilden är språkidentifieringscontainern som returnerar det identifierade språket (kulturen) för text. Båda containrarna är tillgängliga från en extern IP-adress när du är klar.
Språkcontainern för frontend
Den här webbplatsen motsvarar ditt eget program på klientsidan som gör begäranden om språkidentifieringsslutpunkten. När proceduren är klar får du det identifierade språket för en teckensträng genom att öppna webbplatscontainern i en webbläsare med http://<external-IP>/<text-to-analyze> . Ett exempel på denna URL är http://132.12.23.255/helloworld!. Resultatet i webbläsaren är English .
Språkcontainern
Språkidentifieringscontainern, i den här specifika proceduren, är tillgänglig för alla externa förfrågningar. Containern har inte ändrats på något sätt, så standard-API:et för Cognitive Services för containerspecifik språkidentifiering är tillgängligt.
För den här containern är det API:et en POST-begäran om språkidentifiering. Precis som med alla Cognitive Services-containrar kan du lära dig mer om containern från dess värdindelade Swagger-information, http://<external-IP>:5000/swagger/index.html .
Port 5000 är standardporten som används med Cognitive Services containrar.
Skapa Azure Container Registry tjänst
Om du vill distribuera containern till Azure Kubernetes Service måste containeravbildningarna vara tillgängliga. Skapa en egen Azure Container Registry som värd för avbildningarna.
Logga in på Azure CLI
az loginSkapa en resursgrupp med namnet för
cogserv-container-rgvarje resurs som skapas i den här proceduren.az group create --name cogserv-container-rg --location westusSkapa egna Azure Container Registry med formatet för ditt namn och sedan
registry, till exempelpattyregistry. Använd inte bindestreck eller understrykningstecken i namnet.az acr create --resource-group cogserv-container-rg --name pattyregistry --sku BasicSpara resultatet för att hämta egenskapen loginServer. Detta är en del av den värddatorcontainerns adress, som används senare i
language.ymlfilen.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" }Logga in på containerregistret. Du måste logga in innan du kan push-skicka avbildningar till registret.
az acr login --name pattyregistry
Hämta dockeravbildning för webbplats
Exempelkoden som används i den här proceduren finns på lagringsplatsen Cognitive Services containerexempel. Klona lagringsplatsen för att få en lokal kopia av exemplet.
git clone https://github.com/Azure-Samples/cognitive-services-containers-samplesNär lagringsplatsen finns på den lokala datorn hittar du webbplatsen i katalogen \dotnet\Language\FrontendService. Den här webbplatsen fungerar som klientprogram som anropar språkidentifierings-API:et som finns i språkidentifieringscontainern.
Skapa Docker-avbildningen för den här webbplatsen. Kontrollera att konsolen finns i katalogen \FrontendService där Dockerfile finns när du kör följande kommando:
docker build -t language-frontend -t pattiyregistry.azurecr.io/language-frontend:v1 .Om du vill spåra versionen i containerregistret lägger du till taggen med ett versionsformat, till exempel
v1.Push-skicka avbildningen till containerregistret. Det kan ta några minuter.
docker push pattyregistry.azurecr.io/language-frontend:v1Om du får ett
unauthorized: authentication requiredfelmeddelande loggar du in med kommandotaz acr login --name <your-container-registry-name>.När processen är klar bör resultatet se ut ungefär så här:
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
Hämta Docker-avbildning för språkidentifiering
Hämta den senaste versionen av Docker-avbildningen till den lokala datorn. Det kan ta några minuter. Om det finns en nyare version av den här containern ändrar du värdet
1.1.006770001-amd64-previewfrån till den nyare versionen.docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-previewTagga avbildningen med ditt containerregister. Hitta den senaste versionen och ersätt versionen
1.1.006770001-amd64-previewom du har en nyare version.docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-previewPush-skicka avbildningen till containerregistret. Det kan ta några minuter.
docker push pattyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Hämta Container Registry autentiseringsuppgifter
Följande steg krävs för att hämta nödvändig information för att ansluta ditt containerregister till den Azure Kubernetes Service du skapar senare i den här proceduren.
Skapa tjänstens huvudnamn.
az ad sp create-for-rbacSpara resultatvärdet
appIdför parametern assignee i steg 3,<appId>. Sparapasswordför nästa avsnitts klienthemlighetsparameter<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" }Hämta ditt containerregister-ID.
az acr show --resource-group cogserv-container-rg --name pattyregistry --query "id" --o tableSpara utdata för omfångsparametervärdet,
<acrId>, i nästa steg. Det ser ut så här:/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistrySpara det fullständiga värdet för steg 3 i det här avsnittet.
Om du vill ge rätt åtkomst för AKS-klustret att använda avbildningar som lagras i containerregistret skapar du en rolltilldelning. Ersätt
<appId>och med de värden som samlats in i de föregående två<acrId>stegen.az role assignment create --assignee <appId> --scope <acrId> --role Reader
Skapa Azure Kubernetes Service
Skapa Kubernetes-klustret. Alla parametervärden kommer från föregående avsnitt förutom namnparametern. Välj ett namn som anger vem som skapade den och dess syfte, till exempel
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-keysDet här steget kan ta några minuter. Resultatet är:
{ "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" }Tjänsten skapas men har inte webbplatscontainern eller språkidentifieringscontainern ännu.
Hämta autentiseringsuppgifter för Kubernetes-klustret.
az aks get-credentials --resource-group cogserv-container-rg --name patty-kube
Läsa in orkestreringsdefinitionen i Kubernetes-tjänsten
I det här avsnittet används kubectl CLI för att prata med Azure Kubernetes Service.
Innan du läser in orkestreringsdefinitionen kontrollerar du att kubectl har åtkomst till noderna.
kubectl get nodesSvaret ser ut så här:
NAME STATUS ROLES AGE VERSION aks-nodepool1-13756812-0 Ready agent 6m v1.9.11 aks-nodepool1-13756812-1 Ready agent 6m v1.9.11Kopiera följande fil och ge den namnet
language.yml. Filen har ett avsnittserviceoch ett avsnitt vardera för de tvådeploymentcontainertyperna,language-frontendwebbplatscontainern ochlanguageidentifieringscontainern.# 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Ändra distributionsraderna för språk-klientsidan baserat på följande tabell för att lägga till dina egna
language.ymlcontainerregisteravbildningsnamn, klienthemlighet och språktjänstinställningar.Inställningar för distribution av språk på frontend-sidan Syfte Rad 32
imageEgenskapenBildplats för frontend-avbildningen i Container Registry <container-registry-name>.azurecr.io/language-frontend:v1Rad 44
nameEgenskapenContainer Registry hemlighet för avbildningen, vilket kallas <client-secret>i ett tidigare avsnitt.Ändra språkdistributionsraderna i baserat på följande tabell för att lägga till egna namn på
language.ymlcontainerregisteravbildningar, klienthemligheter och språktjänstinställningar.Inställningar för språkdistribution Syfte Rad 78
imageEgenskapenBildplats för språkbilden i Container Registry <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-previewRad 95
nameEgenskapenContainer Registry hemlighet för avbildningen, vilket kallas <client-secret>i ett tidigare avsnitt.Rad 91
apiKeyEgenskapenDin resursnyckel för språktjänsten Rad 92
billingEgenskapenFaktureringsslutpunkten för din Language Service-resurs. https://westus.api.cognitive.microsoft.com/text/analytics/v2.1Eftersom apiKey och faktureringsslutpunkten anges som en del av Kubernetes-orkestreringsdefinitionen behöver inte webbplatscontainern känna till dessa eller skicka dem som en del av begäran. Webbplatscontainern refererar till språkidentifieringscontainern med orkestreringsnamnet
language.Läs in orkestreringsdefinitionsfilen för det här exemplet från mappen där du skapade och sparade
language.yml.kubectl apply -f language.ymlSvaret är:
service "language-frontend" created deployment.apps "language-frontend" created service "language" created deployment.apps "language" created
Hämta externa IP-adresser för containrar
För de två containrarna kontrollerar du att language-frontend tjänsterna och körs och hämtar den externa language IP-adressen.
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
Om för tjänsten visas som väntande kör du kommandot igen tills EXTERNAL-IP IP-adressen visas innan du går vidare till nästa steg.
Testa språkidentifieringscontainern
Öppna en webbläsare och navigera till den externa IP-adressen language för containern från föregående avsnitt: http://<external-ip>:5000/swagger/index.html . Du kan använda funktionen Try it i API:et för att testa språkidentifieringsslutpunkten.

Testa klientprogramcontainern
Ändra URL:en i webbläsaren till den externa IP-adressen för language-frontend containern med följande format: http://<external-ip>/helloworld . Den engelska kulturtexten helloworld i förutsägs som English .
Rensa resurser
När du är klar med klustret tar du bort Azure-resursgruppen.
az group delete --name cogserv-container-rg