Een taaldetectiecontainer implementeren in Azure Kubernetes Service

Meer informatie over het implementeren van de taaldetectiecontainer. Deze procedure laat zien hoe u de lokale Docker-containers maakt, de containers naar uw eigen privécontainerregister pusht, de container in een Kubernetes-cluster uitvoeren en deze in een webbrowser test.

Vereisten

Voor deze procedure zijn verschillende hulpprogramma's vereist die lokaal moeten worden geïnstalleerd en uitgevoerd. Gebruik Azure Cloud Shell niet.

  • Gebruik een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint.
  • Git voor uw besturingssysteem, zodat u het voorbeeld kunt klonen dat in deze procedure wordt gebruikt.
  • Azure CLI.
  • Docker-engine en controleer of de Docker CLI werkt in een consolevenster.
  • kubectl.
  • Een Azure-resource met de juiste prijscategorie. Niet alle prijscategorie werkt met deze container:
    • Taalresource met alleen de prijscategorie F0 of Standard.
    • Cognitive Services resource met de prijscategorie S0.

Het voorbeeld uitvoeren

Met deze procedure wordt het voorbeeld Cognitive Services container voor taaldetectie geladen en uitgevoerd. Het voorbeeld heeft twee containers, één voor de clienttoepassing en één voor de Cognitive Services container. We pushen beide afbeeldingen naar de Azure Container Registry. Zodra ze zich in uw eigen register hebben, maakt u een Azure Kubernetes Service om toegang te krijgen tot deze afbeeldingen en de containers uit te voeren. Wanneer de containers worden uitgevoerd, gebruikt u de kubectl CLI om de prestaties van de containers te bekijken. Open de clienttoepassing met een HTTP-aanvraag en bekijk de resultaten.

Een diagram met het conceptuele idee van het uitvoeren van een container in Kubernetes

De voorbeeldcontainers

Het voorbeeld heeft twee containerafbeeldingen, één voor de front-endwebsite. De tweede afbeelding is de container voor taaldetectie die de gedetecteerde taal (cultuur) van tekst retourneerd. Beide containers zijn toegankelijk vanaf een extern IP-adres wanneer u klaar bent.

De language-frontend-container

Deze website is gelijk aan uw eigen toepassing aan de clientzijde die aanvragen voor het eindpunt voor taaldetectie doet. Wanneer de procedure is voltooid, krijgt u de gedetecteerde taal van een tekenreeks door de websitecontainer te openen in een browser met http://<external-IP>/<text-to-analyze> . Een voorbeeld van deze URL is http://132.12.23.255/helloworld!. Het resultaat in de browser is English .

De taalcontainer

De taaldetectiecontainer is in deze specifieke procedure toegankelijk voor elke externe aanvraag. De container is op geen enkele manier gewijzigd, dus de standaard Cognitive Services containerspecifieke taaldetectie-API is beschikbaar.

Voor deze container is die API een POST-aanvraag voor taaldetectie. Net als bij alle Cognitive Services containers, kunt u meer informatie over de container vinden op de gehoste Swagger-informatie, http://<external-IP>:5000/swagger/index.html .

Poort 5000 is de standaardpoort die wordt gebruikt met de Cognitive Services containers.

Een Azure Container Registry maken

Als u de container wilt implementeren in Azure Kubernetes Service, moeten de containerafbeeldingen toegankelijk zijn. Maak uw eigen Azure Container Registry voor het hosten van de afbeeldingen.

  1. Aanmelden bij de Azure CLI

    az login
    
  2. Maak een resourcegroep met de cogserv-container-rg naam voor elke resource die in deze procedure is gemaakt.

    az group create --name cogserv-container-rg --location westus
    
  3. Maak uw eigen Azure Container Registry met de indeling van uw naam en registry vervolgens , zoals pattyregistry . Gebruik geen streepjes of onderstrepingstekens in de naam.

    az acr create --resource-group cogserv-container-rg --name pattyregistry --sku Basic
    

    Sla de resultaten op om de eigenschap loginServer op te halen. Dit maakt deel uit van het adres van de gehoste container, dat later in het bestand wordt language.yml gebruikt.

    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. Meld u aan bij uw containerregister. U moet zich aanmelden voordat u afbeeldingen naar het register kunt pushen.

    az acr login --name pattyregistry
    

