使用 Azure Cosmos DB 裝載新的資料庫
現在我們已檢閱外部狀態的基本概念,以及如何使用 Kubernetes 來處理這些狀態,接下來讓我們建立將支援您的貨運公司應用程式的資源,然後建立應用程式本身。
建立資源群組
重要
您必須有自己的 Azure 訂用帳戶才能執行本練習,且可能會產生費用。 如果您還沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
使用您自己的訂用帳戶登入 Azure 入口網站。
開啟 Cloud Shell,然後選取 Bash。
使用
az group create
命令來建立 Azure 資源群組並指定一個地區。 此範例會在 eastus 地區中建立一個名為 rg-ship-manager 的資源群組:az group create --name rg-ship-manager --location eastus
完成此建立程序可能需要一些時間。
建立狀態
如我們之前所描述的,可以但不建議在 Kubernetes 中處理狀態。 當您需要自己管理狀態時,管理高度可用的應用程式狀態可能會變得太困難。
為了解決這個問題,我們會將狀態外部化到專門處理外部狀態的應用程式:Azure Cosmos DB。
注意
雖然我們會建立 Azure Cosmos DB 執行個體作為執行應用程式時的必要資源,但 Azure Kubernetes Service (AKS) 與 Azure Cosmos DB 彼此並「不」相關。
建立 Bash 變數來儲存 Azure Cosmos DB 帳戶名稱和資源群組名稱,以便在本課程模組的其餘部分中使用。
export RESOURCE_GROUP=rg-ship-manager export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
使用
az cosmosdb create
命令建立新的 Azure Cosmos DB 帳戶。az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
完成此建立程序可能需要一些時間。
使用
az cosmosdb mongodb database create
命令建立新的資料庫。 在此範例中,資料庫的名稱為 contoso-ship-manager。az cosmosdb mongodb database create --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --name contoso-ship-manager
確認資料庫已使用
az cosmosdb mongodb database list
命令建立成功。az cosmosdb mongodb database list --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP -o table
您的輸出看起來應類似下列的範例輸出:
Name ResourceGroup -------------------- --------------- contoso-ship-manager rg-ship-manager
現在已建立外部狀態以儲存來自船隻管理員應用程式的所有資料。接下來我們開始建立 AKS 資源以儲存應用程式本身。
建立 AKS 叢集
建立 Bash 變數來儲存叢集名稱,以便在本課程模組的其餘部分中使用。
AKS_CLUSTER_NAME=ship-manager-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
完成此建立程序可能需要一些時間。
注意
所有 Azure 服務都會為資源和功能設定預設限制和配額,包括特定虛擬機器 (VM) SKU 的使用限制。 如果您遇到錯誤,提示您所需的 VM SKU 在您所選的地區中未提供,您最可能需要透過 Azure 支援要求來增加此配額 (針對問題類型,請選取 [配額])。
使用
az aks get-credentials
命令下載 kubectl 設定。az aks get-credentials --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP
如果您收到有關現有叢集的任何訊息,例如:
A different object named ship-manager-cluster already exists in your kubeconfig file. Overwrite? (y/n):
輸入
y
以覆寫。使用
kubectl get nodes
命令測試設定。kubectl get nodes
您的輸出看起來應類似下列的範例輸出:
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
部署應用程式
若要建立應用程式,您必須建立 YAML 檔案來部署至 Kubernetes。
部署後端 API
使用
az cosmosdb keys list
命令來取得您的 Azure Cosmos DB 資料庫連接字串。az cosmosdb keys list --type connection-strings -g $RESOURCE_GROUP -n $COSMOSDB_ACCOUNT_NAME --query "connectionStrings[0].connectionString" -o tsv
您的輸出看起來應類似下列的範例輸出:
mongodb://contoso-ship-manager-12345678.documents.azure.com:10255/?ssl=true&replicaSet=globaldb
建立一個名為 backend-deploy.yml 的新檔案,並貼上下列部署規格:
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}
預留位置取代為您在上一個步驟中擷取的資料庫連接字串。注意
因為連接字串有時會出現無效的 YAML 字元,所以請別忘了為環境變數加上引號
"
。 您可以考慮使用秘密作為在 AKS 中儲存和擷取連接字串的安全方式。儲存並關閉檔案。
使用
kubectl apply
命令來套用後端 API 部署。kubectl apply -f backend-deploy.yml
您應該會看到類似下列範例輸出的訊息:
deployment.apps/ship-manager-backend created
若要讓此應用程式可供所有人使用,您需要建立一個服務和一個輸入來處理流量。
使用
az aks show
命令來取得您的叢集 API 伺服器位址。az aks show -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME -o tsv --query fqdn
您的輸出看起來應類似下列的範例輸出:
ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io
建立一個名為 backend-network.yml 的新檔案,並貼上下列網路連接規格:
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>
預留位置取代為您在上一個步驟中擷取的連接字串。儲存並關閉檔案。
使用
kubectl apply
命令來套用後端網路部署。kubectl apply -f backend-network.yml
您的輸出看起來應類似下列的範例輸出:
service/ship-manager-backend created ingress.networking.k8s.io/ship-manager-backend created
您可透過貼到輸入資源的主機名稱存取 API。 Azure DNS 區域資源最多可能需要五分鐘的時間才能完成 DNS 偵測。 如果無法立即存取 API,請稍候幾分鐘,然後再試一次。
使用
kubectl get ingress
命令來查詢 Kubernetes 中可用的輸入以檢查輸入狀態。kubectl get ingress
一旦輸出中的 ADDRESS 欄位已填寫,這表示輸入已經部署且已備妥可以存取,如以下範例輸出所示:
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
部署前端介面
建立一個名為 frontend-deploy.yml 的新檔案,並貼上下列部署規格:
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}
預留位置取代為您在上一節中擷取之後端 API 的主機名稱 URL。儲存並關閉檔案。
使用
kubectl apply
命令來套用前端部署。kubectl apply -f frontend-deploy.yml
您的輸出看起來應類似下列的範例輸出:
deployment.apps/ship-manager-frontend created configmap/frontend-config created
接下來,您可以建立此應用程式需要對 Web 開放的網路資源。
建立一個名為 frontend-network.yml 的新檔案,並貼上下列網路連接規格:
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>
預留位置取代為您在上一節中擷取的連接字串。儲存並關閉檔案。
使用
kubectl apply
命令來套用前端網路部署。kubectl apply -f frontend-network.yml
您的輸出看起來應類似下列的範例輸出:
service/ship-manager-frontend created ingress.networking.k8s.io/ship-manager-frontend created
您可透過貼到輸入資源的主機名稱存取 API。 Azure DNS 區域資源最多可能需要五分鐘的時間才能完成 DNS 偵測。 如果無法立即存取 API,請稍候幾分鐘,然後再試一次。
使用
kubectl get ingress
命令來查詢 Kubernetes 中可用的輸入以檢查輸入狀態。kubectl get ingress
一旦輸出中的 ADDRESS 欄位已填寫,這表示輸入已經部署且已備妥可以存取,如以下範例輸出所示:
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
您現在可透過輸入資源的主機名稱存取 URL,並進入船隻管理員應用程式。