Distribuera en språkidentifieringscontainer till Azure Kubernetes Service

Lär dig hur du distribuerar språkidentifieringscontainern. Den här proceduren visar hur du skapar lokala Docker-containrar, push-erar 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å. Det är inte alla prisnivåer som fungerar med den här containern:
    • Språkresurs med prisnivåerna F0 eller Standard.
    • Cognitive Services resurs med prisnivån S0.

Köra exemplet

Den här proceduren läser in och kör Cognitive Services containerexempel för språkidentifiering. Exemplet har två containrar, en för klientprogrammet och en för Cognitive Services containern. Vi skickar båda avbildningarna 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 se containrarnas prestanda. Öppna klientprogrammet med en HTTP-begäran och se resultatet.

Ett diagram som visar konceptuella idén med att köra en container på Kubernetes

Exempelcontainrarna

Exemplet har två containeravbildningar, en för webbplatsen för frontend. Den andra bilden ä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åkcontainern för frontend

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, i den här specifika proceduren, är tillgänglig för alla externa förfrågningar. Containern har inte ändrats på något sätt, så standard-API:et för Cognitive Services för containerspecifik språkidentifiering är tillgängligt.

För den här containern är det API:et en POST-begäran om språkidentifiering. Precis som med alla Cognitive Services-containrar kan du lära dig mer om containern från dess värdindelade Swagger-information, http://<external-IP>:5000/swagger/index.html .

Port 5000 är standardporten som används med Cognitive Services containrar.

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 som värd för avbildningarna.

  1. Logga in på Azure CLI

    az login
    
  2. Skapa en resursgrupp med namnet för cogserv-container-rg varje resurs som skapas i den här proceduren.

    az group create --name cogserv-container-rg --location westus
    
  3. Skapa egna 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 är en del av den värddatorcontainerns 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 push-skicka avbildningar till registret.

    az acr login --name pattyregistry
    

Hämta dockeravbildning för webbplats

  1. Exempelkoden som används i den här proceduren finns på lagringsplatsen Cognitive Services containerexempel. 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 hittar du webbplatsen i katalogen \dotnet\Language\FrontendService. Den här webbplatsen fungerar som klientprogram 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-skicka 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 kommandot az acr login --name <your-container-registry-name> .

    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 Docker-avbildning 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 1.1.006770001-amd64-preview från till den nyare versionen.

    docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
    
  2. Tagga avbildningen med ditt containerregister. 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-skicka avbildningen till containerregistret. Det kan ta några minuter.

    docker push pattyregistry.azurecr.io/language:1.1.006770001-amd64-preview
    

Hämta Container Registry autentiseringsuppgifter

Följande steg krävs för att hämta nödvändig information för att ansluta ditt containerregister till den 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> . Spara password 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" --o table
    

    Spara utdata för omfångsparametervärdet, <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 ge rätt åtkomst för AKS-klustret att använda avbildningar som lagras i containerregistret skapar du en rolltilldelning. Ersätt <appId> och med de värden som samlats in i de föregående två <acrId> stegen.

    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 den 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 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äsa in orkestreringsdefinitionen i Kubernetes-tjänsten

I det här avsnittet används kubectl CLI för att prata 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 namnet language.yml . Filen har ett avsnitt service och ett avsnitt vardera för de två deployment containertyperna, language-frontend webbplatscontainern och language identifieringscontainern.

    # 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 för språk-klientsidan baserat på följande tabell för att lägga till dina egna language.yml containerregisteravbildningsnamn, klienthemlighet och språktjänstinställningar.

    Inställningar för distribution av språk på frontend-sidan Syfte
    Rad 32
    image Egenskapen
    Bildplats för frontend-avbildningen i Container Registry
    <container-registry-name>.azurecr.io/language-frontend:v1
    Rad 44
    name Egenskapen
    Container Registry hemlighet för avbildningen, vilket kallas <client-secret> i ett tidigare avsnitt.
  4. Ändra språkdistributionsraderna i baserat på följande tabell för att lägga till egna namn på language.yml containerregisteravbildningar, klienthemligheter och språktjänstinställningar.

    Inställningar för språkdistribution Syfte
    Rad 78
    image Egenskapen
    Bildplats för språkbilden i Container Registry
    <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
    Rad 95
    name Egenskapen
    Container Registry hemlighet för avbildningen, vilket kallas <client-secret> i ett tidigare avsnitt.
    Rad 91
    apiKey Egenskapen
    Din resursnyckel för språktjänsten
    Rad 92
    billing Egenskapen
    Faktureringsslutpunkten för din Language Service-resurs.
    https://westus.api.cognitive.microsoft.com/text/analytics/v2.1

    Eftersom apiKey och faktureringsslutpunkten anges som en del av Kubernetes-orkestreringsdefinitionen behöver inte webbplatscontainern känna till dessa eller skicka dem som en del av begäran. Webbplatscontainern refererar till språkidentifieringscontainern med orkestreringsnamnet 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 körs och hämtar den externa language 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

Om för tjänsten visas som väntande kör du kommandot igen tills EXTERNAL-IP IP-adressen visas innan du går vidare till nästa steg.

Testa språkidentifieringscontainern

Öppna en webbläsare och navigera till den externa IP-adressen language för containern från föregående avsnitt: http://<external-ip>:5000/swagger/index.html . Du kan använda funktionen Try it i API:et för att testa språkidentifieringsslutpunkten.

En skärmbild som visar containerns swagger-dokumentation

Testa klientprogramcontainern

Ändra URL:en i webbläsaren till den externa IP-adressen för language-frontend containern 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