Wdrażanie kontenera wykrywania języka w usłudze Azure Kubernetes Service
Dowiedz się, jak wdrożyć kontener wykrywania języka. Ta procedura przedstawia sposób tworzenia lokalnych kontenerów platformy Docker, wypychania kontenerów do własnego prywatnego rejestru kontenerów, uruchamiania kontenera w klastrze Kubernetes i testowania go w przeglądarce internetowej.
Wymagania wstępne
Ta procedura wymaga kilku narzędzi, które należy zainstalować i uruchomić lokalnie. Nie używaj usługi Azure Cloud Shell.
- Użyj subskrypcji platformy Azure. Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
- Git dla systemu operacyjnego, aby można było sklonować przykład użyty w tej procedurze.
- Interfejs wiersza polecenia platformy Azure.
- Aparat platformy Docker i sprawdź, czy interfejs wiersza polecenia platformy Docker działa w oknie konsoli.
- kubectl.
- Zasób platformy Azure z prawidłową warstwą cenową. Nie wszystkie warstwy cenowe działają z tym kontenerem:
- Zasób języka z warstwami cenowymi F0 lub Standardowa.
- Zasób usług azure AI z warstwą cenową S0.
Uruchamianie przykładowej aplikacji
Ta procedura ładuje i uruchamia przykład kontenera usług Azure AI na potrzeby wykrywania języka. Przykład zawiera dwa kontenery: jeden dla aplikacji klienckiej i jeden dla kontenera usług Azure AI. Wypchniemy oba te obrazy do usługi Azure Container Registry. Gdy znajdują się one we własnym rejestrze, utwórz usługę Azure Kubernetes Service, aby uzyskać dostęp do tych obrazów i uruchomić kontenery. Gdy kontenery są uruchomione, użyj interfejsu wiersza polecenia kubectl , aby obserwować wydajność kontenerów. Uzyskiwanie dostępu do aplikacji klienckiej przy użyciu żądania HTTP i wyświetlanie wyników.
Przykładowe kontenery
Przykład zawiera dwa obrazy kontenerów— jeden dla witryny internetowej frontonu. Drugi obraz to kontener wykrywania języka zwracający wykryty język (kultura) tekstu. Oba kontenery są dostępne z zewnętrznego adresu IP po zakończeniu.
Kontener frontonu językowego
Ta witryna internetowa jest odpowiednikiem własnej aplikacji po stronie klienta, która wysyła żądania punktu końcowego wykrywania języka. Po zakończeniu procedury uzyskasz wykryty język ciągu znaków, korzystając z kontenera witryny internetowej w przeglądarce za pomocą polecenia http://<external-IP>/<text-to-analyze>
. Przykładem tego adresu URL jest http://132.12.23.255/helloworld!
. Wynik w przeglądarce to English
.
Kontener języka
Kontener wykrywania języka w tej konkretnej procedurze jest dostępny dla dowolnego żądania zewnętrznego. Kontener nie został zmieniony w żaden sposób, więc standardowy interfejs API wykrywania języka specyficznego dla kontenera usług Azure AI jest dostępny.
Dla tego kontenera ten interfejs API jest żądaniem POST na potrzeby wykrywania języka. Podobnie jak w przypadku wszystkich kontenerów sztucznej inteligencji platformy Azure, możesz dowiedzieć się więcej o kontenerze z informacji o hostowanym programie Swagger. http://<external-IP>:5000/swagger/index.html
Port 5000 jest domyślnym portem używanym z kontenerami usługi Azure AI.
Tworzenie usługi Azure Container Registry
Aby wdrożyć kontener w usłudze Azure Kubernetes Service, obrazy kontenerów muszą być dostępne. Utwórz własną usługę Azure Container Registry, aby hostować obrazy.
Logowanie się do interfejsu wiersza polecenia platformy Azure
az login
Utwórz grupę zasobów o nazwie
cogserv-container-rg
do przechowywania każdego zasobu utworzonego w tej procedurze.az group create --name cogserv-container-rg --location westus
Utwórz własną usługę Azure Container Registry w formacie swojej nazwy,
registry
na przykładpattyregistry
. Nie używaj kreski ani znaków podkreśleń w nazwie.az acr create --resource-group cogserv-container-rg --name pattyregistry --sku Basic
Zapisz wyniki, aby uzyskać właściwość loginServer . Będzie to część adresu hostowanego kontenera, używanego
language.yml
w dalszej części pliku.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" }
Zaloguj się do rejestru kontenerów. Przed wypchnięciem obrazów do rejestru należy się zalogować.
az acr login --name pattyregistry
Pobieranie obrazu platformy Docker witryny internetowej
Przykładowy kod używany w tej procedurze znajduje się w repozytorium przykładów kontenerów usługi Azure AI. Sklonuj repozytorium, aby mieć lokalną kopię przykładu.
git clone https://github.com/Azure-Samples/cognitive-services-containers-samples
Gdy repozytorium znajduje się na komputerze lokalnym, znajdź witrynę internetową w katalogu \dotnet\Language\FrontendService . Ta witryna internetowa działa jako aplikacja kliencka wywołująca interfejs API wykrywania języka hostowany w kontenerze wykrywania języka.
Skompiluj obraz platformy Docker dla tej witryny internetowej. Upewnij się, że konsola znajduje się w katalogu \FrontendService , w którym znajduje się plik Dockerfile podczas uruchamiania następującego polecenia:
docker build -t language-frontend -t pattiyregistry.azurecr.io/language-frontend:v1 .
Aby śledzić wersję rejestru kontenerów, dodaj tag z formatem wersji, takim jak
v1
.Wypchnij obraz do rejestru kontenerów. Może to potrwać kilka minut.
docker push pattyregistry.azurecr.io/language-frontend:v1
Jeśli wystąpi
unauthorized: authentication required
błąd, zaloguj się zaaz acr login --name <your-container-registry-name>
pomocą polecenia .Po zakończeniu procesu wyniki powinny być podobne do następujących:
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
Pobieranie obrazu platformy Docker wykrywania języka
Pobierz najnowszą wersję obrazu platformy Docker na komputer lokalny. Może to potrwać kilka minut. Jeśli istnieje nowsza wersja tego kontenera, zmień wartość z
1.1.006770001-amd64-preview
na nowszą wersję.docker pull mcr.microsoft.com/azure-cognitive-services/language:1.1.006770001-amd64-preview
Tagowanie obrazu przy użyciu rejestru kontenerów. Znajdź najnowszą wersję i zastąp
1.1.006770001-amd64-preview
wersję, jeśli masz najnowszą wersję.docker tag mcr.microsoft.com/azure-cognitive-services/language pattiyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Wypchnij obraz do rejestru kontenerów. Może to potrwać kilka minut.
docker push pattyregistry.azurecr.io/language:1.1.006770001-amd64-preview
Pobieranie poświadczeń usługi Container Registry
Poniższe kroki są wymagane do uzyskania wymaganych informacji w celu połączenia rejestru kontenerów z usługą Azure Kubernetes Service utworzoną w dalszej części tej procedury.
Utwórz jednostkę usługi.
az ad sp create-for-rbac
Zapisz wartość wyników
appId
dla parametru assignee w kroku 3,<appId>
. Zapisz parametrpassword
client-secret<client-secret>
następnej sekcji .{ "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" }
Pobierz identyfikator rejestru kontenerów.
az acr show --resource-group cogserv-container-rg --name pattyregistry --query "id" --output table
Zapisz dane wyjściowe dla wartości parametru zakresu ,
<acrId>
w następnym kroku. Wygląda na to:/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/cogserv-container-rg/providers/Microsoft.ContainerRegistry/registries/pattyregistry
Zapisz pełną wartość kroku 3 w tej sekcji.
Aby udzielić poprawnego dostępu klastrowi usługi AKS do używania obrazów przechowywanych w rejestrze kontenerów, utwórz przypisanie roli. Zastąp
<appId>
wartości i<acrId>
wartościami zebranymi w dwóch poprzednich krokach.az role assignment create --assignee <appId> --scope <acrId> --role Reader
Tworzenie usługi Azure Kubernetes Service
Utwórz klaster Kubernetes. Wszystkie wartości parametrów pochodzą z poprzednich sekcji, z wyjątkiem parametru name. Wybierz nazwę, która wskazuje, kto go utworzył i jego przeznaczenie, na przykład
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
Ten krok może potrwać kilka minut. Wynik to:
{ "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" }
Usługa jest tworzona, ale nie ma jeszcze kontenera witryny internetowej ani kontenera wykrywania języka.
Pobieranie poświadczeń klastra Kubernetes.
az aks get-credentials --resource-group cogserv-container-rg --name patty-kube
Ładowanie definicji aranżacji do usługi Kubernetes
W tej sekcji użyto interfejsu wiersza polecenia kubectl do rozmowy z usługą Azure Kubernetes Service.
Przed załadowaniem definicji aranżacji sprawdź, czy narzędzie kubectl ma dostęp do węzłów.
kubectl get nodes
Odpowiedź wygląda następująco:
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
Skopiuj następujący plik i nadaj mu
language.yml
nazwę . Plik zawiera sekcję i sekcjędeployment
service
każdą dla dwóch typów kontenerów,language-frontend
kontener witryny internetowej i kontener wykrywanialanguage
.# 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
Zmień linie wdrażania frontonu językowego
language.yml
na podstawie poniższej tabeli, aby dodać własne nazwy obrazów rejestru kontenerów, klucz tajny klienta i ustawienia usługi językowej.Ustawienia wdrażania frontonu językowego Purpose Wiersz 32
image
własnośćLokalizacja obrazu frontonu w usłudze Container Registry <container-registry-name>.azurecr.io/language-frontend:v1
Wiersz 44
name
własnośćWpis tajny usługi Container Registry dla obrazu, określany jako <client-secret>
w poprzedniej sekcji.Zmień wiersze wdrażania języka na podstawie poniższej
language.yml
tabeli, aby dodać własne nazwy obrazów rejestru kontenerów, klucz tajny klienta i ustawienia usługi językowej.Ustawienia wdrażania języka Purpose Wiersz 78
image
własnośćLokalizacja obrazu języka w usłudze Container Registry <container-registry-name>.azurecr.io/language:1.1.006770001-amd64-preview
Wiersz 95
name
własnośćWpis tajny usługi Container Registry dla obrazu, określany jako <client-secret>
w poprzedniej sekcji.Wiersz 91
apiKey
własnośćKlucz zasobu usługi językowej Wiersz 92
billing
własnośćPunkt końcowy rozliczeń dla zasobu usługi językowej. https://westus.api.cognitive.microsoft.com/text/analytics/v2.1
Ponieważ klucz apiKey i punkt końcowy rozliczeń są ustawiane jako część definicji aranżacji platformy Kubernetes, kontener witryny internetowej nie musi wiedzieć o nich ani przekazywać ich w ramach żądania. Kontener witryny internetowej odwołuje się do kontenera wykrywania języka według nazwy
language
orkiestratora .Załaduj plik definicji aranżacji dla tego przykładu z folderu, w którym utworzono i zapisano
language.yml
plik .kubectl apply -f language.yml
Odpowiedź to:
service "language-frontend" created deployment.apps "language-frontend" created service "language" created deployment.apps "language" created
Uzyskiwanie zewnętrznych adresów IP kontenerów
W przypadku dwóch kontenerów sprawdź, czy language-frontend
usługi i language
są uruchomione i uzyskaj zewnętrzny adres 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
Jeśli dla usługi jest wyświetlana jako oczekująca, uruchom ponownie polecenie, dopóki adres IP nie zostanie wyświetlony przed przejściem do następnego kroku.
Testowanie kontenera wykrywania języka
Otwórz przeglądarkę i przejdź do zewnętrznego adresu IP kontenera language
z poprzedniej sekcji: http://<external-ip>:5000/swagger/index.html
. Za pomocą Try it
funkcji interfejsu API można przetestować punkt końcowy wykrywania języka.
Testowanie kontenera aplikacji klienckiej
Zmień adres URL w przeglądarce na zewnętrzny adres IP kontenera language-frontend
przy użyciu następującego formatu: http://<external-ip>/helloworld
. Tekst angielskiej helloworld
kultury jest przewidywany jako English
.
Czyszczenie zasobów
Po zakończeniu pracy z klastrem usuń grupę zasobów platformy Azure.
az group delete --name cogserv-container-rg