Sdílet prostřednictvím


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.

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

  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 tomto postupu.

    az group create --name cogserv-container-rg --location westus
    
  3. Vytvořte si vlastní službu Azure Container Registry s formátem vašeho názvu, registrynapříklad pattyregistry. 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"
    }
    
  4. 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

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

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

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

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

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

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

  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

Tato část používá rozhraní příkazového řádku kubectl ke komunikaci se službou Azure Kubernetes Service.

  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 každou část pro dva 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 řá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 vlastnost
    Umístění image pro front-endovou image ve službě Container Registry
    <container-registry-name>.azurecr.io/language-frontend:v1
    Řádek 44
    name vlastnost
    Tajný klíč 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 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 vlastnost
    Umí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 vlastnost
    Tajný klíč služby Container Registry pro image, který se označuje jako <client-secret> v předchozí části.
    Řádek 91
    apiKey vlastnost
    Váš klíč prostředku služby Language
    Řádek 92
    billing vlastnost
    Koncový 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 languageorchestrátoru .

  5. Načtěte definiční soubor orchestrace pro tuto ukázku ze složky, do které jste vytvořili a uložili language.ymlsoubor .

    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.

Snímek obrazovky zobrazující dokumentaci ke swaggeru kontejneru

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

Další kroky

Kontejnery Azure AI