快速入门:使用 Azure 门户部署 Azure Kubernetes 服务 (AKS) 群集

Azure Kubernetes 服务 (AKS) 是可用于快速部署和管理群集的托管式 Kubernetes 服务。 在本快速入门中,请执行以下操作:

  • 使用 Azure 门户部署 AKS 群集。
  • 运行一个示例多容器应用程序,其中的一组微服务和 Web 前端模拟零售场景。

注意

为了开始快速预配 AKS 群集,本文介绍了仅针对评估目的部署具有默认设置的群集的步骤。 在部署生产就绪群集之前,建议熟悉我们的[基线参考体系结构][baseline-reference-architecture],考虑它如何与你的业务需求保持一致。

开始之前

本快速入门假设读者基本了解 Kubernetes 的概念。 有关详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的 Kubernetes 核心概念

创建 AKS 群集

  1. 登录 Azure 门户

  2. 在 Azure 门户主页上,选择“创建资源”。

  3. 在“类别”部分中,选择“容器”>“Azure Kubernetes 服务(AKS)”。

  4. 在“基本信息”选项卡上,配置以下选项:

    • 在“项目详细信息”下
      • 选择一个 Azure 订阅。
      • 创建一个 Azure 资源组,例如“myResourceGroup”。 虽然可以选择现有资源组,但出于测试或评估目的,我们建议创建一个资源组来临时托管这些资源,从而避免影响生产或开发工作负载。
    • 在“群集详细信息”下:
      • 将“群集预设配置”设置为“开发/测试”。 有关预设配置的详细信息,请参阅 Azure 门户中的群集配置预设

        注意

        创建群集时,可以通过选择“比较预设”并选择其他选项来更改预设配置。 创建 AKS 群集的屏幕截图 - 门户预设选项。

      • 输入 Kubernetes 群集名称,例如 myAKSCluster

      • 为 AKS 群集选择一个区域

      • 将“可用性区域”设置为“无”。

      • 将“AKS 定价层”设置为“免费”。

      • 保留为 Kubernetes 版本选择的默认值。

      • 将“自动升级”设置保留为建议的值,即“启用修补程序”。

      • 将“身份验证和授权”设置保留为“使用 Kubernetes RBAC 的本地帐户”。

        显示如何在 Azure 门户中配置 AKS 群集的屏幕截图。

  5. 选择下一步。 在“节点池”选项卡中,添加新节点池:

    • 选择“添加节点池”。

    • 输入节点池名称,例如“nplinux”。

    • 对于“模式”,选择“用户”。

    • 对于 OS SKU,请选择 Ubuntu Linux。

    • 将“可用性区域”设置为“无”。

    • 将“启用 Azure 现成虚拟机实例”复选框保留为取消选中。

    • 对于“节点大小”,请选择“选择大小”。 在“选择 VM 大小”页上,选择“D2s_v3”,然后选择“选择”按钮。

    • 将“缩放方法”设置保留为“自动缩放”。

    • 将“最小节点计数”、“最大节点计数”字段保留为默认设置。

      显示如何创建运行 Ubuntu Linux 的节点池的屏幕截图。

  6. 将其他选项卡上的所有设置保留为其默认设置,“监视”选项卡上的设置除外。默认情况下,启用 Azure Monitor 功能容器见解、Prometheus 的 Azure Monitor 托管服务和 Azure 托管 Grafana。 可以通过禁用来节省成本。

  7. 选择“查看 + 创建”以在群集配置上运行验证。 验证完成后,选择“创建”以创建 AKS 群集。

创建 AKS 群集需要几分钟时间。 部署完成后,通过以下任一方式导航到你的资源:

  • 选择“转到资源”,或
  • 浏览到 AKS 群集资源组并选择 AKS 资源。 在此示例中,你将浏览 myResourceGroup 并选择资源 myAKSCluster

连接到群集

若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl

  1. 使用 az aks get-credentials 命令将 kubectl 配置为连接到你的 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. 使用 kubectl get 命令返回群集节点的列表,以此验证与群集之间的连接。

    kubectl get nodes
    

    以下示例输出显示在上一步创建的单个节点。 确保节点状态为“就绪”。

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-31718369-0   Ready    agent   6m44s   v1.15.10
    

部署应用程序

若要部署应用程序,请使用清单文件创建运行 AKS 应用商店应用程序所需的所有对象。 Kubernetes 清单文件定义群集的所需状态,例如,要运行哪些容器映像。 该清单包含以下 Kubernetes 部署和服务:

Azure 应用商店示例体系结构的屏幕截图。

  • 门店:Web 应用程序,供客户查看产品和下单。
  • 产品服务:显示产品信息。
  • 订单服务:下单。
  • Rabbit MQ:订单队列的消息队列。

注意

不建议在没有持久性存储用于生产的情况下,运行有状态容器(例如 Rabbit MQ)。 为简单起见,建议使用托管服务,例如 Azure CosmosDB 或 Azure 服务总线。

  1. 在本地 Shell 中,打开编辑器并创建一个名为 aks-store-quickstart.yaml 的文件。

  2. 将以下清单粘贴到编辑器中:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rabbitmq
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "password"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    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: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "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
          initContainers:
          - name: wait-for-rabbitmq
            image: busybox
            command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;']
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 1m
                memory: 7Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env:
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

    有关 YAML 清单文件的明细,请参阅部署和 YAML 清单

  3. 使用 kubectl apply 命令部署应用程序,并指定 YAML 清单的名称:

    kubectl apply -f aks-store-quickstart.yaml
    

    以下示例输出显示部署和服务:

    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    

测试应用程序

应用程序运行时,Kubernetes 服务将向 Internet 公开应用程序前端。 此过程可能需要几分钟才能完成。

  1. 使用 kubectl get pods 命令查看已部署的 Pod 的状态。 在继续操作之前,将所有 Pod 都设置为 Running

    kubectl get pods
    
  2. 检查应用商店前端应用程序的公共 IP 地址。 使用带有 --watch 参数的 kubectl get service 命令来监视进度。

    kubectl get service store-front --watch
    

    store-front 服务的 EXTERNAL-IP 输出最初显示为“pending”

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    

    EXTERNAL-IP 地址从 pending 更改为实际公共 IP 地址后,请使用 CTRL-C 来停止 kubectl 监视进程。

    以下示例输出显示向服务分配了有效的公共 IP 地址:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  3. 打开 Web 浏览器并转到服务的外部 IP 地址,以查看 Azure 应用商店应用的实际效果。

    AKS 应用商店示例应用程序的屏幕截图。

删除群集

如果不打算完成 AKS 教程,请清理不必要的资源以避免产生 Azure 费用。

  1. 在 Azure 门户中导航到你的 AKS 群集资源组。

  2. 选择“删除资源组”。

  3. 输入要删除的资源组的名称,然后选择“删除”>“删除”

    注意

    AKS 群集是使用系统分配的托管标识创建的。 此标识由平台管理,不需要删除。

后续步骤

在本快速入门中,你部署了一个 Kubernetes 群集,然后在其中部署了示例多容器应用程序。 此示例应用程序仅用于演示目的,并未展示出 Kubernetes 应用程序的所有最佳做法。

若要详细了解 AKS 并演练完整的代码到部署示例,请继续阅读 Kubernetes 群集教程。