Distribuera en container för språkidentifiering till Azure Kubernetes Service
Lär dig hur du distribuerar containern för språkidentifiering. 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 skapar du ett kostnadsfritt konto innan du börjar.
- Git för operativsystemet 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 containerexemplet för Azure AI-tjänster för språkidentifiering. Exemplet har två containrar, en för klientprogrammet och en för Azure AI-tjänstcontainern. Vi skickar båda dessa avbildningar till Azure Container Registry. När de är i ditt eget register skapar du en Azure Kubernetes Service för att få åtkomst till dessa avbildningar och köra containrarna. När containrarna körs använder du kubectl CLI för att titta på 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 containern för språkidentifiering 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 slutpunkten för språkidentifiering. När proceduren är klar får du det identifierade språket för en teckensträng genom att komma åt webbplatscontainern i en webbläsare med http://<external-IP>/<text-to-analyze>
. Ett exempel på den här URL:en är http://132.12.23.255/helloworld!
. Resultatet i webbläsaren är English
.
Språkcontainern
Containern för språkidentifiering ä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 azure AI-tjänster för containerspecifik språkidentifiering ä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-containrar.
Skapa Azure Container Registry-tjänsten
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 ditt eget 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 är 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 docker-avbildning för webbplatsen
Exempelkoden som används i den här proceduren finns i azure AI-containerprovlagringsplatsen. Klona lagringsplatsen för att ha en lokal kopia av exemplet.
git clone https://github.com/Azure-Samples/cognitive-services-containers-samples
När lagringsplatsen finns på den lokala datorn hittar du webbplatsen i katalogen \dotnet\Language\FrontendService . Den här webbplatsen fungerar som klientprogrammet som anropar språkidentifierings-API:et som finns i containern för språkidentifiering.
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
.Skicka 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
fel loggar du in medaz acr login --name <your-container-registry-name>
kommandot .När processen är klar bör resultatet likna:
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 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 avbildning 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
Skicka 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 nödvändig information för att ansluta containerregistret till Azure Kubernetes Service som 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 omfång,
<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.
Skapa en rolltilldelning för att ge AKS-klustret rätt åtkomst för att använda avbildningar som lagras i containerregistret. Ersätt
<appId>
och<acrId>
med de värden som samlats in i de föregående två stegen.az role assignment create --assignee <appId> --scope <acrId> --role Reader
Skapa Azure Kubernetes Service
Skapa Kubernetes-klustret. Alla parametervärden kommer från tidigare 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 har skapats 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
Det här avsnittet använder 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 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 var 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åkfrontend Syfte Rad 32
image
egenskapAvbildningsplats för klientdelsavbildningen i containerregistret <container-registry-name>.azurecr.io/language-frontend:v1
Rad 44
name
egenskapContainer Registry-hemlighet för avbildningen. Kallas för <client-secret>
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
egenskapAvbildningsplats för språkavbildningen i containerregistret <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
Rad 95
name
egenskapContainer Registry-hemlighet för avbildningen. Kallas för <client-secret>
i ett tidigare avsnitt.Rad 91
apiKey
egenskapDin språktjänstresursnyckel Rad 92
billing
egenskapFaktureringsslutpunkten 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 orkestreringsnamn
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 körs language
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 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 containern för språkidentifiering
Ö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