Bagikan melalui


Menyebarkan kontainer deteksi bahasa ke Azure Kubernetes Service

Pelajari cara menyebarkan kontainer deteksi bahasa. Prosedur ini menampilkan cara membuat kontainer Docker lokal, mendorong kontainer ke registri kontainer pribadi Anda, menjalankan kontainer di kluster Kubernetes, dan mengujinya di browser web.

Prasyarat

Prosedur ini memerlukan beberapa alat yang harus diinstal dan dijalankan secara lokal. Jangan gunakan Azure Cloud Shell.

  • Gunakan langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.
  • Git untuk sistem operasi Anda sehingga Anda dapat membuat klon sampel yang digunakan dalam prosedur ini.
  • Azure CLI.
  • Mesin Docker dan pastikan bahwa Docker CLI berfungsi di jendela konsol.
  • kubectl.
  • Sumber daya Azure dengan tingkat harga yang benar. Tidak semua tingkatan harga berfungsi dengan kontainer ini:
    • Sumber daya Bahasa hanya dengan F0 atau tingkat harga Standar.
    • Sumber daya layanan Azure AI dengan tingkat harga S0.

Menjalankan sampel

Prosedur ini memuat dan menjalankan sampel kontainer layanan Azure AI untuk deteksi bahasa. Sampel memiliki dua kontainer, satu untuk aplikasi klien dan satu untuk kontainer layanan Azure AI. Kami akan mendorong kedua gambar ini ke Azure Container Registry. Setelah kedua gambar ini berada di registri Anda, buat Azure Kubernetes Service untuk mengakses gambar-gambar ini dan menjalankan kontainer. Saat kontainer berjalan, gunakan kubectl CLI untuk melihat performa kontainer. Akses aplikasi klien dengan permintaan HTTP dan lihat hasilnya.

Diagram yang menunjukkan ide konseptual menjalankan kontainer di Kube

Kontainer sampel

Sampel memiliki dua gambar kontainer, satu untuk situs web frontend. Gambar kedua adalah kontainer pendeteksi bahasa yang mengembalikan bahasa (budaya) teks yang terdeteksi. Kedua kontainer dapat diakses dari IP eksternal setelah Anda selesai.

Kontainer frontend-bahasa

Situs web ini setara dengan aplikasi sisi klien Anda yang membuat permintaan titik akhir deteksi bahasa. Ketika prosedur selesai, Anda mendapatkan bahasa yang terdeteksi dari string karakter dengan mengakses kontainer situs web di browser dengan http://<external-IP>/<text-to-analyze>. Contoh URL ini adalah http://132.12.23.255/helloworld!. Hasilnya di browser adalah English.

Kontainer bahasa

Kontainer deteksi bahasa, dalam prosedur khusus ini, dapat diakses oleh permintaan eksternal apa pun. Kontainer belum diubah dengan cara apa pun sehingga API deteksi bahasa khusus kontainer layanan Azure AI standar tersedia.

Untuk kontainer ini, API itu adalah permintaan POST untuk deteksi bahasa. Seperti semua kontainer Azure AI, Anda dapat mempelajari lebih lanjut tentang kontainer dari informasi Swagger yang dihosting, http://<external-IP>:5000/swagger/index.html.

Port 5000 adalah port default yang digunakan dengan kontainer Azure AI.

Buat layanan Azure Container Registry

Untuk menyebarkan kontainer ke Azure Kubernetes Service, gambar kontainer harus dapat diakses. Buat layanan Azure Container Registry Anda sendiri untuk menghosting gambar.

  1. Masuk ke Azure CLI

    az login
    
  2. Buat grup sumber daya bernama cogserv-container-rg untuk menampung setiap sumber daya yang dibuat dalam prosedur ini.

    az group create --name cogserv-container-rg --location westus
    
  3. Buat Azure Container Registry Anda sendiri dengan format nama Anda lalu registry, misalnya pattyregistry. Jangan gunakan tanda hubung atau karakter garis bawah dalam nama.

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

    Simpan hasilnya untuk mendapatkan properti loginServer. Properti ini akan menjadi bagian dari alamat kontainer yang dihosting, yang digunakan nanti dalam file language.yml.

    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. Masuk ke registri kontainer Anda. Anda harus masuk sebelum Anda dapat mendorong gambar ke registri Anda.

    az acr login --name pattyregistry
    

Dapatkan gambar Docker situs web

  1. Kode sampel yang digunakan dalam prosedur ini ada di repositori sampel kontainer Azure AI. Buat klone repositori untuk memiliki salinan sampel lokal.

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

    Setelah repositori berada di komputer lokal Anda, temukan situs web di direktori \dotnet\Language\FrontendService. Situs web ini bertindak sebagai aplikasi klien yang memanggil API deteksi bahasa yang dihosting di kontainer deteksi bahasa.

  2. Bangun gambar Docker untuk situs web ini. Pastikan konsol berada di direktori \FrontendService tempat Dockerfile berada saat Anda menjalankan perintah berikut:

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

    Untuk melacak versi di registri kontainer Anda, tambahkan tag dengan format versi, seperti v1.

  3. Dorong gambar ke registri kontainer Anda. Ini mungkin perlu waktu beberapa menit.

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

    Jika Anda mendapatkan kesalahan unauthorized: authentication required, masuk dengan perintah az acr login --name <your-container-registry-name>.

    Ketika proses selesai, hasilnya akan serupa dengan:

    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
    