Docker-website-afbeelding downloaden

  1. De voorbeeldcode die in deze procedure wordt gebruikt, staat in de opslagplaats Cognitive Services containers samples. Kloon de opslagplaats voor een lokale kopie van het voorbeeld.

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

    Zodra de opslagplaats zich op uw lokale computer bevinden, gaat u naar de website in de map \dotnet\Language\FrontendService. Deze website fungeert als de clienttoepassing die de taaldetectie-API aanroept die wordt gehost in de taaldetectiecontainer.

  2. Bouw de Docker-afbeelding voor deze website. Zorg ervoor dat de console zich in de map \FrontendService bevindt waarin de Dockerfile zich bevindt wanneer u de volgende opdracht hebt uitgevoerd:

    docker build -t language-frontend -t pattiyregistry.azurecr.io/language-frontend:v1 .
    

    Als u de versie in uw containerregister wilt bijhouden, voegt u de tag toe met een versie-indeling, zoals v1 .

  3. Push de -afbeelding naar het containerregister. Dit kan enkele minuten duren.

    docker push pattyregistry.azurecr.io/language-frontend:v1
    

    Als er een unauthorized: authentication required foutmelding wordt weergegeven, meld u zich aan met de az acr login --name <your-container-registry-name> opdracht .

    Wanneer het proces is uitgevoerd, moeten de resultaten er ongeveer als volgen:

    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
    

Docker-afbeelding voor taaldetectie op halen

  1. Haal de nieuwste versie van de Docker-afbeelding op naar de lokale computer. Dit kan enkele minuten duren. Als er een nieuwere versie van deze container is, wijzigt u de waarde van 1.1.006770001-amd64-preview in de nieuwere versie.

    docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
    
  2. Tag de afbeelding met uw containerregister. Zoek de nieuwste versie en vervang de versie 1.1.006770001-amd64-preview als u een recentere versie hebt.

    docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-preview
    
  3. Push de -afbeelding naar het containerregister. Dit kan enkele minuten duren.

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

Uw Container Registry op te halen

