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 memvalidasi bahwa Docker CLI berfungsi di jendela konsol.
- kubectl.
- Sumber daya Azure dengan tingkat harga yang benar. Tidak semua tingkat 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.
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.
Masuk ke Azure CLI
az login
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
Buat Azure Container Registry Anda sendiri dengan format nama Anda lalu
registry
, misalnyapattyregistry
. 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" }
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
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.
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
.Dorong gambar ke registri kontainer Anda. Proses ini memerlukan waktu beberapa menit.
docker push pattyregistry.azurecr.io/language-frontend:v1
Jika Anda mendapatkan kesalahan
unauthorized: authentication required
, masuk dengan perintahaz 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
Tarik versi terbaru gambar Docker ke komputer lokal. Proses ini memerlukan 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
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
Dorong gambar ke registri kontainer Anda. Proses ini memerlukan 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.
Buat prinsipal layanan.
az ad sp create-for-rbac
Simpan nilai
appId
hasil untuk parameter penerima tugas di langkah 3,<appId>
. Simpanpassword
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" }
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. Respons terlihat seperti:/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistry
Simpan nilai penuh untuk langkah 3 di bagian ini.
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
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 memakan 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.
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.
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
Salin file berikut dan beri nama
language.yml
. File tersebut memiliki bagianservice
dan bagiandeployment
masing-masing untuk dua jenis kontainer, kontainer situs weblanguage-frontend
, dan kontainer deteksilanguage
.# 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
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
Propertiimage
Lokasi gambar untuk gambar frontend di Container Registry Anda <container-registry-name>.azurecr.io/language-frontend:v1
Baris 44
Propertiname
Rahasia Container Registry untuk gambar, yang disebut sebagai <client-secret>
di bagian sebelumnya.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
Propertiimage
Lokasi gambar untuk gambar bahasa di Container Registry Anda <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
Baris 95
Propertiname
Rahasia Container Registry untuk gambar, yang disebut sebagai <client-secret>
di bagian sebelumnya.Baris 91
PropertiapiKey
Kunci sumber daya layanan Bahasa Anda Baris 92
Propertibilling
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
.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.
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
.
Membersihkan sumber daya
Setelah selesai dengan kluster, hapus grup sumber daya Azure.
az group delete --name cogserv-container-rg