將語言偵測容器部署到 Azure Kubernetes Service
了解如何部署語言偵測容器。 此程序示範如何建立本機的 Docker 容器、將容器推送至私人容器登錄、在 Kubernetes 叢集中執行容器,並在網頁瀏覽器中進行測試。
必要條件
此程序需要必須安裝並在本機執行的多個工具。 請勿使用 Azure Cloud Shell。
- 使用 Azure 訂用帳戶。 如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
- Git 適用於您的作業系統,因此您可以複製此程序中使用的範例。
- Azure CLI。
- Docker 引擎,並驗證 Docker CLI 可在主控台視窗中運作。
- kubectl。
- 具有正確定價層的 Azure 資源。 並非所有的定價層都會使用這個容器︰
- 只有 F0 或標準定價層的語言資源。
- 有 S0 定價層的 Azure AI 服務資源。
執行範例
此程序會載入並執行適用於語言偵測的 Azure AI 服務容器範例。 此範例有兩個容器,一個用於用戶端應用程式,一個用於 Azure AI 服務容器。 我們會將這兩個映像推送至 Azure Container Registry。 當這些映像出現在您自己的登錄之後,請建立 Azure Kubernetes Service 來存取這些映像並執行容器。 容器執行時,使用 kubectl CLI 來監看容器效能。 使用 HTTP 要求存取用戶端應用程式,並查看結果。
範例容器
此範例有兩個容器映像,一個用於前端網站。 第二個映像是對於文字傳回偵測語言 (文化特性) 的語言偵測容器。 在您完成後,即可從外部的 IP 存取這兩個容器。
語言前端容器
此網站相當於您本身提出語言偵測端點要求的用戶端應用程式。 程序完成時,您可以使用 http://<external-IP>/<text-to-analyze>
存取瀏覽器中的網站容器,收到所偵測到的字元字串語言。 此 URL 的範例是 http://132.12.23.255/helloworld!
。 瀏覽器中的結果是 English
。
語言容器
任何外部要求均可存取此特定程序中的語言偵測容器。 由於容器尚未受到任何變更,因此標準 Azure AI 服務容器特定的語言偵測 API 可供使用。
對於此容器,該 API 是語言偵測的 POST 要求。 如同所有 Azure AI 容器,您可以從其託管的 Swagger 資訊 (http://<external-IP>:5000/swagger/index.html
) 深入了解容器。
連接埠 5000 是與 Azure AI 容器搭配使用的預設連接埠。
建立 Azure Container Registry 服務
若要將容器部署至 Azure Kubernetes Service,必須可存取容器映像。 建立您自己的 Azure Container Registry 服務來裝載映像。
登入 Azure CLI
az login
建立名為
cogserv-container-rg
的資源群組來保存在此程序中建立的每個資源。az group create --name cogserv-container-rg --location westus
然後,以您的名稱加上
registry
的格式 (例如pattyregistry
) 來建立您自己的 Azure Container Registry。 在名稱中請勿使用連字號或底線字元。az acr create --resource-group cogserv-container-rg --name pattyregistry --sku Basic
將結果儲存以取得 loginServer 屬性。 這將是託管容器的位址,稍後將用於
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" }
登入您的容器登錄。 您需要登入,才能將映像推送至您的登錄。
az acr login --name pattyregistry
取得網站 Docker 映像
在此程序中使用的範例程式碼是在 Azure AI 容器範例存放庫中。 複製存放庫來取得範例的本機副本。
git clone https://github.com/Azure-Samples/cognitive-services-containers-samples
存放庫出現在本機電腦後,在 \dotnet\Language\FrontendService 目錄中尋找網站。 此網站將作為用戶端應用程式,呼叫語言偵測容器中託管的語言偵測 API。
建置此網站的 Docker 映像。 您執行下列命令時,確定主控台位於 Dockerfile 所在的 \FrontendService 目錄:
docker build -t language-frontend -t pattiyregistry.azurecr.io/language-frontend:v1 .
若要追蹤容器登錄庫的版本,請將標記加入版本格式,例如
v1
。將映像推送至容器登錄。 這可能需要幾分鐘的時間。
docker push pattyregistry.azurecr.io/language-frontend:v1
如果您收到
unauthorized: authentication required
錯誤,請使用az acr login --name <your-container-registry-name>
命令登入。此程序完成時,結果應該如下所示:
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 映像
將最新版 Docker 映像提取到本機電腦。 這可能需要幾分鐘的時間。 如果沒有這個容器的較新版本,請將該值從
1.1.006770001-amd64-preview
變更為較新版本。docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
使用容器登錄標記映像。 尋找最新版本,如果有較新版本,則取代版本
1.1.006770001-amd64-preview
。docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-preview
將映像推送至容器登錄。 這可能需要幾分鐘的時間。
docker push pattyregistry.azurecr.io/language:1.1.006770001-amd64-preview
取得容器登錄認證
需要進行下列步驟,才能取得您稍後在此程序中建立的 Azure Kubernetes Service 連接您的容器登錄所需的資訊。
建立服務主體。
az ad sp create-for-rbac
對於步驟 3 中的受託人參數
<appId>
儲存結果appId
值。 對於下一個區段的 client-secret 參數<client-secret>
儲存password
。{ "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" }
取得容器登錄 ID。
az acr show --resource-group cogserv-container-rg --name pattyregistry --query "id" --output table
在下一個步驟中儲存範圍參數值的輸出
<acrId>
。 如下所示:/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistry
對於這個區段的步驟 3 儲存完整值。
若要授予 AKS 叢集所需的正確存取權,以使用容器登錄中儲存的映像,請建立角色指派。 使用在前兩個步驟中所蒐集的值,取代
<appId>
和<acrId>
。az role assignment create --assignee <appId> --scope <acrId> --role Reader
建立 Azure Kubernetes Service
建立 Kubernetes 叢集。 除了 name 參數之外的所有參數值均來自先前區段。 選擇表示建立者及其用途的名稱,例如
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
這步驟可能需要幾分鐘的時間。 結果如下:
{ "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" }
服務已建立,但是沒有網站容器或語言偵測容器。
取得 Kubernetes 叢集的認證。
az aks get-credentials --resource-group cogserv-container-rg --name patty-kube
將協調流程定義載入到您的 Kubernetes 服務
本節使用 kubectl CLI 與 Azure Kubernetes 服務交談。
載入協調流程定義之前,請檢查 kubectl 可存取節點。
kubectl get nodes
回應如下所示:
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
複製下列檔案並命名為
language.yml
。 檔案有service
區段和deployment
區段,分別用於兩種容器類型,而且有language-frontend
網站容器和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
根據下表變更
language.yml
的語言前端部署行,以便新增您自己的容器登錄映像名稱、用戶端密碼和語言服務設定。語言前端部署設定 目的 行 32
image
屬性容器登錄中的前端映像所在的映像位置 <container-registry-name>.azurecr.io/language-frontend:v1
行 44
name
屬性上一個區段之中映像的容器登錄密碼,稱為 <client-secret>
。根據下表變更
language.yml
的語言部署行,以便新增您自己的容器登錄映像名稱、用戶端密碼和語言服務設定。語言部署設定 目的 行 78
image
屬性容器登錄中的語言映像所在的映像位置 <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
行 95
name
屬性上一個區段之中映像的容器登錄密碼,稱為 <client-secret>
。行 91
apiKey
屬性您的語言服務資源金鑰 行 92
billing
屬性您語言服務資源的帳單端點。 https://westus.api.cognitive.microsoft.com/text/analytics/v2.1
因為 apiKey 和計費端點會設定為 Kubernetes 協調流程定義的一部分,因此網站容器不需要知道這些,也不需要傳遞這些成為要求的一部分。 網站容器是指其協調器名稱為
language
的語言偵測容器。從您建立和儲存
language.yml
的資料夾中,載入此範例的協調流程定義檔。kubectl apply -f language.yml
回應是:
service "language-frontend" created deployment.apps "language-frontend" created service "language" created deployment.apps "language" created
取得容器的外部 IP
對於這兩個容器,確認 language-frontend
和 language
服務正在執行,並取得外部 IP 位址。
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
顯示為擱置,請重新執行命令,直到移至下一個步驟之前顯示 IP 位址為止。
測試語言偵測容器
從上一個區段開啟瀏覽器並瀏覽至 language
容器的外部 IP:http://<external-ip>:5000/swagger/index.html
。 您可以使用 API 的 Try it
功能測試語言偵測端點。
測試用戶端應用程式容器
使用下列格式,將瀏覽器中的 URL 變更為 language-frontend
容器的外部 IP:http://<external-ip>/helloworld
。 helloworld
的英文文化特性文字預測為 English
。
清除資源
在您完成叢集之後,請刪除 Azure 資源群組。
az group delete --name cogserv-container-rg