Övning – Värdhantera en ny databas med Hjälp av Azure Cosmos DB
Nu när vi har granskat de grundläggande begreppen för externa tillstånd och hur du hanterar dem med Kubernetes ska vi skapa de resurser som stöder fraktföretagets program och sedan skapa själva programmet.
Skapa en resursgrupp
Viktig
Du behöver en egen Azure-prenumeration för att slutföra den här övningen och du kan debiteras. Om du inte redan har en Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.
Logga in på Azure-portalen med din egen prenumeration.
Öppna Cloud Shell och välj Bash.
Skapa en Azure-resursgrupp med hjälp av kommandot
az group createoch ange en region. I det här exemplet skapas en resursgrupp med namnet rg-ship-manager i regionen eastus :az group create --name rg-ship-manager --location eastusSkapandeprocessen kan ta en stund att slutföra.
Skapa staten
Som vi beskrev tidigare är det möjligt men rekommenderas inte att hantera tillstånd i Kubernetes. Det kan bli för svårt att hantera ett programtillstånd med hög tillgänglighet när du behöver hantera tillståndet själv.
För att lösa det problemet externaliserar vi tillståndet till ett program som är specialiserat på att hantera externt tillstånd: Azure Cosmos DB.
Not
Även om vi skapar en Azure Cosmos DB-instans som en del av de resurser som krävs för att köra programmet är Azure Kubernetes Service (AKS) och Azure Cosmos DB inte relaterade till varandra.
För Azure Cosmos DB kontrollerar du att resursprovidern
Microsoft.DocumentDBär registrerad i din prenumeration.az provider show --namespace Microsoft.DocumentDB --query "registrationState"Om utdata är
NotRegisteredregistrerar du resursprovidern.az provider register --namespace Microsoft.DocumentDBSkapa Bash-variabler för att lagra Azure Cosmos DB-kontonamnet och resursgruppens namn för användning i resten av modulen.
export RESOURCE_GROUP=rg-ship-manager export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOMSkapa ett nytt Azure Cosmos DB-konto med hjälp av kommandot
az cosmosdb create.az cosmosdb create \ --name $COSMOSDB_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP \ --kind MongoDBSkapandeprocessen kan ta en stund att slutföra.
Skapa en ny databas med hjälp av kommandot
az cosmosdb mongodb database create. I det här exemplet heter databasen contoso-ship-manager.az cosmosdb mongodb database create \ --account-name $COSMOSDB_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP \ --name contoso-ship-managerKontrollera att databasen har skapats med hjälp av kommandot
az cosmosdb mongodb database list.az cosmosdb mongodb database list \ --account-name $COSMOSDB_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP \ --output tableDina utdata bör se ut ungefär som följande exempelutdata:
Name ResourceGroup -------------------- --------------- contoso-ship-manager rg-ship-manager
Nu när du har skapat ett externt tillstånd för att lagra alla data från ship manager-programmet ska vi skapa AKS-resursen för att lagra själva programmet.
Skapa AKS-klustret
För AKS kontrollerar du att resursprovidern
Microsoft.ContainerServiceär registrerad i din prenumeration.az provider show --namespace Microsoft.ContainerService --query "registrationState"Om utdata är
NotRegisteredregistrerar du resursprovidern.az provider register --namespace Microsoft.ContainerServiceSkapa en Bash-variabel för att lagra klusternamnet för användning i resten av modulen.
AKS_CLUSTER_NAME=ship-manager-clusterSkapa ett AKS-kluster med hjälp av kommandot
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-app-routingSkapandeprocessen kan ta en stund att slutföra.
Not
Alla Azure-tjänster anger standardgränser och kvoter för resurser och funktioner, inklusive användningsbegränsningar för vissa SKU:er för virtuella datorer. Om du stöter på ett fel som tyder på att den önskade virtuella dator-SKU:n inte är tillgänglig i den region som du har valt måste du förmodligen öka den här kvoten via en Azure-supportbegäran (för Typ av problem väljer du Kvot).
Ladda ned kubectl-konfigurationen med hjälp av kommandot
az aks get-credentials.az aks get-credentials --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUPOm du får några meddelanden om befintliga kluster, till exempel:
A different object named ship-manager-cluster already exists in your kubeconfig file. Overwrite? (y/n):Skriv in
yför att skriva över.Testa konfigurationen med hjälp av kommandot
kubectl get nodes.kubectl get nodesDina utdata bör se ut ungefär som följande exempelutdata:
NAME STATUS ROLES AGE VERSION aks-nodepool1-12345678-vmss000000 Ready <none> 107s v1.33.7 aks-nodepool1-12345678-vmss000001 Ready <none> 104s v1.33.7 aks-nodepool1-12345678-vmss000002 Ready <none> 107s v1.33.7
Distribuera programmet
För att skapa programmet måste du skapa YAML-filerna som ska distribueras till Kubernetes. Du kan skapa filerna på datorn och sedan ladda upp dem till bash-sessionen i Cloud Shell. I Cloud Shell-sessionen väljer du Hantera uppladdning av filer>.
Distribuera backend-API:t
Exportera din Azure Cosmos DB-databasanslutningssträng till en variabel med hjälp av
az cosmosdb keys listkommandot .export COSMOS_CONNECTION_STRING=$(az cosmosdb keys list \ --type connection-strings \ --resource-group $RESOURCE_GROUP \ --name $COSMOSDB_ACCOUNT_NAME \ --query "connectionStrings[0].connectionString" --output tsv)Viktig
Använd inte anslutningssträngar för en produktionsmiljö eftersom anslutningssträngen innehåller känslig information. Mer information finns i säkerhetsöversikten för Azure Cosmos DB.
Skapa en ny fil med namnet backend-deploy.yml och klistra in följande distributionsspecifikation:
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: "${COSMOS_CONNECTION_STRING}" - name: DATABASE_MONGODB_DBNAME value: contoso-ship-managerSpara filen och ladda upp den till Cloud Shell-sessionen genom att välja Hantera filer>Ladda upp.
Använd serverdels-API-distributionen med hjälp av kommandot
kubectl apply.envsubst '${COSMOS_CONNECTION_STRING}' < backend-deploy.yml | kubectl apply -f -Kommandot använder
envsubstför att ersätta${COSMOS_CONNECTION_STRING}platshållaren i YAML-filen med värdet förCOSMOS_CONNECTION_STRINGmiljövariabeln. Strecket (-) i slutet av kommandot instruerarkubectlatt läsa indata från standardindataströmmen. Värdet för variabelnCOSMOS_CONNECTION_STRINGsparas inte i filen som du laddade upp till Cloud Shell.Du bör se ett meddelande som liknar följande exempelutdata:
deployment.apps/ship-manager-backend created
För att göra det här programmet tillgängligt för alla måste du skapa en tjänst och en ingress för att ta hand om trafiken.
Skapa en ny fil med namnet backend-network.yml och klistra in följande nätverksspecifikation:
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: http: paths: - backend: service: name: ship-manager-backend port: number: 80 path: /api pathType: PrefixSpara filen och ladda upp den till Cloud Shell-sessionen genom att välja Hantera filer>Ladda upp.
Använd backend-nätdistributionen med hjälp av kommandot
kubectl apply.kubectl apply -f backend-network.ymlDina utdata bör se ut ungefär som följande exempelutdata:
service/ship-manager-backend created ingress.networking.k8s.io/ship-manager-backend createdDen här ingressen dirigerar begäranden till serverdels-API:et på
/apisökvägen.Kontrollera ingressstatusen genom att fråga Kubernetes om tillgängliga ingresser med hjälp av kommandot
kubectl get ingress.kubectl get ingressNär fältet ADRESS i utdata har fyllts innebär det att ingressen har distribuerats och att den är redo att nås, vilket visas i följande exempelutdata:
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com * xx.xx.xx.xx 80 2m40sVärdet
HOSTSär*eftersom den här ingressen inte anger någonhost:regel. Värdnamn för Ingress är valfria. När du utelämnarhost:matchar ingressen begäranden för ett värdnamn och du kommer åt appen med hjälp av ingressadressen.Lagra ingressadressen i en variabel. Du använder den för front-end-konfigurationen.
export HOST_NAME=$(kubectl get ingress ship-manager-backend -o jsonpath='{.status.loadBalancer.ingress[0].ip}{.status.loadBalancer.ingress[0].hostname}')
Distribuera front-end-gränssnittet
Skapa en ny fil med namnet frontend-deploy.yml och klistra in följande distributionsspecifikation:
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://${HOST_NAME}', } })()Spara filen och ladda upp den till Cloud Shell-sessionen genom att välja Hantera filer>Ladda upp.
Använd frontend-distributionen med kommandot
kubectl apply.envsubst '${HOST_NAME}' < frontend-deploy.yml | kubectl apply -f -Dina utdata bör se ut ungefär som följande exempelutdata:
deployment.apps/ship-manager-frontend created configmap/frontend-config created
Sedan kan du skapa de nätverksresurser som programmet måste vara öppet för webben.
Skapa en ny fil med namnet frontend-network.yml och klistra in följande nätverksspecifikation:
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: http: paths: - backend: service: name: ship-manager-frontend port: number: 80 path: / pathType: PrefixSpara filen och ladda upp den till Cloud Shell-sessionen genom att välja Hantera filer>Ladda upp.
Använd frontend-nätverksimplementeringen med hjälp av kommandot
kubectl apply.kubectl apply -f frontend-network.ymlDina utdata bör se ut ungefär som följande exempelutdata:
service/ship-manager-frontend created ingress.networking.k8s.io/ship-manager-frontend createdDu kan komma åt programmet i webbläsaren med hjälp av
http://$HOST_NAME. Körecho $HOST_NAMEför att visa värdet för variabelnHOST_NAME.Kontrollera ingressstatusen genom att fråga Kubernetes om tillgängliga ingresser med hjälp av kommandot
kubectl get ingress.kubectl get ingressNär fältet ADRESS i utdata fylls innebär det att ingressen har distribuerats och är redo att nås, som du ser i följande exempelutdata:
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com * xx.xx.xx.xx 80 2m40s ship-manager-frontend webapprouting.kubernetes.azure.com * xx.xx.xx.xx 80 100sNu kan du komma åt programmet på
http://$HOST_NAME.
Rensa dina variabler
Det är en bra idé att rensa variabelvärden, särskilt när de innehåller känsliga data som databasanslutningssträngen.
unset COSMOS_CONNECTION_STRING