借助 Kubernetes,可以使用 PaaS 服务(例如 Azure 服务总线)开发和运行应用程序。
在本教程中,你将创建 Azure 服务总线命名空间和队列来测试应用程序。 您将学习如何:
- 创建 Azure 服务总线命名空间和队列。
- 更新 Kubernetes 清单文件以使用 Azure 服务总线队列。
- 通过下单来测试更新后的应用程序。
开始之前
在之前的教程中,你已将应用程序打包到容器映像中、将映像上传到 Azure 容器注册表、创建 Kubernetes 群集并且部署了应用程序。 必须先预创建 aks-store-quickstart.yaml Kubernetes 清单文件,然后才能完成本教程。 此文件下载包含在上一教程中的应用程序源代码中。 确保已克隆存储库,并将目录更改为克隆的存储库。 如果你尚未完成这些步骤且想要继续学习,请从教程 1:为 AKS 准备应用程序开始。
本教程将创建可计费Azure 服务总线资源。 若要完成这些步骤,请使用一个标识,该标识可以创建和管理服务总线资源并更新资源组中的 AKS 工作负荷,例如参与者或所有者。
本教程需要 Azure CLI 版本 2.34.1 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
本教程需要 Azure PowerShell 版本 5.9.0 或更高版本。 运行 Get-InstalledModule -Name Az 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure PowerShell。
创建环境变量
创建 Azure 服务总线命名空间和队列
在之前的教程中,你使用了 RabbitMQ 容器来存储由 order-service 提交的订单。 本教程使用 Azure 服务总线命名空间为应用程序中的服务总线资源提供范围界定容器。 还将使用 Azure 服务总线队列在应用程序组件之间发送和接收消息。 有关 Azure 服务总线的详细信息,请参阅创建 Azure 服务总线命名空间和队列。
在此流中,order-service使用orders在本部分中创建的授权规则和密钥将消息发送到sender队列。
使用Azure CLI创建以下环境变量以用于本教程中的命令。
使用az servicebus namespace create命令创建Azure 服务总线命名空间。
az servicebus namespace create --name $SB_NS --resource-group $RG_NAME --location $LOC_NAME
命令成功完成并返回命名空间详细信息时继续。
使用 az servicebus queue create 命令创建 Azure 服务总线队列。
az servicebus queue create --name orders --resource-group $RG_NAME --namespace-name $SB_NS
在继续操作之前,请验证队列是否存在:
az servicebus queue show --name orders --resource-group $RG_NAME --namespace-name $SB_NS --query name -o tsv
使用 az servicebus queue authorization-rule create 命令创建 Azure 服务总线授权规则。
az servicebus queue authorization-rule create \
--name sender \
--namespace-name $SB_NS \
--resource-group $RG_NAME \
--queue-name orders \
--rights Send
使用 az servicebus namespace show 和 az servicebus queue authorization-rule keys list 命令获取 Azure 服务总线凭据,供将来使用。
az servicebus namespace show --name $SB_NS --resource-group $RG_NAME --query name -o tsv
az servicebus queue authorization-rule keys list --namespace-name $SB_NS --resource-group $RG_NAME --queue-name orders --name sender --query primaryKey -o tsv
保存清单更新步骤的以下值:
-
<REPLACE_WITH_YOUR_ACR_NAME>:前面教程中使用的 Azure 容器注册表 名称。
-
<REPLACE_WITH_YOUR_SB_NS_HOSTNAME>:$SB_NS.servicebus.chinacloudapi.cn。
-
<REPLACE_WITH_YOUR_SB_SENDER_PASSWORD>
primaryKey:命令输出中的值。
使用 az servicebus namespace create 命令创建 Azure 服务总线命名空间。
az servicebus namespace create --name $SB_NS --resource-group $RG_NAME --location $LOC_NAME
命令成功完成并返回命名空间详细信息时继续。
使用 az servicebus queue create 命令创建 Azure 服务总线队列。
az servicebus queue create --name orders --resource-group $RG_NAME --namespace-name $SB_NS
在继续操作之前,请验证队列是否存在。
az servicebus queue show --name orders --resource-group $RG_NAME --namespace-name $SB_NS --query name -o tsv
使用 az servicebus queue authorization-rule create 命令创建 Azure 服务总线授权规则。
az servicebus queue authorization-rule create \
--name sender \
--namespace-name $SB_NS \
--resource-group $RG_NAME \
--queue-name orders \
--rights Send
使用 az servicebus namespace show 和 az servicebus queue authorization-rule keys list 命令获取 Azure 服务总线凭据,供将来使用。
az servicebus namespace show --name $SB_NS --resource-group $RG_NAME --query name -o tsv
az servicebus queue authorization-rule keys list --namespace-name $SB_NS --resource-group $RG_NAME --queue-name orders --name sender --query primaryKey -o tsv
保存清单更新步骤的以下值:
-
<REPLACE_WITH_YOUR_ACR_NAME>:前面教程中使用的 Azure 容器注册表 名称。
-
<REPLACE_WITH_YOUR_SB_NS_HOSTNAME>:$SB_NS.servicebus.chinacloudapi.cn。
-
<REPLACE_WITH_YOUR_SB_SENDER_PASSWORD>
primaryKey:命令输出中的值。
使用 New-AzServiceBusNamespace cmdlet 创建 Azure 服务总线命名空间。
New-AzServiceBusNamespace -Name $SB_NS -ResourceGroupName $RG_NAME -Location $LOC_NAME
命令成功完成并返回命名空间详细信息时继续。
使用 New-AzServiceBusQueue cmdlet 创建 Azure 服务总线队列。
New-AzServiceBusQueue -Name orders -ResourceGroupName $RG_NAME -NamespaceName $SB_NS
在继续操作之前,请验证队列是否存在:
(Get-AzServiceBusQueue -Name orders -ResourceGroupName $RG_NAME -NamespaceName $SB_NS).Name
使用 New-AzServiceBusAuthorizationRule cmdlet 创建 Azure 服务总线授权规则。
New-AzServiceBusAuthorizationRule `
-Name sender `
-NamespaceName $SB_NS `
-ResourceGroupName $RG_NAME `
-QueueName orders `
-Rights Send
使用 Get-AzServiceBusNamespace 和 Get-AzServiceBusKeycmdlet 获取 Azure 服务总线凭据,供将来使用。
(Get-AzServiceBusNamespace -Name $SB_NS -ResourceGroupName $RG_NAME).Name
(Get-AzServiceBusKey -NamespaceName $SB_NS -ResourceGroupName $RG_NAME -Name sender -QueueName orders).PrimaryKey
保存清单更新步骤的以下值:
-
<REPLACE_WITH_YOUR_ACR_NAME>:前面教程中使用的 Azure 容器注册表 名称。
-
<REPLACE_WITH_YOUR_SB_NS_HOSTNAME>:$SB_NS.servicebus.chinacloudapi.cn。
-
<REPLACE_WITH_YOUR_SB_SENDER_PASSWORD>
PrimaryKey:命令输出中的值。
更新 Kubernetes 清单文件
转到 AKS 桌面中的项目,然后选择在上一教程中创建的项目。 my-dev-frontend
选择“ 资源 ”选项卡,然后选择 “工作负荷>部署:订单服务”。
选择 编辑器。
删除现有的 rabbitmq StatefulSet、ConfigMap 和服务部分。 将现有 order-service 部署部分替换为以下内容。 复制并粘贴内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 1
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: order-service
image: <REPLACE_WITH_YOUR_ACR_NAME>.azurecr.cn/aks-store-demo/order-service:latest
ports:
- containerPort: 3000
env:
- name: ORDER_QUEUE_HOSTNAME
value: "<REPLACE_WITH_YOUR_SB_NS_HOSTNAME>" # Example: sb-store-demo-123456.servicebus.chinacloudapi.cn
- name: ORDER_QUEUE_PORT
value: "5671"
- name: ORDER_QUEUE_TRANSPORT
value: "tls"
- name: ORDER_QUEUE_USERNAME
value: "sender"
- name: ORDER_QUEUE_PASSWORD
value: "<REPLACE_WITH_YOUR_SB_SENDER_PASSWORD>"
- name: ORDER_QUEUE_NAME
value: "orders"
- name: FASTIFY_ADDRESS
value: "0.0.0.0"
resources:
requests:
cpu: 1m
memory: 50Mi
limits:
cpu: 75m
memory: 128Mi
startupProbe:
httpGet:
path: /health
port: 3000
failureThreshold: 5
initialDelaySeconds: 20
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 3000
failureThreshold: 3
initialDelaySeconds: 3
periodSeconds: 5
livenessProbe:
httpGet:
path: /health
port: 3000
failureThreshold: 5
initialDelaySeconds: 3
periodSeconds: 3
注意
将敏感信息(如 API 密钥)直接添加到 Kubernetes 清单文件不安全,并且可能会意外提交到代码存储库。 此示例为简单起见添加了它。 对于生产工作负载,请使用托管标识对 Azure 服务总线进行身份验证,或将机密存储在 Azure 密钥保管库 中。
通过选择 “保存并应用”来保留更新。
在继续操作之前,请验证更新 order-service 后的部署是否在工作负荷视图中达到正常状态。
使用 kubectl 命令将 az aks get-credentials 配置为连接到你的群集。
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
在文本编辑器中打开 aks-store-quickstart.yaml 文件。
删除现有的 rabbitmq StatefulSet、ConfigMap 和服务部分。 将现有 order-service 部署部分替换为以下内容:
将 YAML 中的占位符替换为之前保存的值,然后再应用清单。
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 1
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: order-service
image: <REPLACE_WITH_YOUR_ACR_NAME>.azurecr.cn/aks-store-demo/order-service:latest
ports:
- containerPort: 3000
env:
- name: ORDER_QUEUE_HOSTNAME
value: "<REPLACE_WITH_YOUR_SB_NS_HOSTNAME>" # Example: sb-store-demo-123456.servicebus.chinacloudapi.cn
- name: ORDER_QUEUE_USERNAME
value: "sender"
- name: ORDER_QUEUE_PASSWORD
value: "<REPLACE_WITH_YOUR_SB_SENDER_PASSWORD>"
- name: ORDER_QUEUE_NAME
value: "orders"
- name: FASTIFY_ADDRESS
value: "0.0.0.0"
resources:
requests:
cpu: 1m
memory: 50Mi
limits:
cpu: 75m
memory: 128Mi
startupProbe:
httpGet:
path: /health
port: 3000
failureThreshold: 5
initialDelaySeconds: 20
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 3000
failureThreshold: 3
initialDelaySeconds: 3
periodSeconds: 5
livenessProbe:
httpGet:
path: /health
port: 3000
failureThreshold: 5
initialDelaySeconds: 3
periodSeconds: 3
注意
直接将 API 密钥等敏感信息添加到 Kubernetes 清单文件这种做法并不安全,可能会意外地提交到代码存储库。 为简便起见,我们将其添加在此处。 对于生产工作负载,请使用托管标识对 Azure 服务总线进行身份验证,或将机密存储在 Azure 密钥保管库 中。
- 保存并关闭已更新的
aks-store-quickstart.yaml 文件。
使用 Import-AzAksCredential cmdlet 命令将 kubectl 配置为连接到群集。
Import-AzAksCredential -ResourceGroupName myResourceGroup -Name myAKSCluster
在文本编辑器中打开 aks-store-quickstart.yaml 文件。
删除现有的 rabbitmq 部署和服务部分,并将现有 order-service 部署部分替换为以下内容:
将 YAML 中的占位符替换为之前保存的值,然后再应用清单。
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 1
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: order-service
image: <REPLACE_WITH_YOUR_ACR_NAME>.azurecr.cn/aks-store-demo/order-service:latest
ports:
- containerPort: 3000
env:
- name: ORDER_QUEUE_HOSTNAME
value: "<REPLACE_WITH_YOUR_SB_NS_HOSTNAME>" # Example: sb-store-demo-123456.servicebus.chinacloudapi.cn
- name: ORDER_QUEUE_USERNAME
value: "sender"
- name: ORDER_QUEUE_PASSWORD
value: "<REPLACE_WITH_YOUR_SB_SENDER_PASSWORD>"
- name: ORDER_QUEUE_NAME
value: "orders"
- name: FASTIFY_ADDRESS
value: "0.0.0.0"
resources:
requests:
cpu: 1m
memory: 50Mi
limits:
cpu: 75m
memory: 128Mi
注意
直接将 API 密钥等敏感信息添加到 Kubernetes 清单文件这种做法并不安全,可能会意外地提交到代码存储库。 我们为了简单起见把它加在这里。 对于生产工作负载,请使用托管标识对 Azure 服务总线进行身份验证,或将机密存储在 Azure 密钥保管库 中。
- 保存并关闭已更新的
aks-store-quickstart.yaml 文件。
部署更新的应用程序
使用 kubectl apply 命令部署更新的应用程序。
kubectl apply -f aks-store-quickstart.yaml
下面的示例输出说明已成功更新资源:
deployment.apps/order-service configured
service/order-service unchanged
deployment.apps/product-service unchanged
service/product-service unchanged
deployment.apps/store-front configured
service/store-front unchanged
验证更新的部署是否正在运行。
kubectl get pods
当应用程序 Pod 处于 Running 状态时,继续操作。
测试应用程序
示例下单
AKS 桌面
转到资源>网络>服务:store-front>外部 IP即可获取公共 IP 地址。
命令行
使用 store-front 命令获取 kubectl get service 服务的外部 IP 地址。
kubectl get service store-front
EXTERNAL-IP如果是<pending>,请等待一分钟,然后再次运行该命令,直到出现公共 IP 地址。
在浏览器中,使用 store-front 导航到 http://<external-ip> 服务的外部 IP 地址。
通过选择产品并选择“添加到购物车”来下单。
选择“购物车”以查看订单,然后选择“结帐”。
在 Azure 服务总线队列中查看订单
- 导航到 Azure 门户,并打开以前创建的 Azure 服务总线命名空间。
- 在“实体”下,选择“队列”,然后选择“订单”队列。
- 在“订单”队列中,选择“服务总线 Explorer”。
- 选择“从头开始速览”,查看已提交的订单。
后续步骤
本教程使用 Azure 服务总线更新和测试示例应用程序。 你已了解如何执行以下操作:
- 创建 Azure 服务总线命名空间和队列。
- 更新 Kubernetes 清单文件以使用 Azure 服务总线队列。
- 通过下单来测试更新后的应用程序。
下一教程介绍如何在 AKS 中缩放应用程序。