Hostování nové databáze pomocí služby Azure Cosmos DB
Teď, když jsme si prostudovali základní koncepty externích států a jak s nimi pracovat pomocí Kubernetes, vytvoříme prostředky, které budou podporovat aplikaci vaší přepravní společnosti, a pak vytvoříme samotnou aplikaci.
Vytvoření skupiny zdrojů
Důležité
K provedení tohoto cvičení potřebujete vlastní předplatné Azure a mohou se vám účtovat poplatky. Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet, než začnete.
Přihlaste se k webu Azure Portal pomocí vlastního předplatného.
Otevřete Cloud Shell a vyberte Bash.
Pomocí příkazu vytvořte skupinu
az group create
prostředků Azure a zadejte oblast. Tento příklad vytvoří skupinu prostředků s názvem rg-ship-manager v oblasti eastus :az group create --name rg-ship-manager --location eastus
Dokončení procesu vytvoření může chvíli trvat.
Vytvoření stavu
Jak jsme popsali dříve, je možné, ale nedoporučujeme zpracovávat stav v Kubernetes. Správa stavu aplikace s vysokou dostupností může být příliš obtížná, když potřebujete spravovat stav sami.
Abychom tento problém vyřešili, externalizujeme stav do aplikace, která se specializuje na práci s externím stavem: Azure Cosmos DB.
Poznámka:
I když vytváříme instanci Azure Cosmos DB jako součást požadovaných prostředků k běhu aplikace, služby Azure Kubernetes (AKS) a Azure Cosmos DB spolu vzájemně nesouvisí.
Vytvořte proměnné Bash pro uložení názvu účtu služby Azure Cosmos DB a názvu skupiny prostředků pro použití ve zbytku modulu.
export RESOURCE_GROUP=rg-ship-manager export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
Pomocí příkazu vytvořte nový účet
az cosmosdb create
služby Azure Cosmos DB.az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
Dokončení procesu vytvoření může chvíli trvat.
Pomocí příkazu vytvořte novou databázi
az cosmosdb mongodb database create
. V tomto příkladu se databáze jmenuje contoso-ship-manager.az cosmosdb mongodb database create --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --name contoso-ship-manager
Pomocí příkazu ověřte, že se databáze úspěšně vytvořila
az cosmosdb mongodb database list
.az cosmosdb mongodb database list --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP -o table
Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:
Name ResourceGroup -------------------- --------------- contoso-ship-manager rg-ship-manager
Teď, když jste vytvořili externí stav pro uložení všech dat z aplikace správce expedice, vytvoříme prostředek AKS pro uložení samotné aplikace.
Vytvoření clusteru AKS
Vytvořte proměnnou Bash pro uložení názvu clusteru pro použití ve zbytku modulu.
AKS_CLUSTER_NAME=ship-manager-cluster
Pomocí příkazu vytvořte cluster
az aks create
AKS.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
Dokončení procesu vytvoření může chvíli trvat.
Poznámka:
Všechny služby Azure nastavují výchozí limity a kvóty pro prostředky a funkce, včetně omezení využití pro určité skladové položky virtuálního počítače. Pokud dojde k chybě s návrhem požadované skladové položky virtuálního počítače v oblasti, kterou jste vybrali, pravděpodobně budete muset tuto kvótu zvýšit prostřednictvím požadavku podpora Azure (pro typ problému vyberte Kvóta).
Pomocí příkazu stáhněte konfiguraci
az aks get-credentials
kubectl.az aks get-credentials --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP
Pokud dostanete nějaké zprávy o existujících clusterech, například:
A different object named ship-manager-cluster already exists in your kubeconfig file. Overwrite? (y/n):
Chcete-li přepsat, zadejte
y
.Otestujte konfiguraci pomocí
kubectl get nodes
příkazu.kubectl get nodes
Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:
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
Nasazení aplikace
Pokud chcete vytvořit aplikaci, musíte vytvořit soubory YAML pro nasazení do Kubernetes.
Nasazení rozhraní API back-endu
Získejte databázi Azure Cosmos DB připojovací řetězec pomocí
az cosmosdb keys list
příkazu.az cosmosdb keys list --type connection-strings -g $RESOURCE_GROUP -n $COSMOSDB_ACCOUNT_NAME --query "connectionStrings[0].connectionString" -o tsv
Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:
mongodb://contoso-ship-manager-12345678.documents.azure.com:10255/?ssl=true&replicaSet=globaldb
Vytvořte nový soubor s názvem backend-deploy.yml a vložte následující specifikaci nasazení:
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
{your database connection string}
Zástupný symbol nahraďte databází připojovací řetězec, kterou jste získali v předchozím kroku.Poznámka:
Nezapomeňte do proměnných prostředí přidat uvozovky
"
, protože připojovací řetězec někdy představují neplatné znaky YAML. Můžete zvážit použití tajných kódů jako bezpečného způsobu ukládání a načítání připojovací řetězec v AKS.Soubor uložte a zavřete.
Použijte nasazení back-endového rozhraní API pomocí
kubectl apply
příkazu.kubectl apply -f backend-deploy.yml
Měla by se zobrazit zpráva podobná následujícímu příkladu výstupu:
deployment.apps/ship-manager-backend created
Pokud chcete tuto aplikaci zpřístupnit všem, musíte vytvořit službu a příchozí přenos dat, aby se o provoz postaral.
Pomocí příkazu získejte adresu serveru rozhraní API clusteru
az aks show
.az aks show -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME -o tsv --query fqdn
Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:
ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io
Vytvořte nový soubor s názvem backend-network.yml a vložte následující specifikaci sítě:
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
<host-name>
Zástupný symbol nahraďte připojovací řetězec, který jste získali v předchozím kroku.Soubor uložte a zavřete.
Použijte nasazení back-endové sítě pomocí
kubectl apply
příkazu.kubectl apply -f backend-network.yml
Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:
service/ship-manager-backend created ingress.networking.k8s.io/ship-manager-backend created
S rozhraním API můžete pracovat prostřednictvím názvu hostitele, který jste vložili do prostředku příchozího přenosu dat. Dokončení detekce DNS může prostředku zóny Azure DNS trvat až pět minut. Pokud nemůžete získat přístup k rozhraní API hned, počkejte pár minut a zkuste to znovu.
Pomocí příkazu zkontrolujte stav příchozího přenosu dat dotazováním Kubernetes na dostupné příchozí přenosy
kubectl get ingress
dat.kubectl get ingress
Jakmile se vyplní pole ADDRESS ve výstupu, znamená to, že se nasadí příchozí přenos dat a je připravený k přístupu, jak je znázorněno v následujícím příkladu výstupu:
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
Nasazení rozhraní front-endu
Vytvořte nový soubor s názvem frontend-deploy.yml a vložte následující specifikaci nasazení:
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}', } })()
{YOUR_BACKEND_URL}
Zástupný symbol nahraďte adresou URL názvu hostitele back-endového rozhraní API, které jste získali v předchozí části.Soubor uložte a zavřete.
Použijte front-endové nasazení pomocí
kubectl apply
příkazu.kubectl apply -f frontend-deploy.yml
Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:
deployment.apps/ship-manager-frontend created configmap/frontend-config created
Dále můžete vytvořit síťové prostředky, které tato aplikace musí být otevřená pro web.
Vytvořte nový soubor s názvem frontend-network.yml a vložte následující specifikaci sítě:
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
<host-name>
Zástupný symbol nahraďte připojovací řetězec, který jste získali v předchozí části.Soubor uložte a zavřete.
Použijte front-endové síťové nasazení pomocí
kubectl apply
příkazu.kubectl apply -f frontend-network.yml
Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:
service/ship-manager-frontend created ingress.networking.k8s.io/ship-manager-frontend created
S rozhraním API můžete pracovat prostřednictvím názvu hostitele, který jste vložili do prostředku příchozího přenosu dat. Dokončení detekce DNS může prostředku zóny Azure DNS trvat až pět minut. Pokud nemůžete získat přístup k rozhraní API hned, počkejte pár minut a zkuste to znovu.
Pomocí příkazu zkontrolujte stav příchozího přenosu dat dotazováním Kubernetes na dostupné příchozí přenosy
kubectl get ingress
dat.kubectl get ingress
Jakmile se vyplní pole ADDRESS ve výstupu, znamená to, že se nasadí příchozí přenos dat a je připravený k přístupu, jak je znázorněno v následujícím příkladu výstupu:
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
Teď můžete k adrese URL přistupovat z názvu hostitele prostředku příchozího přenosu dat a vstoupit do aplikace pro správu lodí.