教程:将 PaaS 服务与 Azure Kubernetes 服务 (AKS) 群集配合使用

借助 Kubernetes,可以使用 PaaS 服务(例如 Azure 服务总线)开发和运行应用程序。

在本教程中,你将创建 Azure 服务总线命名空间和队列来测试应用程序。 您将学习如何:

  • 创建 Azure 服务总线命名空间和队列。
  • 更新 Kubernetes 清单文件以使用 Azure 服务总线队列。
  • 通过下单来测试更新后的应用程序。

开始之前

在之前的教程中,你已将应用程序打包到容器映像中、将映像上传到 Azure 容器注册表、创建 Kubernetes 群集并且部署了应用程序。 必须先预创建 aks-store-quickstart.yaml Kubernetes 清单文件,然后才能完成本教程。 此文件下载包含在上一教程中的应用程序源代码中。 确保已克隆存储库,并将目录更改为克隆的存储库。 如果你尚未完成这些步骤且想要继续学习,请从教程 1:为 AKS 准备应用程序开始。

本教程将创建可计费Azure 服务总线资源。 若要完成这些步骤,请使用一个标识,该标识可以创建和管理服务总线资源并更新资源组中的 AKS 工作负荷,例如参与者所有者

本教程需要安装 AKS 桌面

创建环境变量

  • 使用Azure CLI创建以下环境变量以用于本教程中的命令:

    LOC_NAME=westus2
    RAND=$RANDOM
    RG_NAME=myResourceGroup
    AKS_NAME=myAKSCluster
    SB_NS=sb-store-demo-$RAND
    

创建 Azure 服务总线命名空间和队列

在之前的教程中,你使用了 RabbitMQ 容器来存储由 order-service 提交的订单。 本教程使用 Azure 服务总线命名空间为应用程序中的服务总线资源提供范围界定容器。 还将使用 Azure 服务总线队列在应用程序组件之间发送和接收消息。 有关 Azure 服务总线的详细信息,请参阅创建 Azure 服务总线命名空间和队列

在此流中,order-service使用orders在本部分中创建的授权规则和密钥将消息发送到sender队列。

使用Azure CLI创建以下环境变量以用于本教程中的命令。

  1. 使用az servicebus namespace create命令创建Azure 服务总线命名空间。

    az servicebus namespace create --name $SB_NS --resource-group $RG_NAME --location $LOC_NAME
    

    命令成功完成并返回命名空间详细信息时继续。

  2. 使用 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
    
  3. 使用 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
    
  4. 使用 az servicebus namespace showaz 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:命令输出中的值。

更新 Kubernetes 清单文件

  1. 转到 AKS 桌面中的项目,然后选择在上一教程中创建的项目。 my-dev-frontend

  2. 选择“ 资源 ”选项卡,然后选择 “工作负荷>部署:订单服务”。 显示编辑部署、资源、工作负载、部署、订单服务的屏幕截图。

  3. 选择 编辑器

  4. 删除现有的 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
    

    显示使用编辑器更新 YAML 部署的屏幕截图。

    注意

    将敏感信息(如 API 密钥)直接添加到 Kubernetes 清单文件不安全,并且可能会意外提交到代码存储库。 此示例为简单起见添加了它。 对于生产工作负载,请使用托管标识对 Azure 服务总线进行身份验证,或将机密存储在 Azure 密钥保管库 中。

  5. 通过选择 “保存并应用”来保留更新。

  6. 在继续操作之前,请验证更新 order-service 后的部署是否在工作负荷视图中达到正常状态。

部署更新的应用程序

  1. 使用 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
    
  2. 验证更新的部署是否正在运行。

    kubectl get pods
    

当应用程序 Pod 处于 Running 状态时,继续操作。

测试应用程序

示例下单

AKS 桌面

转到资源>网络>服务:store-front>外部 IP即可获取公共 IP 地址。

显示获取外部 IP 地址的屏幕截图。

命令行

  1. 使用 store-front 命令获取 kubectl get service 服务的外部 IP 地址。

    kubectl get service store-front
    

    EXTERNAL-IP如果是<pending>,请等待一分钟,然后再次运行该命令,直到出现公共 IP 地址。

  2. 在浏览器中,使用 store-front 导航到 http://<external-ip> 服务的外部 IP 地址。

  3. 通过选择产品并选择“添加到购物车”来下单

  4. 选择“购物车”以查看订单,然后选择“结帐”

在 Azure 服务总线队列中查看订单

  1. 导航到 Azure 门户,并打开以前创建的 Azure 服务总线命名空间。
  2. 在“实体”下,选择“队列”,然后选择“订单”队列
  3. 在“订单”队列中,选择“服务总线 Explorer”
  4. 选择“从头开始速览”,查看已提交的订单

后续步骤

本教程使用 Azure 服务总线更新和测试示例应用程序。 你已了解如何执行以下操作:

  • 创建 Azure 服务总线命名空间和队列。
  • 更新 Kubernetes 清单文件以使用 Azure 服务总线队列。
  • 通过下单来测试更新后的应用程序。

下一教程介绍如何在 AKS 中缩放应用程序。