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.

Diagram znázorňující koncepční myšlenku spuštění kontejneru v Kubernetes

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í.

  1. Přihlášení k Azure CLI

    az login
    
  2. 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
    
  3. Vytvořte vlastní Azure Container Registry s formátem vašeho jména a pak registry, například pattyregistry. 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"
    }
    
  4. 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

  1. 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.

  2. 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.

  3. 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 se az 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

  1. 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
    
  2. 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
    
  3. 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.

  1. 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"
    }
    
  2. 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.

  3. 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

  1. 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.

  2. 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.

  1. 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
    
  2. Zkopírujte následující soubor a pojmenujte ho language.yml. Soubor obsahuje service oddíl a deployment oddíl pro oba typy kontejnerů, language-frontend kontejner webu a language 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
    
  3. 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 Vlastnost
    Umístění image front-endu ve službě Container Registry
    <container-registry-name>.azurecr.io/language-frontend:v1
    Řádek 44
    name Vlastnost
    Tajný kód služby Container Registry pro image, který se označuje jako <client-secret> v předchozí části.
  4. 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 Vlastnost
    Umístění image jazyka ve službě Container Registry
    <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
    Řádek 95
    name Vlastnost
    Tajný kód služby Container Registry pro image, který se označuje jako <client-secret> v předchozí části.
    Řádek 91
    apiKey Vlastnost
    Klíč prostředku služby Language
    Řádek 92
    billing Vlastnost
    Koncový 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.

  5. 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.

Snímek obrazovky s dokumentací ke swaggeru kontejneru

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

Další kroky

Kontejnery Azure AI