Distribuera en språkidentifieringscontainer till Azure Kubernetes Service
Lär dig hur du distribuerar språkidentifieringscontainern. Den här proceduren visar hur du skapar de lokala Docker-containrarna, push-överför 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å. Alla prisnivåer fungerar inte med den här containern:
- Språkresurs med endast prisnivåer för F0 eller Standard.
- Azure AI-tjänstresurs med prisnivån S0.
Köra exemplet
Den här proceduren läser in och kör Azure AI Services-containerexemplet för språkidentifiering. Exemplet har två containrar, en för klientprogrammet och en för Azure AI-tjänstcontainern. Vi push-överför båda dessa avbildningar 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 watch containrarnas prestanda. Få åtkomst till klientprogrammet med en HTTP-begäran och se resultatet.
Exempelcontainrarna
Exemplet har två containeravbildningar, en för klientdelswebbplatsen. Den andra avbildningen ä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åkklientdelscontainern
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 är i den här specifika proceduren tillgänglig för alla externa begäranden. Containern har inte ändrats på något sätt, så standard-API:et för containerspecifik språkidentifiering i Azure AI-tjänster är tillgängligt.
För den här containern är det API:et en POST-begäran för språkidentifiering. Precis som med alla Azure AI-containrar kan du lära dig mer om containern från dess värdbaserade Swagger-information, http://<external-IP>:5000/swagger/index.html
.
Port 5000 är standardporten som används med Azure AI-containrarna.
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-tjänst som värd för avbildningarna.
Logga in på Azure CLI
az login
Skapa en resursgrupp med namnet
cogserv-container-rg
för att lagra alla resurser som skapas i den här proceduren.az group create --name cogserv-container-rg --location westus
Skapa en egen 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 Basic
Spara resultatet för att hämta egenskapen loginServer . Detta kommer att vara en del av den värdbaserade containerns adress, som används senare i
language.yml
filen.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 skicka avbildningar till registret.
az acr login --name pattyregistry
Hämta webbplatsens Docker-avbildning
Exempelkoden som används i den här proceduren finns på lagringsplatsen för Azure AI-containrarexempel. Klona lagringsplatsen för att få en lokal kopia av exemplet.
git clone https://github.com/Azure-Samples/cognitive-services-containers-samples
När lagringsplatsen finns på den lokala datorn letar du upp webbplatsen i katalogen \dotnet\Language\FrontendService . Den här webbplatsen fungerar som klientprogrammet 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-överför avbildningen till containerregistret. Det kan ta några minuter.
docker push pattyregistry.azurecr.io/language-frontend:v1
Om du får ett
unauthorized: authentication required
felmeddelande loggar du in medaz acr login --name <your-container-registry-name>
kommandot .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 dockeravbildning 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 från
1.1.006770001-amd64-preview
till den nyare versionen.docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
Tagga avbildningen med containerregistret. Hitta den senaste versionen och ersätt versionen
1.1.006770001-amd64-preview
om du har en nyare version.docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Push-överför avbildningen till containerregistret. Det kan ta några minuter.
docker push pattyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Hämta autentiseringsuppgifter för Container Registry
Följande steg krävs för att hämta den information som krävs för att ansluta containerregistret till Azure Kubernetes Service du skapar senare i den här proceduren.
Skapa tjänstens huvudnamn.
az ad sp create-for-rbac
Spara resultatvärdet
appId
för parametern assignee i steg 3,<appId>
.password
Spara fö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" --output table
Spara utdata för parametervärdet scope,
<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/pattyregistry
Spara det fullständiga värdet för steg 3 i det här avsnittet.
Om du vill bevilja rätt åtkomst för AKS-klustret att använda avbildningar som lagras i containerregistret skapar du en rolltilldelning. Ersätt
<appId>
och<acrId>
med de värden som samlats in i föregående två steg.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 det 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-keys
Det 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 den 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äs in orkestreringsdefinitionen i Kubernetes-tjänsten
I det här avsnittet används kubectl CLI för att kommunicera med Azure Kubernetes Service.
Innan du läser in orkestreringsdefinitionen kontrollerar du att kubectl har åtkomst till noderna.
kubectl get nodes
Svaret 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.11
Kopiera följande fil och ge den
language.yml
namnet . Filen har ettservice
avsnitt och ettdeployment
avsnitt för de två containertypernalanguage-frontend
, webbplatscontainern och identifieringscontainernlanguage
.# 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
language.yml
för språkklientdelen baserat på följande tabell för att lägga till egna containerregisteravbildningsnamn, klienthemligheter och språktjänstinställningar.Distributionsinställningar för språkklientdelen Syfte Rad 32
image
EgenskapenAvbildningsplats för klientdelsavbildningen i containerregistret <container-registry-name>.azurecr.io/language-frontend:v1
Rad 44
name
EgenskapenContainer Registry-hemlighet för avbildningen, som <client-secret>
kallas i ett tidigare avsnitt.Ändra språkdistributionsraderna
language.yml
i baserat på följande tabell för att lägga till egna containerregisteravbildningsnamn, klienthemligheter och språktjänstinställningar.Inställningar för språkdistribution Syfte Rad 78
image
EgenskapenAvbildningsplats för språkavbildningen i containerregistret <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
Rad 95
name
EgenskapenContainer Registry-hemlighet för avbildningen, som <client-secret>
kallas i ett tidigare avsnitt.Rad 91
apiKey
EgenskapenDin språktjänstresursnyckel Rad 92
billing
EgenskapenFaktureringsslutpunkten för språktjänstresursen. https://westus.api.cognitive.microsoft.com/text/analytics/v2.1
Eftersom apiKey och faktureringsslutpunkten anges som en del av Kubernetes-orkestreringsdefinitionen behöver webbplatscontainern inte känna till dessa eller skicka dem som en del av begäran. Webbplatscontainern refererar till språkidentifieringscontainern med dess orchestratornamn
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.yml
Svaret ä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 language
körs och hämtar den externa 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
EXTERNAL-IP
Om för tjänsten visas som väntande kör du kommandot igen tills IP-adressen visas innan du går vidare till nästa steg.
Testa språkidentifieringscontainern
Öppna en webbläsare och navigera till containerns language
externa IP-adress från föregående avsnitt: http://<external-ip>:5000/swagger/index.html
. Du kan använda Try it
funktionen i API:et för att testa slutpunkten för språkidentifiering.
Testa klientprogramcontainern
Ändra URL:en i webbläsaren till containerns language-frontend
externa IP-adress 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
Relaterad information
Nästa steg
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för