Nasazení kontejneru pro rozpoznávání jazyka do služby Azure Kubernetes Service
Zjistěte, jak nasadit kontejner rozpoznávání jazyka. Tento postup ukazuje, jak vytvořit místní kontejnery Dockeru, odeslat kontejnery do vlastního privátního registru kontejneru, spustit kontejner v clusteru Kubernetes a otestovat ho ve webovém prohlížeči.
Požadavky
Tento postup vyžaduje několik nástrojů, které je potřeba nainstalovat a spustit místně. Nepoužívejte Azure Cloud Shell.
- Použijte předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet.
- Git pro váš operační systém, abyste mohli naklonovat ukázku použitou v tomto postupu.
- Rozhraní příkazového řádku Azure.
- Modul Dockeru a ověřte, že rozhraní příkazového řádku Dockeru funguje v okně konzoly.
- kubectl.
- Prostředek Azure se správnou cenovou úrovní S tímto kontejnerem nefungují všechny cenové úrovně:
- Prostředek jazyka pouze s cenovými úrovněmi F0 nebo Standard
- Prostředek služeb Azure AI s cenovou úrovní S0
Spuštění ukázky
Tento postup načte a spustí ukázku kontejneru služeb Azure AI pro rozpoznávání jazyka. Ukázka obsahuje dva kontejnery, jeden pro klientskou aplikaci a jeden pro kontejner služeb Azure AI. Obě tyto image nasdílíme do služby Azure Container Registry. Jakmile jsou ve vašem vlastním registru, vytvořte službu Azure Kubernetes Service pro přístup k těmto imagím a spusťte kontejnery. Když jsou kontejnery spuštěné, pomocí rozhraní příkazového řádku kubectl sledujte výkon kontejnerů. Přejděte k klientské aplikaci pomocí požadavku HTTP a prohlédněte si výsledky.
Ukázkové kontejnery
Ukázka obsahuje dvě image kontejneru, jednu pro front-endový web. Druhým obrázkem je kontejner rozpoznávání jazyka, který vrací rozpoznaný jazyk (jazykovou verzi) textu. Po dokončení jsou oba kontejnery přístupné z externí IP adresy.
Kontejner front-endu jazyka
Tento web je ekvivalentní vaší vlastní aplikaci na straně klienta, která provádí požadavky koncového bodu rozpoznávání jazyka. Po dokončení postupu získáte zjištěný jazyk řetězce znaků tak, že v prohlížeči přejdete do kontejneru webu v prohlížeči.http://<external-IP>/<text-to-analyze>
Příkladem této adresy URL je http://132.12.23.255/helloworld!
. Výsledek v prohlížeči je English
.
Kontejner jazyka
Kontejner rozpoznávání jazyka v tomto konkrétním postupu je přístupný pro všechny externí požadavky. Kontejner se žádným způsobem nezměnil, takže je k dispozici standardní rozhraní API pro rozpoznávání jazyka specifické pro službu Azure AI.
Pro tento kontejner je toto rozhraní API požadavkem POST pro rozpoznávání jazyka. Stejně jako u všech kontejnerů Azure AI se o kontejneru můžete dozvědět více z informací o hostované službě Swagger. http://<external-IP>:5000/swagger/index.html
Port 5000 je výchozí port používaný s kontejnery Azure AI.
Vytvoření služby Azure Container Registry
Pokud chcete kontejner nasadit do služby Azure Kubernetes Service, musí být image kontejnerů přístupné. Vytvořte vlastní službu Azure Container Registry pro hostování imagí.
Přihlášení k Azure CLI
az login
Vytvořte skupinu prostředků s názvem
cogserv-container-rg
, která bude obsahovat všechny prostředky vytvořené v tomto postupu.az group create --name cogserv-container-rg --location westus
Vytvořte si vlastní službu Azure Container Registry s formátem vašeho názvu,
registry
napříkladpattyregistry
. Nepoužívejte v názvu pomlčky ani podtržené znaky.az acr create --resource-group cogserv-container-rg --name pattyregistry --sku Basic
Uložte výsledky a získejte vlastnost loginServer . Bude to část adresy hostovaného kontejneru, která se použije později v
language.yml
souboru.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" }
Přihlaste se ke svému registru kontejneru. Před odesláním imagí do registru se musíte přihlásit.
az acr login --name pattyregistry
Získání image Dockeru webu
Vzorový kód použitý v tomto postupu je v úložišti ukázek kontejnerů Azure AI. Naklonujte úložiště tak, aby měla místní kopii ukázky.
git clone https://github.com/Azure-Samples/cognitive-services-containers-samples
Jakmile je úložiště na místním počítači, najděte web v adresáři \dotnet\Language\FrontendService . Tento web funguje jako klientská aplikace, která volá rozhraní API pro rozpoznávání jazyka hostované v kontejneru rozpoznávání jazyka.
Sestavte image Dockeru pro tento web. Ujistěte se, že je konzola v adresáři \FrontendService , kde je soubor Dockerfile umístěn při spuštění následujícího příkazu:
docker build -t language-frontend -t pattiyregistry.azurecr.io/language-frontend:v1 .
Pokud chcete sledovat verzi v registru kontejneru, přidejte značku ve formátu verze, například
v1
.Nasdílejte image do registru kontejneru. Tento proces může trvat několik minut.
docker push pattyregistry.azurecr.io/language-frontend:v1
Pokud se zobrazí
unauthorized: authentication required
chyba, přihlaste se pomocíaz acr login --name <your-container-registry-name>
příkazu.Po dokončení procesu by se výsledky měly podobat následujícímu:
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
Získání image Dockeru pro rozpoznávání jazyka
Stáhněte si nejnovější verzi image Dockeru do místního počítače. Tento proces může trvat několik minut. Pokud existuje novější verze tohoto kontejneru, změňte hodnotu z
1.1.006770001-amd64-preview
na novější verzi.docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
Označte image pomocí registru kontejneru. Vyhledejte nejnovější verzi a nahraďte ji
1.1.006770001-amd64-preview
, pokud máte novější verzi.docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Nasdílejte image do registru kontejneru. Tento proces může trvat několik minut.
docker push pattyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Získání přihlašovacích údajů služby Container Registry
Následující kroky jsou potřeba k získání požadovaných informací pro připojení registru kontejneru ke službě Azure Kubernetes Service, kterou vytvoříte později v tomto postupu.
Vytvoření instančního objektu
az ad sp create-for-rbac
Uložte hodnotu výsledků
appId
pro parametr assignee v kroku 3.<appId>
password
Uložte parametr<client-secret>
client-secret dalšího oddílu .{ "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" }
Získejte ID registru kontejneru.
az acr show --resource-group cogserv-container-rg --name pattyregistry --query "id" --output table
V dalším kroku uložte výstup pro hodnotu
<acrId>
parametru oboru. Vypadá takto:/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistry
Uložte úplnou hodnotu kroku 3 v této části.
Pokud chcete clusteru AKS udělit správný přístup k používání imagí uložených v registru kontejneru, vytvořte přiřazení role. Nahraďte a
<acrId>
nahraďte<appId>
hodnotami shromážděnými v předchozích dvou krocích.az role assignment create --assignee <appId> --scope <acrId> --role Reader
Vytvoření služby Azure Kubernetes Service
Vytvořte cluster Kubernetes. Všechny hodnoty parametrů pocházejí z předchozích částí s výjimkou parametru name. Zvolte název, který označuje, kdo ho vytvořil, a jeho účel, například
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
Tento krok může to trvat několik minut. Výsledkem je:
{ "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" }
Služba se vytvoří, ale ještě nemá kontejner pro rozpoznávání webů nebo jazyka.
Získejte přihlašovací údaje clusteru Kubernetes.
az aks get-credentials --resource-group cogserv-container-rg --name patty-kube
Načtení definice orchestrace do služby Kubernetes
Tato část používá rozhraní příkazového řádku kubectl ke komunikaci se službou Azure Kubernetes Service.
Před načtením definice orchestrace zkontrolujte, jestli má kubectl přístup k uzlům.
kubectl get nodes
Odpověď vypadá takto:
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
Zkopírujte následující soubor a pojmenujte ho
language.yml
. Soubor obsahujeservice
oddíl adeployment
každou část pro dva typy kontejnerů,language-frontend
kontejner webu alanguage
kontejner detekce.# 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
Změňte řádky nasazení front-endu
language.yml
podle následující tabulky a přidejte vlastní názvy imagí registru kontejneru, tajný klíč klienta a nastavení služby Language.Nastavení nasazení front-endu jazyka Účel Řádek 32
image
vlastnostUmístění image pro front-endovou image ve službě Container Registry <container-registry-name>.azurecr.io/language-frontend:v1
Řádek 44
name
vlastnostTajný klíč služby Container Registry pro image, který se označuje jako <client-secret>
v předchozí části.Změňte řádky
language.yml
nasazení jazyka podle následující tabulky a přidejte vlastní názvy imagí registru kontejneru, tajný klíč klienta a nastavení služby Language.Nastavení nasazení jazyka Účel Řádek 78
image
vlastnostUmístění image pro image jazyka ve službě Container Registry <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
Řádek 95
name
vlastnostTajný klíč služby Container Registry pro image, který se označuje jako <client-secret>
v předchozí části.Řádek 91
apiKey
vlastnostVáš klíč prostředku služby Language Řádek 92
billing
vlastnostKoncový bod fakturace vašeho prostředku služby Language https://westus.api.cognitive.microsoft.com/text/analytics/v2.1
Vzhledem k tomu, že se koncový bod apiKey a fakturace nastaví jako součást definice orchestrace Kubernetes, kontejner webu o nich nemusí vědět ani je předat jako součást požadavku. Kontejner webu odkazuje na kontejner rozpoznávání jazyka podle názvu
language
orchestrátoru .Načtěte definiční soubor orchestrace pro tuto ukázku ze složky, do které jste vytvořili a uložili
language.yml
soubor .kubectl apply -f language.yml
Odpověď je:
service "language-frontend" created deployment.apps "language-frontend" created service "language" created deployment.apps "language" created
Získání externích IP adres kontejnerů
U těchto dvou kontejnerů ověřte language-frontend
, že jsou spuštěné a language
služby, a získejte externí IP adresu.
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
Pokud se služba zobrazí jako čekající, spusťte příkaz znovu, dokud se IP adresa nezobrazí, než přejdete k dalšímu kroku.
Testování kontejneru pro rozpoznávání jazyka
Otevřete prohlížeč a přejděte na externí IP adresu kontejneru language
z předchozí části: http://<external-ip>:5000/swagger/index.html
. Pomocí funkce rozhraní API můžete Try it
otestovat koncový bod rozpoznávání jazyka.
Testování kontejneru klientské aplikace
Změňte adresu URL v prohlížeči na externí IP adresu kontejneru language-frontend
pomocí následujícího formátu: http://<external-ip>/helloworld
. Anglický text helloworld
jazykové verze je předpovězen jako English
.
Vyčištění prostředků
Až s clusterem skončíte, odstraňte skupinu prostředků Azure.
az group delete --name cogserv-container-rg