使用 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 服务 (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
部署应用
若要创建应用程序,需创建要部署到 Kubernetes 的 YAML 文件。
部署后端 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,以进入船舶管理器应用程序。