De volgende stappen zijn nodig om de vereiste gegevens op te halen om uw containerregister te verbinden met de Azure Kubernetes Service u later in deze procedure maakt.

  1. Maak een service-principal.

    az ad sp create-for-rbac
    

    Sla de waarde appId van de resultaten voor de parameter assignee in stap 3, <appId> op. Sla de password op voor de clientgeheimparameter van de volgende <client-secret> sectie.

    {
      "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. Haal de id van het containerregister op.

    az acr show --resource-group cogserv-container-rg --name pattyregistry --query "id" --o table
    

    Sla de uitvoer voor de waarde van de bereikparameter, <acrId> , op in de volgende stap. Deze ziet er als volgt uit:

    /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistry
    

    Sla de volledige waarde voor stap 3 in deze sectie op.

  3. Maak een roltoewijzing om het AKS-cluster de juiste toegang te verlenen voor het gebruik van afbeeldingen die zijn opgeslagen in uw containerregister. Vervang <appId> en door de waarden die in de vorige twee stappen zijn <acrId> verzameld.

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

Een Azure Kubernetes Service

  1. Maak de Kubernetes-cluster. Alle parameterwaarden zijn afkomstig uit de vorige secties, met uitzondering van de naamparameter. Kies een naam die aangeeft wie deze heeft gemaakt en het doel ervan, zoals 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
    

    Deze stap kan enkele minuten duren. Het resultaat is:

    {
      "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"
    }
    

    De service is gemaakt, maar de websitecontainer of taaldetectiecontainer is nog niet beschikbaar.

  2. Haal referenties van het Kubernetes-cluster op.

    az aks get-credentials --resource-group cogserv-container-rg --name patty-kube
    

De orchestration-definitie laden in uw Kubernetes-service

In deze sectie wordt de kubectl CLI gebruikt om te praten met de Azure Kubernetes Service.

  1. Voordat u de orchestration-definitie laadt, controleert u of kubectl toegang heeft tot de knooppunten.

    kubectl get nodes
    

    Het antwoord ziet er als volgende uit:

    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. Kopieer het volgende bestand en noem het language.yml . Het bestand heeft een sectie en een sectie voor de twee service deployment containertypen, de language-frontend websitecontainer en de language detectiecontainer.

    # 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. Wijzig de taal-front-en-front-front-implementatieregels van op basis van de volgende tabel om uw eigen language.yml namen van containerregisters, clientgeheimen en taalservice-instellingen toe te voegen.

    Implementatie-instellingen voor taal-front-en-front-en Doel
    Regel 32
    image Eigenschap
    Locatie van de afbeelding voor de front-Container Registry
    <container-registry-name>.azurecr.io/language-frontend:v1
    Regel 44
    name Eigenschap
    Container Registry geheim voor de afbeelding, zoals in <client-secret> een vorige sectie is genoemd.
  4. Wijzig de taalimplementatieregels van op basis van de volgende tabel om uw eigen namen van language.yml containerregisters, clientgeheimen en taalservice-instellingen toe te voegen.

    Taalimplementatie-instellingen Doel
    Regel 78
    image Eigenschap
    Locatie van de afbeelding voor de taalafbeelding in uw Container Registry
    <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
    Regel 95
    name Eigenschap
    Container Registry geheim voor de afbeelding, zoals in <client-secret> een vorige sectie is genoemd.
    Regel 91
    apiKey Eigenschap
    De resourcesleutel van uw Taalservice
    Regel 92
    billing Eigenschap
    Het facturerings-eindpunt voor uw Language Service-resource.
    https://westus.api.cognitive.microsoft.com/text/analytics/v2.1

    Omdat de apiKey en het facturerings-eindpunt zijn ingesteld als onderdeel van de Kubernetes-orchestrationdefinitie, hoeft de websitecontainer deze niet te weten of door te geven als onderdeel van de aanvraag. De websitecontainer verwijst naar de taaldetectiecontainer met de orchestratornaam language .

  5. Laad het orchestration-definitiebestand voor dit voorbeeld vanuit de map waarin u de hebt gemaakt en language.yml opgeslagen.

    kubectl apply -f language.yml
    

    Het antwoord is:

    service "language-frontend" created
    deployment.apps "language-frontend" created
    service "language" created
    deployment.apps "language" created
    

Externe IP's van containers op halen

Controleer voor de twee containers of de language-frontend services en worden uitgevoerd en haal het externe language IP-adres op.

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

Als de voor de service wordt weergegeven als in behandeling, moet u de opdracht opnieuw uitvoeren totdat het IP-adres wordt weergegeven EXTERNAL-IP voordat u naar de volgende stap gaat.

De taaldetectiecontainer testen

Open een browser en navigeer naar het externe IP-adres van de language container uit de vorige sectie: http://<external-ip>:5000/swagger/index.html . U kunt de functie Try it van de API gebruiken om het eindpunt voor taaldetectie te testen.

Een schermopname met de Swagger-documentatie van de container

De clienttoepassingscontainer testen

Wijzig de URL in de browser in het externe IP-adres van de language-frontend container met de volgende indeling: http://<external-ip>/helloworld . De Engelse cultuurtekst van helloworld wordt voorspeld als English .

Resources opschonen

Wanneer u klaar bent met het cluster, verwijdert u de Azure-resourcegroep.

az group delete --name cogserv-container-rg

Volgende stappen