Dapatkan gambar Docker deteksi bahasa

  1. Tarik versi terbaru gambar Docker ke komputer lokal. Ini mungkin perlu waktu beberapa menit. Jika ada versi kontainer ini yang lebih baru, ubah nilainya dari 1.1.006770001-amd64-preview ke versi yang lebih baru.

    docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
    
  2. Tandai gambar dengan registri kontainer Anda. Temukan versi terbaru dan ganti versi 1.1.006770001-amd64-preview jika Anda memiliki versi yang lebih baru.

    docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-preview
    
  3. Dorong gambar ke registri kontainer Anda. Ini mungkin perlu waktu beberapa menit.

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

Dapatkan kredensial Container Registry

Langkah-langkah berikut diperlukan untuk mendapatkan informasi yang diperlukan untuk menghubungkan registri kontainer Anda dengan Azure Kubernetes Service yang Anda buat nanti dalam prosedur ini.

  1. Buat prinsipal layanan.

    az ad sp create-for-rbac
    

    Simpan nilai appId hasil untuk parameter penerima tugas di langkah 3, <appId>. Simpan password untuk parameter rahasia klien di bagian berikutnya <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. Dapatkan ID registri kontainer Anda.

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

    Simpan output untuk nilai parameter cakupan, <acrId>, di langkah berikutnya. Seperti berikut:

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

    Simpan nilai penuh untuk langkah 3 di bagian ini.

  3. Untuk memberikan akses yang benar bagi kluster AKS untuk menggunakan gambar yang disimpan di registri kontainer Anda, buat penetapan peran. Ganti <appId> dan <acrId> dengan nilai yang dikumpulkan dalam dua langkah sebelumnya.

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

Buat Azure Kubernetes Service

  1. Buat kluster Kubernetes. Semua nilai parameter berasal dari bagian sebelumnya kecuali parameter nama. Pilih nama yang menunjukkan siapa yang membuatnya dan tujuannya, seperti 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
    

    Langkah ini mungkin perlu waktu beberapa menit. Hasilnya adalah:

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

    Layanan dibuat tetapi belum memiliki kontainer situs web atau kontainer pendeteksi bahasa.

  2. Dapatkan kredensial cluster Kubernetes.

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

Muat definisi orkestrasi ke dalam layanan Kubernetes Anda

Bagian ini menggunakan kubectl CLI untuk berbicara dengan Azure Kubernetes Service.

  1. Sebelum memuat definisi orkestrasi, periksa kubectl memiliki akses ke node.

    kubectl get nodes
    

    Responsnya seperti berikut:

    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. Salin file berikut dan beri nama language.yml. File tersebut memiliki bagian service dan bagian deployment masing-masing untuk dua jenis kontainer, kontainer situs web language-frontend, dan kontainer deteksi 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. Ubah baris penyebaran bahasa-frontend language.yml berdasarkan tabel berikut untuk menambahkan nama gambar registri penampung Anda sendiri, rahasia klien, dan setelan Layanan bahasa.

    Pengaturan penyebaran frontend bahasa Tujuan
    Baris 32
    Properti image
    Lokasi gambar untuk gambar frontend di Container Registry Anda
    <container-registry-name>.azurecr.io/language-frontend:v1
    Baris 44
    Properti name
    Rahasia Container Registry untuk gambar, yang disebut sebagai <client-secret> di bagian sebelumnya.
  4. Ubah baris penyebaran bahasa pemrogram language.yml berdasarkan tabel berikut untuk menambahkan nama gambar registri penampung Anda sendiri, rahasia klien, dan setelan Layanan bahasa.

    Pengaturan penyebaran bahasa Tujuan
    Baris 78
    Properti image
    Lokasi gambar untuk gambar bahasa di Container Registry Anda
    <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
    Baris 95
    Properti name
    Rahasia Container Registry untuk gambar, yang disebut sebagai <client-secret> di bagian sebelumnya.
    Baris 91
    Properti apiKey
    Kunci sumber daya layanan Bahasa Anda
    Baris 92
    Properti billing
    Titik akhir penagihan untuk sumber daya layanan Bahasa Anda.
    https://westus.api.cognitive.microsoft.com/text/analytics/v2.1

    Karena apiKey dan titik akhir penagihan ditetapkan sebagai bagian dari definisi orkestrasi Kubernetes, kontainer situs web tidak perlu mengetahuinya atau meneruskannya sebagai bagian dari permintaan. Kontainer situs web merujuk ke kontainer pendeteksi bahasa dengan nama orkestratornya language.

  5. Muat file definisi orkestrasi untuk contoh ini dari folder tempat Anda membuat dan menyimpan file language.yml.

    kubectl apply -f language.yml
    

    Responnya adalah:

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

Dapatkan IP kontainer eksternal

Untuk dua kontainer, pastikan layanan language-frontend dan language berjalan dan dapatkan alamat IP eksternal.

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

Jika EXTERNAL-IP untuk layanan ditampilkan sebagai tertunda, jalankan kembali perintah hingga alamat IP ditampilkan sebelum melanjutkan ke langkah berikutnya.

Uji kontainer deteksi bahasa

Buka browser dan navigasikan ke IP eksternal kontainer language dari bagian sebelumnya: http://<external-ip>:5000/swagger/index.html. Anda dapat menggunakan fitur Try it API untuk menguji titik akhir deteksi bahasa.

Tangkapan layar yang menunjukkan dokumentasi swagger kontainer

Uji kontainer aplikasi klien

Ubah URL di browser ke IP eksternal kontainer language-frontend menggunakan format berikut: http://<external-ip>/helloworld. Teks budaya Inggris helloworld diperkirakan sebagai English.

Bersihkan sumber daya

Setelah selesai dengan kluster, hapus grup sumber daya Azure.

az group delete --name cogserv-container-rg

Langkah berikutnya

Kontainer Azure AI