Distribuera en språkidentifieringscontainer till Azure Kubernetes Service

Lär dig hur du distribuerar språkidentifieringscontainern. 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 kan du skapa ett kostnadsfritt konto innan du börjar.
  • Git för ditt operativsystem 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 Azure AI Services-containerexemplet för språkidentifiering. Exemplet har två containrar, en för klientprogrammet och en för Azure AI-tjänstcontainern. Vi push-överför båda dessa avbildningar till Azure Container Registry. När de finns i ditt eget register skapar du en Azure Kubernetes Service för att komma åt avbildningarna och köra containrarna. När containrarna körs använder du kubectl CLI för att watch containrarnas prestanda. Få åtkomst till klientprogrammet med en HTTP-begäran och se resultatet.

Ett diagram som visar konceptuell idé om att köra en container på Kubernetes

Exempelcontainrarna

Exemplet har två containeravbildningar, en för klientdelswebbplatsen. Den andra avbildningen är språkidentifieringscontainern 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 språkidentifieringsslutpunkten. När proceduren är klar får du det identifierade språket för en teckensträng genom att öppna webbplatscontainern i en webbläsare med http://<external-IP>/<text-to-analyze>. Ett exempel på denna URL är http://132.12.23.255/helloworld!. Resultatet i webbläsaren är English.

Språkcontainern

Språkidentifieringscontainern ä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 containerspecifik språkidentifiering i Azure AI-tjänster ä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-containrarna.

Skapa Azure Container Registry-tjänst

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.

  1. Logga in på Azure CLI

    az login
    
  2. 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
    
  3. Skapa en egen Azure Container Registry med formatet för ditt namn och sedan registry, till exempel pattyregistry. 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 kommer att vara 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"
    }
    
  4. Logga in på containerregistret. Du måste logga in innan du kan skicka avbildningar till registret.

    az acr login --name pattyregistry
    

Hämta webbplatsens Docker-avbildning

  1. Exempelkoden som används i den här proceduren finns på lagringsplatsen för Azure AI-containrarexempel. Klona lagringsplatsen för att få en lokal kopia av exemplet.

    git clone https://github.com/Azure-Samples/cognitive-services-containers-samples
    

    När lagringsplatsen finns på den lokala datorn letar du upp webbplatsen i katalogen \dotnet\Language\FrontendService . Den här webbplatsen fungerar som klientprogrammet som anropar språkidentifierings-API:et som finns i språkidentifieringscontainern.

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

  3. Push-överför 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 felmeddelande loggar du in med az acr login --name <your-container-registry-name> kommandot .

    När processen är klar bör resultatet se ut ungefär så här:

    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 dockeravbildning för språkidentifiering

  1. 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
    
  2. Tagga avbildningen 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
    
  3. Push-överför 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 den information som krävs för att ansluta containerregistret till Azure Kubernetes Service du skapar senare i den här proceduren.

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

  3. Om du vill bevilja rätt åtkomst för AKS-klustret att använda avbildningar som lagras i containerregistret skapar du en rolltilldelning. Ersätt <appId> och <acrId> med de värden som samlats in i föregående två steg.

    az role assignment create --assignee <appId> --scope <acrId> --role Reader
    

Skapa Azure Kubernetes Service

  1. Skapa Kubernetes-klustret. Alla parametervärden kommer från föregående 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 skapas men den har inte webbplatscontainern eller språkidentifieringscontainern ännu.

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

I det här avsnittet används kubectl CLI för att kommunicera med Azure Kubernetes Service.

  1. 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
    
  2. Kopiera följande fil och ge den language.ymlnamnet . Filen har ett service avsnitt och ett deployment avsnitt för de två containertyperna language-frontend , webbplatscontainern och identifieringscontainern language .

    # 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. Ä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åkklientdelen Syfte
    Rad 32
    image Egenskapen
    Avbildningsplats för klientdelsavbildningen i containerregistret
    <container-registry-name>.azurecr.io/language-frontend:v1
    Rad 44
    name Egenskapen
    Container Registry-hemlighet för avbildningen, som <client-secret> kallas i ett tidigare avsnitt.
  4. Ä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 Egenskapen
    Avbildningsplats för språkavbildningen i containerregistret
    <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
    Rad 95
    name Egenskapen
    Container Registry-hemlighet för avbildningen, som <client-secret> kallas i ett tidigare avsnitt.
    Rad 91
    apiKey Egenskapen
    Din språktjänstresursnyckel
    Rad 92
    billing Egenskapen
    Faktureringsslutpunkten 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 orchestratornamn language.

  5. 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 och language körs 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 för 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 språkidentifieringscontainern

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

En skärmbild som visar containerns swagger-dokumentation

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

Nästa steg

Azure AI-containrar