你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Azure Spring Apps 迁移到 Azure Kubernetes 服务

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用

本文适用于:✅基本计划/标准计划 ✅ 企业计划

本文概述了如何从 Azure Spring Apps 迁移到 Azure Kubernetes 服务 (AKS)。

Azure Spring Apps 是专为 Spring Boot 应用程序设计的平台即服务 (PaaS) 解决方案。 该解决方案使部署、运行和管理这些应用程序变得更加容易。 Azure Spring Apps 负责基础结构、缩放和监视,以便开发人员可以专注于其代码。

AKS 是一种基础结构即服务 (IaaS) 产品,提供完全托管的 Kubernetes 环境。 AKS 可让你更好地控制应用程序的部署和管理方式。 它支持各种容器化应用程序,并支持自定义以满足特定需求。

将应用程序从 Azure Spring Apps 迁移到 AKS 意味着从托管环境迁移到可提高灵活性的环境。 此过程要求采用新的工具和做法,以实现与 Azure Spring Apps 相同的 AKS 结果。

概念映射

由于 Azure Spring Apps 和 AKS 是不同类型的云服务产品/服务,因此直接将 Azure Spring Apps 概念映射到 AKS 并不完全准确。 此外,在生产环境中使用时,Azure Spring Apps 依赖于许多内部组件,此处未列出这些组件。 下图和下表提供了从 Azure Spring Apps 到 AKS 的概念的简单映射,以帮助你了解基础知识。 在实际的生产环境中,应考虑更安全、更可靠的解决方案。

示意图:Azure Spring Apps 与 Azure Kubernetes 服务之间的概念映射。

Azure Spring Apps 服务 Azure Kubernetes 服务
服务实例为应用和其他资源提供托管和保护边界,并支持自定义虚拟网络。 群集是部署的基本单元。 在群集中,命名空间是用于组织和隔离资源的虚拟细分。 它会共享群集虚拟网络定义的相同基础网络基础结构。 在专用群集或具有命名空间的共享群集之间进行选择取决于业务需求。
应用是一种商业应用程序,用作服务实例中的子资源。 业务应用是 Azure Spring Apps 中的虚拟概念,由 AKS 中的多个资源组成。 入口控制对服务的外部访问,并设置用于将流量路由到不同服务的规则。 服务将访问一组 Pod 抽象化。 你可以通过更新服务,利用标签使其指向不同版本的部署,从而实现蓝绿部署切换。
部署是应用的版本。 应用可以有一个生产部署和一个过渡部署。 部署管理特定应用程序或服务的推出和生命周期。 它还支持滚动更新和回滚,从而在不停机的情况下实现受控的无缝应用程序更改。
应用程序实例是由服务管理的最小运行时单元。 Pod 表示一个或多个紧密耦合的容器,并托管正在运行的应用程序或工作负荷的单个实例。

网络注意事项

在预配 AKS 群集之前,请务必仔细考虑网络设置。 这些决策可能会显著影响应用程序的性能、可伸缩性和安全性。

AKS 依赖于容器网络接口 (CNI) 插件来管理其群集中的网络。 这些插件会处理关键任务,例如将 IP 地址分配给 Pod、在 Pod 之间路由流量以及通过 Kubernetes 服务启用通信。 AKS 支持针对不同网络需求定制的多个 CNI 插件,从而在群集设计方面提供灵活性。

AKS 提供两个主要网络模型:覆盖网络和平面网络。 覆盖网络将专用 IP 地址分配给 Pod,将与 AKS 节点的 Azure 虚拟网络子网分开。 此模型可缩放并节省虚拟网络 IP 地址,但对离开群集的流量使用网络地址转换 (NAT)。 相比之下,平面网络直接从节点所在的同一 Azure 虚拟网络子网分配 Pod IP 地址,使外部服务能够访问没有 NAT 的 Pod。 虽然平面网络支持直接 Pod 通信,但它们需要更广泛的虚拟网络 IP 地址空间。

适当的 IP 规划对于顺利执行 AKS 操作至关重要。 请务必确保所有资源的子网具有足够的 IP 地址,避免重叠范围,并留出空间供将来增长,以防止连接问题和中断。 有关详细信息,请参阅 Azure Kubernetes 服务 CNI 网络概述

若要处理 AKS 中的传入流量,可以使用负载均衡器或入口控制器。 负载均衡器在第 4 层运行,基于协议和端口分发流量;而入口控制器在第 7 层工作,提供基于 URL 的路由和 TLS/SSL 终止等高级功能。 入口控制器通过单个 IP 管理发向多个应用程序的流量,减少了对多个公共 IP 的需求。 对于 Web 应用程序,入口控制器是首选,因为它们提供更好的流量管理和与 Kubernetes 资源的集成。 有关详细信息,请参阅具有应用程序路由加载项的托管 NGINX Ingress

若要保护 AKS 中的网络流量,请使用 Azure 应用程序网关等 Web 应用程序防火墙 (WAF),以防止跨站点脚本和 Cookie 中毒等攻击,同时管理流量路由和 TLS/SSL 终止。 此外,通过基于标签、命名空间或端口在 YAML 清单中定义规则来控制 Pod 到 Pod 通信的网络策略。 这些策略仅适用于基于 Linux 的节点,可确保在群集中更好地控制流量和安全性。 有关详细信息,请参阅在 AKS 中使用网络策略保护 Pod 之间的流量

