Nasazení kontejneru rozpoznávání jazyka do 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 kontejnerů, 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é musí být nainstalovány a spuštěny 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 Docker a ověřte, že rozhraní příkazového řádku Dockeru funguje v okně konzoly.
- kubectl.
- Prostředek Azure se správnou cenovou úrovní. Ne všechny cenové úrovně fungují s tímto kontejnerem:
- Prostředek jazyka s cenovou úrovní 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 druhý pro kontejner služeb Azure AI. Obě tyto image nasdílíme do Azure Container Registry. Jakmile budou ve vašem vlastním registru, vytvořte 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 watch výkon kontejnerů. Přejděte ke 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í budou oba kontejnery přístupné z externí IP adresy.
Kontejner front-endu jazyka
Tento web je ekvivalentem vaší vlastní klientské aplikace, 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ů přístupem ke kontejneru webu v prohlížeči pomocí 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 je v tomto konkrétním postupu přístupný všem externím požadavkem. Kontejner se nijak nezměnil, takže je k dispozici standardní rozhraní API pro rozpoznávání jazyka specifické pro kontejnery služeb Azure AI.
Pro tento kontejner je toto rozhraní API požadavek POST na rozpoznávání jazyka. Stejně jako u všech kontejnerů Azure AI se o kontejneru můžete dozvědět více z hostovaných informací o Swaggeru. http://<external-IP>:5000/swagger/index.html
Port 5000 je výchozím portem používaným pro kontejnery Azure AI.
Vytvoření služby Azure Container Registry
Pokud chcete kontejner nasadit do Azure Kubernetes Service, musí být image kontejneru 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 rámci tohoto postupu.az group create --name cogserv-container-rg --location westus
Vytvořte vlastní Azure Container Registry s formátem vašeho jména a pak
registry
, napříkladpattyregistry
. V názvu nepoužívejte pomlčky ani podtržení.az acr create --resource-group cogserv-container-rg --name pattyregistry --sku Basic
Uložte výsledky a získejte vlastnost loginServer . Bude součá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 vložením imagí do registru se musíte přihlásit.
az acr login --name pattyregistry
Získání image Dockeru pro web
Ukázkový kód použitý v tomto postupu je v úložišti ukázek kontejnerů Azure AI. Naklonujte úložiště, abyste měli 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, vyhledejte 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. Při spuštění následujícího příkazu se ujistěte, že se konzola nachází v adresáři \FrontendService , kde se nachází soubor Dockerfile:
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. Může to trvat několik minut.
docker push pattyregistry.azurecr.io/language-frontend:v1
Pokud se zobrazí chyba
unauthorized: authentication required
, přihlaste seaz acr login --name <your-container-registry-name>
pomocí příkazu .Po dokončení procesu by výsledky měly vypadat přibližně takto:
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 na místní počítač. Může to 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. Může to 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 k Azure Kubernetes Service, který vytvoříte dále v tomto postupu.
Vytvoření instančního objektu
az ad sp create-for-rbac
Uložte hodnotu výsledků
appId
pro parametr přiřazeného v kroku 3 .<appId>
password
Uložte parametr<client-secret>
client-secret v další části .{ "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 si ú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
<appId>
a<acrId>
hodnotami shromážděnými v předchozích dvou krocích.az role assignment create --assignee <appId> --scope <acrId> --role Reader
Vytvoření Azure Kubernetes Service
Vytvořte cluster Kubernetes. Všechny hodnoty parametrů jsou 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 trvat několik minut. Výsledek je následující:
{ "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 je vytvořená, ale ještě nemá kontejner webových stránek ani kontejner rozpoznávání 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
V této části se ke komunikaci s Azure Kubernetes Service používá rozhraní příkazového řádku kubectl.
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
oddíl pro oba 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 front-endové řádky
language.yml
nasazení jazyka na základě následující tabulky a přidejte vlastní názvy imagí registru kontejneru, tajný klíč klienta a nastavení služby jazyka.Nastavení nasazení front-endu pro jazyk Účel Řádek 32
image
VlastnostUmístění image front-endu ve službě Container Registry <container-registry-name>.azurecr.io/language-frontend:v1
Řádek 44
name
VlastnostTajný kód služby Container Registry pro image, který se označuje jako <client-secret>
v předchozí části.Změňte řádky
language.yml
nasazení jazyka na základě následující tabulky a přidejte vlastní názvy imagí registru kontejneru, tajný klíč klienta a nastavení služby jazyka.Nastavení nasazení jazyka Účel Řádek 78
image
VlastnostUmístění image jazyka ve službě Container Registry <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
Řádek 95
name
VlastnostTajný kód služby Container Registry pro image, který se označuje jako <client-secret>
v předchozí části.Řádek 91
apiKey
VlastnostKlíč prostředku služby Language Řádek 92
billing
VlastnostKoncový bod fakturace pro váš prostředek služby jazyka. https://westus.api.cognitive.microsoft.com/text/analytics/v2.1
Vzhledem k tomu, že apiKey a koncový bod fakturace jsou nastavené jako součást definice orchestrace Kubernetes, kontejner webu o nich nemusí vědět ani je předávat jako součást požadavku. Kontejner webu odkazuje na kontejner rozpoznávání jazyka názvem orchestrátoru
language
.Načtěte definiční soubor orchestrace pro tuto ukázku ze složky, do které jste vytvořili a uložili
language.yml
.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, že language-frontend
jsou služby a language
spuštěné, 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 pro službu zobrazuje jako čekající, spusťte příkaz znovu, dokud se nezobrazí IP adresa, a teprve pak přejděte k dalšímu kroku.
Testování kontejneru 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
. K otestování koncového bodu rozpoznávání jazyka můžete použít Try it
funkci rozhraní API.
Testování kontejneru klientské aplikace
Změňte adresu URL v prohlížeči na externí IP adresu kontejneru language-frontend
v následujícím formátu: http://<external-ip>/helloworld
. Text anglické jazykové verze je helloworld
predikovaný jako English
.
Vyčištění prostředků
Po dokončení práce s clusterem odstraňte skupinu prostředků Azure.
az group delete --name cogserv-container-rg