使用 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
接下来,您可以创建使此应用程序可以在网络上访问的网络资源。
创建名为 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,以进入船舶管理器应用程序。