预配

若要预配 AKS 群集,可以使用 Azure 门户、Azure CLI 或 ARM 模板。 此过程通常涉及选择所需的区域、定义节点池大小和类型,以及选择网络模型(Azure CNI 或 Kubenet)。 还必须配置身份验证选项,例如 Microsoft 用户访问控制的 Entra ID 集成。 若要监视和缩放,可以启用 Azure Monitor 并基于资源使用情况配置自动缩放。 预配后,可以使用 kubectl 或 Azure CLI 管理群集。 有关预配 AKS 的详细说明,请访问创建 AKS 群集

访问和标识

AKS 提供多种方法来管理 Kubernetes 群集的身份验证、授权和访问控制。 您可以使用 Kubernetes 基于角色的访问控制 (RBAC),仅向用户、组和服务帐户授予对所需资源的访问权限。 有关详细信息,请参阅使用 RBAC 授权。 AKS 还支持 Microsoft Entra ID 和 Azure RBAC 来提高安全性和控制能力,使你能够以更简化的方式分配和管理权限。

为了获得最佳安全性,建议将 AKS 与 Microsoft Entra ID 集成。 此集成使用 OpenID Connect 和 OAuth 2.0 协议进行身份验证。 用户在与 AKS 群集交互时使用 Microsoft Entra 凭据进行身份验证,其访问权限由群集管理员管理。 有关详细信息,请参阅使用 kubelogin 为 Kubernetes 群集启用 Azure 托管标识身份验证

Microsoft Entra Workload ID 通过 OpenID Connect (OIDC) 联合身份验证将 Kubernetes 的本机功能与外部标识提供者集成。 Microsoft Entra Workload ID 使用服务帐户令牌卷投影通过带批注的服务帐户将 Kubernetes 标识分配给 Pod。 使用这些令牌,Kubernetes 应用程序可以使用 Microsoft Entra ID 安全地对 Azure 资源进行身份验证和访问。 此设置可与 Azure 标识客户端库 (Azure.Identity) 或 Microsoft 身份验证库 (MSAL) 等库无缝配合工作,以简化工作负载的身份验证。 若要了解如何设置群集并配置具有工作负载标识的应用程序 Pod,请参阅部署和配置工作负荷标识

容器化应用程序

将应用程序容器化为容器映像对于在 AKS 上进行部署至关重要。 该操作可确保部署一致、可移植且可缩放。 使用容器映像可以灵活地管理不同版本的应用程序。 它使得更新和回滚更加轻松,并使多个容器能够在单个主机上运行,从而提高资源效率。

Azure Spring Apps 可帮助用户创建容器映像,并采用不同的方式部署应用程序。 可以从源代码、生成项目(如 JAR 或 WAR 文件)或直接从容器映像进行部署。 若要了解如何从 JAR 或 WAR 文件进行部署,请参阅从 JAR 或 WAR 生成容器映像。 若要了解如何从源代码进行部署,请参阅使用 Paketo Buildpacks 容器化应用程序

若要监视 AKS 上部署的应用程序的性能,可以在容器化过程中集成应用程序性能监视 (APM) 代理。 有关详细信息,请参阅将应用程序性能监视集成到容器映像中

部署应用程序和 Spring Cloud 组件

若要将应用程序部署到 AKS,可以使用 Azure Spring Apps 或 StatefulSets 所使用的部署,具体取决于应用程序的需求。 对于无状态应用程序(如微服务),通常使用部署来管理应用程序的副本,并确保它们运行顺利。 Azure Spring Apps 使用此类型。 另一方面,StatefulSet 非常适合需要持久存储或稳定标识的应用程序,例如需要有状态的数据库或服务。

除了应用程序部署,还需要定义服务来公开后端 Pod。 服务是一种抽象,可用于定义一组逻辑 Pod,并使网络能够访问这些 Pod。 此功能对于 Pod 之间的负载均衡和通信至关重要。

部署 Spring Cloud 组件(如 Spring Cloud 配置或 Spring Cloud 网关)时,通常会对无状态服务使用部署。 对于需要稳定存储或状态的后端服务,可以选择 StatefulSet。

以下链接提供了 Spring Cloud 组件的容器映像和清单文件的参考示例:

监视器

监视是管理 AKS 上部署的应用程序的关键部分。 AKS 提供了一系列工具来跟踪和分析群集和工作负载的状态,包括 Azure Monitor、Azure Log Analytics 和 Prometheus 等集成解决方案。 有关详细信息,请参阅以下文章:

除了 Azure Monitor 和 Prometheus,还可以使用其他监视解决方案,例如 Datadog、New Relic 或 Elastic Stack (ELK)。 你可以将这些工具集成到 AKS 中,以收集日志、指标和跟踪,从而提供对群集性能的各种见解。

教程

我们提供了一个教程,演示在 AKS 上运行 ACME Fitness Store 应用程序的端到端体验。 有关详细信息,请参阅 acme-fitness-store/azure-kubernetes-service。 本教程提供实用指南,旨在用于参考。 AKS 高度灵活,因此需要根据特定要求选择配置和自定义项。