教程 - 准备用于 Azure Kubernetes 服务 (AKS) 的应用程序

Tip

简短回答:快速生成基础配置可使用 Kompose,进行更广泛的现代化改造可使用 Move2Kube;如果你使用 Docker Desktop,可使用 Docker Compose Bridge;若要从正在运行的容器或 Pod 中导出,可使用 Podman。 然后使用 HelmKustomize 将结果打包,并使用 SkaffoldTilt 进行迭代。

顶级工具:Kompose、Move2Kube、Docker Compose Bridge、Podman、Helm、Kustomize、Skaffold、Tilt 和 AI 辅助转换。

在本教程中,我们准备一个在 Kubernetes 中使用的多容器应用程序。 无论是从新的示例应用开始,还是为计划迁移到Azure Kubernetes 服务 (AKS)的应用调整 Docker Compose 概念,都可以使用本教程。 使用 Docker Compose 之类的现有开发工具在本地生成和测试应用程序。 您将学习如何:

  • 克隆 GitHub 中的示例应用程序源。
  • 根据示例应用程序源创建容器映像
  • 在本地 Docker 环境中测试多容器应用程序。

Important

要从头开始吗? 使用本教程准备和测试 AKS 的示例应用。 已在使用 Docker Compose? 请参阅有关将 Docker Compose 迁移到 Kubernetes的 Kubernetes 文档以及 AKS 迁移概述,以获取更广泛的规划指导。

完成后,以下应用程序会在本地开发环境中运行:

显示 Azure Store Front 应用的屏幕截图,该应用在本地运行并在本地 Web 浏览器中打开。

在后面的教程中,将此容器映像上传到 Azure 容器注册表 (ACR),然后部署到 AKS 群集中。

开始之前

本教程假定你基本了解核心 Docker 概念,如容器、容器映像和 docker 命令。 有关容器的入门基础知识,请参阅 Docker 入门

若要完成本教程,需要运行 Linux 容器的本地 Docker 开发环境。 Docker 提供的包可在 MacWindowsLinux 系统上配置 Docker。

注意

Azure 本地 Shell 不包括完成这些教程中每个步骤所需的 Docker 组件。 因此,我们建议使用完整的 Docker 开发环境。


获取应用程序代码

本教程中使用的示例应用程序是一个基本的应用商店前端应用,包括以下 Kubernetes 部署和服务:

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

  • 门店:Web 应用程序,供客户查看产品和下单。
  • 产品服务:显示产品信息。
  • 订单服务:负责下单。
  • RabbitMQ:用于订单队列的消息队列。
  1. 在计算机上创建一个目录,并在终端中切换到该目录,如 Bash。 此示例使用名为 Demorepo 的目录,但可以使用所需的任何名称。

    mkdir demorepo
    cd demorepo
    
  2. 使用 git 可将示例应用程序克隆到开发环境。

    git clone https://github.com/Azure-Samples/aks-store-demo.git
    
  3. 切换到克隆目录。

    cd aks-store-demo
    

查看 Docker Compose 文件

你在本教程中创建的示例应用程序使用存储库中你克隆的 docker-compose-quickstart YAML 文件

下表汇总了示例 Compose 文件中的关键默认值,以便快速查看本教程使用的哪些服务、端口和依赖项:

Service Source 公开的端口 密钥设置
RabbitMQ rabbitmq:4.3.2-management-alpine 图像 156725672 默认用户名 username、密码 password
订单服务 src/order-service 3000 通过端口 5672 连接到 RabbitMQ,并使用队列 orders
产品服务 src/product-service 3002 使用 AI_SERVICE_URL=http://ai-service:5001/
Microsoft Store Front src/store-front 8080 3002 上调用产品服务,并在 3000 上调用订单服务
services:
  rabbitmq:
    image: rabbitmq:4.3.2-management-alpine
    container_name: 'rabbitmq'
    restart: always
    environment:
      - "RABBITMQ_DEFAULT_USER=username"
      - "RABBITMQ_DEFAULT_PASS=password"
    ports:
      - 15672:15672
      - 5672:5672
    healthcheck:
      test: ["CMD", "rabbitmqctl", "status"]
      interval: 30s
      timeout: 10s
      retries: 5
    networks:
      - backend_services
  order-service:
    build: src/order-service
    container_name: 'order-service'
    restart: always
    ports:
      - 3000:3000
    healthcheck:
      test: ["CMD", "wget", "-O", "/dev/null", "-q", "http://order-service:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 5
    environment:
      - ORDER_QUEUE_HOSTNAME=rabbitmq
      - ORDER_QUEUE_PORT=5672
      - ORDER_QUEUE_USERNAME=username
      - ORDER_QUEUE_PASSWORD=password
      - ORDER_QUEUE_NAME=orders
    networks:
      - backend_services
    depends_on:
      rabbitmq:
        condition: service_healthy
  product-service:
    build: src/product-service
    container_name: 'product-service'
    restart: always
    ports:
      - 3002:3002
    healthcheck:
      test: ["CMD", "wget", "-O", "/dev/null", "-q", "http://product-service:3002/health"]
      interval: 30s
      timeout: 10s
      retries: 5
    environment:
      - AI_SERVICE_URL=http://ai-service:5001/
    networks:
      - backend_services
  store-front:
    build: src/store-front
    container_name: 'store-front'
    restart: always
    ports:
      - 8080:8080
    healthcheck:
      test: ["CMD", "wget", "-O", "/dev/null", "-q", "http://store-front:80/health"]
      interval: 30s
      timeout: 10s
      retries: 5
    environment:
      - VUE_APP_PRODUCT_SERVICE_URL=http://product-service:3002/
      - VUE_APP_ORDER_SERVICE_URL=http://order-service:3000/
    networks:
      - backend_services
    depends_on:
      - product-service
      - order-service
networks:
  backend_services:
    driver: bridge

创建容器映像并运行应用程序

可以使用 Docker Compose 自动生成容器映像和部署多容器应用程序。

在运行以下命令之前,请确保 Docker 在 Linux 容器模式下运行。

  1. 从克隆 aks-store-demo 存储库的根目录创建容器映像,下载 RabbitMQ 映像,并使用 docker compose 以下命令启动应用程序:

    docker compose -f docker-compose-quickstart.yml up -d
    
  2. 使用 docker images 命令查看创建的映像。

    docker images
    

    以下精简示例输出显示了创建的映像:

    REPOSITORY                        TAG                          IMAGE ID
    aks-store-demo-product-service    latest                       72f5cd7e6b84
    aks-store-demo-order-service      latest                       54ad5de546f9
    aks-store-demo-store-front        latest                       1125f85632ae
    ...
    
  3. 使用 docker ps 命令查看正在运行的容器。

    docker ps
    

    以下精简示例输出显示了四个正在运行的容器:

    CONTAINER ID        IMAGE
    f27fe74cfd0a        aks-store-demo-product-service
    df1eaa137885        aks-store-demo-order-service
    b3ce9e496e96        aks-store-demo-store-front
    31df28627ffa        rabbitmq:4.3.2-management-alpine
    

在本地测试应用程序

若要查看正在运行的应用程序,请导航到本地 Web 浏览器中的 http://localhost:8080。 示例应用程序会加载,如以下示例所示:

显示 Azure Store Front 应用的屏幕截图,该应用在本地浏览器中打开。

在此页上,可以查看产品,将其添加到购物车,然后下订单。

迁移自己的 Compose 文件

如果已在 Docker Compose 文件中定义了应用程序,则可以使用本教程作为本地验证的参考,然后将现有 Compose 配置转换为 Kubernetes 清单。 使用 KomposeMove2KubeDocker Compose BridgePodman 等工具将 Docker Compose 定义转换为 Kubernetes 资源。 有关完整的端到端转换路径,请参阅 Kubernetes 文档,了解如何将 Docker Compose 迁移到 Kubernetes ,以及 AKS 迁移概述 (如果还要从另一个业务流程协调程序或现代化工作流迁移)。

选择转换工具

如果需要快速比较最常见的 Compose 到 Kubernetes 选项,请使用此表。

工具 单行摘要
Kompose Fast Compose-to-Kubernetes 脚手架;运行 kompose convert;预计需要对存储和探针进行手动清理。
Move2Kube 更广泛的现代化工作流程;运行 move2kube plan -s ./path && move2kube transform;比单文件转换器更重量级。
Docker Compose Bridge 面向 Docker 桌面的转换路径;运行 docker compose bridge convert -o ./k8s/;有关当前支持详细信息,请参阅 Docker 文档。
Podman 从正在运行的容器或 Pod 中导出 YAML;运行 podman kube generate mypod > k8s.yaml;最适用于基于 Podman 的工作流。
Helm 用于重复部署的模板和包清单;请运行 helm create mychart;最好在转换后进行。
Kustomize 叠加特定于环境的更改;运行 kubectl apply -k .;最好在转换后执行。
Skaffold 生成 Kubernetes 内部开发循环;run skaffold init; 不是直接转换器。
倾斜 本地 Kubernetes 开发的实时更新;运行 tilt up;需要采用以 Kubernetes 为中心的工作流。
AI辅助转换 借助 AI 起草或比较清单,然后在部署前验证输出结果。

我应该选择哪种工具?

  • 如果你想快速进行概念验证或获取入门清单文件,可使用 Kompose
  • 如果您使用 Docker Desktop,并且希望采用原生 Docker 方案,请使用 Docker Compose Bridge
  • 如果你有更大的多服务迁移或现代化工作,请使用 Move2Kube
  • 如果要从正在运行的容器或 Pod 中导出,请使用 Podman
  • 如果已有清单,并且需要打包或覆盖,请使用 HelmKustomize
  • 如果在转换后需要本地 Kubernetes 开发循环,请使用 SkaffoldTilt
  • 如果您需要清单草稿或迁移说明,请借助 AI 辅助,并根据 Kubernetes 和 AKS 的官方指导验证结果。

要考虑的其他工具:

  • 8gwifi.org Kubernetes YAML 转换器:适用于使用小型 Compose 文件的快速联机试验。
  • Okteto:当希望为应用程序团队提供云或远程 Kubernetes 开发循环时非常有用。
  • Devtron:在转换后需要围绕 Kubernetes 交付的平台工作流时非常有用。
  • Portainer:当需要 UI 驱动的容器和 Kubernetes 管理体验时非常有用。

转换您的 Compose 文件

使用以下可复制命令作为起点:

kompose convert
move2kube plan -s ./path && move2kube transform
docker compose bridge convert -o ./k8s/
podman kube generate mypod > k8s.yaml
skaffold init

Kompose 转换示例

开源 Kompose 工具将常见的 Docker Compose 设置转换为 Kubernetes 对象,例如部署和服务。

  1. 在Windows,使用以下命令安装 Kompose:

    curl -L https://github.com/kubernetes/kompose/releases/latest/download/kompose-windows-amd64.exe -o kompose.exe
    

    有关其他安装选项,请参阅 Kompose 安装说明

  2. 从包含文件的 docker-compose.yml 目录中运行 Kompose。

    kompose convert
    
  3. 在将生成的 Kubernetes YAML 文件部署到 AKS 之前,请查看这些文件。

AI辅助转换

可以使用 AI 助手来起草 Kubernetes 清单、将 Compose 设置与 Kubernetes 等效项进行比较,或解释转换为何需要手动更改。

通用示例提示:

Convert this docker-compose.yml into production-ready Kubernetes manifests. Use Apps/v1, move secrets to Kubernetes Secret objects, map local volumes to PersistentVolumeClaims, and add readiness and liveness probes for the web service.

面向 AKS 的示例提示:

Convert this docker-compose.yml into AKS-ready Kubernetes manifests. Target an AKS cluster, push images to Azure Container Registry, use Apps/v1 objects, move secrets to Kubernetes Secret objects, map local volumes to Azure Files or Azure Disks-backed PersistentVolumeClaims, and add readiness and liveness probes for the web service.

在采用 AI 的输出结果之前,请务必先进行审核。 验证 apiVersion 值、资源请求和限制、存储类、服务暴露和健康探针。

处理常见翻译问题

卷是如何处理的?

Compose volumes通常需要 Kubernetes 持久卷和存储类。 在 AKS 中,将仅限本地的挂载替换为服务。

什么会取代 depends_on

Compose depends_on 不会在 Kubernetes 中强制实施运行时准备。 根据需要将其替换为就绪情况探测、启动探测或初始化容器逻辑。

应如何处理机密和环境值?

Compose 环境变量值通常会转换为 Kubernetes ConfigMapSecret 资源,或 Azure 密钥保管库 集成。

端口和入口会发生什么情况?

Compose ports 会映射到 Kubernetes Service 对象,并且根据你发布应用程序的方式,有时还会映射到 Ingress 或 Gateway API 资源。

健康检查是如何翻译的?

Compose healthcheck 设置通常会成为 Kubernetes 的存活探针和就绪探针。

Compose 网络会怎样?

Compose 网络通常通过 Service 和集群 DNS 来实现 Kubernetes 服务发现,而不是通过自定义网桥网络。

如何使用 Kubernetes 在本地进行测试?

转换后,将生成的清单部署到本地 Kubernetes 环境(例如 kind 或 minikube),如果需要更快的编辑-生成-部署循环,请使用 SkaffoldTilt

在转换后应用针对 AKS 的调整

Kompose 提供了一个起点,但通常仍需要针对 AKS 进行手动修改:

  • 更新镜像引用,使其指向你的 Azure 容器注册表(ACR)。
  • 根据工作负载需求,将仅限本地的存储和绑定挂载替换为持久存储。
  • 将 Compose 中的机密信息或环境特定值替换为 Kubernetes Secret、ConfigMap 或 Azure 密钥保管库 集成。
  • 根据你希望在 AKS 中发布应用的方式,检查网络和暴露设置,例如 LoadBalancer、Ingress 或网关配置。
  • 在需要稳定标识或存储行为时,检查有状态组件是否应继续使用 Deployment,还是迁移到 StatefulSet 等模式。
  • 请验证资源请求、探测以及有关启动顺序的任何假设,因为 Compose 中的某些行为(例如 depends_on)不会直接映射为 Kubernetes 中的运行时行为。

转换后工作流

  1. 使用 Kompose、Move2Kube、Docker Compose Bridge、Podman 或 AI 审阅草稿等工具转换 Compose 文件。
  2. 通过修复存储、机密信息、服务暴露、探针和镜像引用问题,审查并加固清单文件。
  3. 使用 Helm 打包清单文件,或使用 Kustomize 分层叠加特定环境的更改。
  4. 将映像推送到 ACR 等注册表,然后使用 GitOps、CI/CD 或直接 kubectl 工作流进行部署。

示例序列: kompose convert -> 查看清单 -> 将映像推送到 ACR -> 更新映像引用 ->kubectl applyhelm install

清理资源

如果遵循 Docker Compose 工作流,可以停止并删除正在运行的容器。 不要删除容器映像, 因为在下一教程中使用这些映像。 如果你遵循的是 Azure 开发人员 CLI 工作流,请使用 azd down 而不是 docker compose down

使用 docker compose down 命令停止和删除容器实例和资源。

docker compose down

Azure开发人员 CLI 命令

使用 azd 时,没有手动容器映像依赖项。 azd 使用 azd upazd down 命令处理应用程序和群集的预配、部署和清理,与 Docker 类似。

可以在 infraazure.yaml 部分中自定义在部署群集之前使用 Terraform 或 Bicep 的准备步骤。 默认情况下,此项目使用 Terraform:

infra:
  provider: terraform
  path: infra/terraform

如果想将服务提供商更改为 Bicep,请按如下所示更新 azure.yaml 文件:

infra:
  provider: bicep
  path: infra/bicep

后续步骤

Azure CLI

在本教程中,你创建了一个示例应用程序,为该应用程序创建了容器映像,然后测试了该应用程序。 你已了解如何执行以下操作:

  • 克隆 GitHub 中的示例应用程序源。
  • 根据示例应用程序源创建容器映像
  • 在本地 Docker 环境中测试多容器应用程序。

下一个教程介绍如何在 ACR 中存储容器映像。

Azure Developer CLI

本教程使用 azd 克隆了一个示例应用程序。 你已了解如何执行以下操作:

  • 克隆 GitHub 中的示例 azd 模板。
  • 查看在示例应用程序源中使用容器映像的位置。

下一个教程将介绍如何使用你克隆的 azd 模板创建群集。