Hostowanie nowej bazy danych przy użyciu usługi Azure Cosmos DB
Teraz, gdy zapoznaliśmy się z podstawowymi pojęciami dotyczącymi stanów zewnętrznych i sposobu radzenia sobie z nimi przy użyciu platformy Kubernetes, utwórzmy zasoby, które będą obsługiwać aplikację firmy frachtowej, a następnie utworzymy samą aplikację.
Tworzenie grupy zasobów
Ważny
Potrzebujesz własnej subskrypcji platformy Azure, aby uruchomić to ćwiczenie i możesz ponieść opłaty. Jeśli nie masz jeszcze subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto .
Zaloguj się w portalu Azure przy użyciu własnej subskrypcji.
Otwórz usługę Cloud Shell i wybierz Bash.
Utwórz grupę zasobów platformy Azure przy użyciu polecenia
az group create
i określ region. W tym przykładzie tworzona jest grupa zasobów o nazwie rg-ship-manager w regionie eastus:az group create --name rg-ship-manager --location eastus
Ukończenie procesu tworzenia może potrwać kilka minut.
Utwórz stan
Jak opisano wcześniej, możliwe jest zarządzanie stanem w Kubernetes, ale nie jest to zalecane. Zarządzanie stanem aplikacji o wysokiej dostępności może stać się zbyt trudne, gdy musisz samodzielnie zarządzać stanem.
Aby rozwiązać ten problem, przeniesiemy stan na zewnątrz do aplikacji, która specjalizuje się w obsłudze stanu zewnętrznego: Azure Cosmos DB.
Notatka
Mimo że tworzymy wystąpienie usługi Azure Cosmos DB jako część wymaganych zasobów do uruchomienia aplikacji, usługi Azure Kubernetes Service (AKS) i usługi Azure Cosmos DB nie są powiązane ze sobą.
** Utwórz zmienne Bash, aby przechowywać nazwę konta Azure Cosmos DB i nazwę grupy zasobów do używania w reszcie modułu.
export RESOURCE_GROUP=rg-ship-manager export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
Utwórz nowe konto usługi Azure Cosmos DB przy użyciu polecenia
az cosmosdb create
.az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
Ukończenie procesu tworzenia może potrwać kilka minut.
Utwórz nową bazę danych przy użyciu polecenia
az cosmosdb mongodb database create
. W tym przykładzie baza danych nosi nazwę contoso-ship-manager.az cosmosdb mongodb database create --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --name contoso-ship-manager
Sprawdź, czy baza danych została pomyślnie utworzona przy użyciu polecenia
az cosmosdb mongodb database list
.az cosmosdb mongodb database list --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP -o table
Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:
Name ResourceGroup -------------------- --------------- contoso-ship-manager rg-ship-manager
Teraz, gdy utworzyłeś zewnętrzny stan do przechowywania wszystkich danych z aplikacji do zarządzania statkami, stwórzmy zasób AKS do przechowywania samej aplikacji.
Utwórz klaster AKS
Utwórz zmienną shell Bash, aby przechować nazwę klastra dla użycia w pozostałej części modułu.
AKS_CLUSTER_NAME=ship-manager-cluster
Utwórz klaster usługi AKS przy użyciu polecenia
az aks create
.az aks create --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME \ --node-count 3 \ --generate-ssh-keys \ --node-vm-size Standard_B2s \ --enable-addons http_application_routing
Ukończenie procesu tworzenia może potrwać kilka minut.
Notatka
Wszystkie usługi platformy Azure ustawiają domyślne limity i limity przydziału dla zasobów i funkcji, w tym ograniczenia użycia dla niektórych jednostek SKU maszyny wirtualnej. Jeśli wystąpi błąd sugerujący, że żądana jednostka SKU maszyny wirtualnej nie jest dostępna w wybranym regionie, najprawdopodobniej musisz zwiększyć ten limit przydziału za pośrednictwem żądania pomocy technicznej platformy Azure (w przypadku typ problemu wybierz pozycję Limit przydziału).
Pobierz konfigurację narzędzia kubectl przy użyciu polecenia
az aks get-credentials
.az aks get-credentials --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP
Jeśli otrzymasz jakiekolwiek komunikaty dotyczące istniejących klastrów, na przykład:
A different object named ship-manager-cluster already exists in your kubeconfig file. Overwrite? (y/n):
Wprowadź
y
, aby nadpisać.Przetestuj konfigurację przy użyciu polecenia
kubectl get nodes
.kubectl get nodes
Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:
NAME STATUS ROLES AGE VERSION aks-nodepool1-12345678-vmss000000 Ready agent 3m19s v1.27.7 aks-nodepool1-12345678-vmss000001 Ready agent 3m25s v1.27.7 aks-nodepool1-12345678-vmss000002 Ready agent 3m20s v1.27.7
Wdrażanie aplikacji
Aby utworzyć aplikację, należy utworzyć pliki YAML w celu wdrożenia na platformie Kubernetes.
Wdróż interfejs API zaplecza
Pobierz parametry połączenia bazy danych usługi Azure Cosmos DB przy użyciu polecenia
az cosmosdb keys list
.az cosmosdb keys list --type connection-strings -g $RESOURCE_GROUP -n $COSMOSDB_ACCOUNT_NAME --query "connectionStrings[0].connectionString" -o tsv
Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:
mongodb://contoso-ship-manager-12345678.documents.azure.com:10255/?ssl=true&replicaSet=globaldb
Utwórz nowy plik o nazwie backend-deploy.yml i wklej następującą specyfikację wdrożenia:
apiVersion: apps/v1 kind: Deployment metadata: name: ship-manager-backend spec: replicas: 1 selector: matchLabels: app: ship-manager-backend template: metadata: labels: app: ship-manager-backend spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-ship-manager:backend name: ship-manager-backend resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 3000 name: http env: - name: DATABASE_MONGODB_URI value: "{your database connection string}" - name: DATABASE_MONGODB_DBNAME value: contoso-ship-manager
Zastąp symbol zastępczy
{your database connection string}
parametrami połączenia bazy danych pobranymi w poprzednim kroku.Notatka
Nie zapomnij dodać cudzysłowów
"
do zmiennych środowiskowych, ponieważ parametry połączenia czasami zawierają nieprawidłowe znaki YAML. Możesz rozważyć użycie tajemnic jako bezpiecznego sposobu przechowywania i pobierania ciągów połączeń w usłudze AKS.Zapisz i zamknij plik.
Zastosuj wdrożenie interfejsu API zaplecza przy użyciu polecenia
kubectl apply
.kubectl apply -f backend-deploy.yml
Powinien zostać wyświetlony komunikat podobny do następujących przykładowych danych wyjściowych:
deployment.apps/ship-manager-backend created
Aby udostępnić tę aplikację wszystkim, musisz utworzyć usługę i ingress, aby zarządzać ruchem.
Pobierz adres serwera interfejsu API klastra przy użyciu polecenia
az aks show
.az aks show -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME -o tsv --query fqdn
Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:
ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io
Utwórz nowy plik o nazwie backend-network.yml i wklej następującą specyfikację sieci:
apiVersion: v1 kind: Service metadata: name: ship-manager-backend spec: type: ClusterIP ports: - port: 80 targetPort: 3000 selector: app: ship-manager-backend --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ship-manager-backend spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: <host-name> http: paths: - backend: service: name: ship-manager-backend port: number: 80 path: / pathType: Prefix
Zastąp symbol zastępczy
<host-name>
parametrami połączenia pobranymi w poprzednim kroku.Zapisz i zamknij plik.
Zastosuj wdrożenie sieci zaplecza IT przy użyciu polecenia
kubectl apply
.kubectl apply -f backend-network.yml
Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:
service/ship-manager-backend created ingress.networking.k8s.io/ship-manager-backend created
Możesz uzyskać dostęp do interfejsu API za pomocą nazwy hosta, którą wkleiłeś w zasobie wejściowym. Ukończenie wykrywania DNS przez zasób strefy usługi Azure DNS może potrwać do pięciu minut. Jeśli nie możesz od razu uzyskać dostępu do interfejsu API, poczekaj kilka minut i spróbuj ponownie.
Sprawdź status ingressu, wysyłając zapytanie do Kubernetes pod kątem dostępnych zasobów przy użyciu polecenia
kubectl get ingress
.kubectl get ingress
Po wypełnieniu pola ADRESU danych wyjściowych oznacza to, że ruch przychodzący został wdrożony i jest gotowy do uzyskania dostępu, jak pokazano w poniższych przykładowych danych wyjściowych:
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 2m40s
Wdrażanie interfejsu frontonu
Utwórz nowy plik o nazwie frontend-deploy.yml i wklej następującą specyfikację wdrożenia:
apiVersion: apps/v1 kind: Deployment metadata: name: ship-manager-frontend spec: replicas: 1 selector: matchLabels: app: ship-manager-frontend template: metadata: labels: app: ship-manager-frontend spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-ship-manager:frontend name: ship-manager-frontend imagePullPolicy: Always resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 volumeMounts: - name: config mountPath: /usr/src/app/dist/config.js subPath: config.js volumes: - name: config configMap: name: frontend-config --- apiVersion: v1 kind: ConfigMap metadata: name: frontend-config data: config.js: | const config = (() => { return { 'VUE_APP_BACKEND_BASE_URL': 'http://{YOUR_BACKEND_URL}', } })()
Zastąp symbol zastępczy
{YOUR_BACKEND_URL}
adresem URL nazwy hosta zaplecza API pobranym w poprzedniej sekcji.Zapisz i zamknij plik.
Zastosuj wdrożenie warstwy interfejsu przy użyciu polecenia
kubectl apply
.kubectl apply -f frontend-deploy.yml
Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:
deployment.apps/ship-manager-frontend created configmap/frontend-config created
Następnie możesz utworzyć zasoby sieciowe, które ta aplikacja potrzebuje, aby móc się otworzyć w Internecie.
Utwórz nowy plik o nazwie frontend-network.yml i wklej następującą specyfikację sieci:
apiVersion: v1 kind: Service metadata: name: ship-manager-frontend spec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: app: ship-manager-frontend --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ship-manager-frontend spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: <host-name> http: paths: - backend: service: name: ship-manager-frontend port: number: 80 path: / pathType: Prefix
Zastąp symbol zastępczy
<host-name>
parametrami połączenia pobranymi w poprzedniej sekcji.Zapisz i zamknij plik.
Zastosuj front-endowe wdrożenie sieci przy użyciu polecenia
kubectl apply
.kubectl apply -f frontend-network.yml
Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:
service/ship-manager-frontend created ingress.networking.k8s.io/ship-manager-frontend created
Dostęp do interfejsu API można uzyskać za pomocą nazwy hosta, który wkleiłeś w swoim zasobie wejściowym. Ukończenie wykrywania DNS przez zasób strefy usługi Azure DNS może potrwać do pięciu minut. Jeśli nie możesz od razu uzyskać dostępu do interfejsu API, poczekaj kilka minut i spróbuj ponownie.
Sprawdź stan ingress, zapytując Kubernetes o dostępne ingresses za pomocą polecenia
kubectl get ingress
.kubectl get ingress
Po wypełnieniu pola ADRESU w danych wyjściowych oznacza to, że zasób 'ingress' został wdrożony i jest gotowy do użycia, co pokazano w poniższym przykładowym wyniku.
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 2m40s ship-manager-frontend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 100s
Teraz możesz uzyskać dostęp do adresu URL za pomocą nazwy hosta zasobu wejściowego, aby wejść do aplikacji zarządzania statkiem.