本页是一个重点指南,用于评估和将旧版应用程序迁移到Azure Kubernetes 服务 (AKS)。 它涵盖了一个四阶段就绪框架、切实可行的迁移路径(重构、平台迁移、直接迁移)、Windows 和 .NET Framework 的具体注意事项、运维检查,以及一份简明的常见问题解答,用于解答将旧版工作负载迁移到 AKS 时常会遇到的难点问题。
注意:本文负责介绍 AKS 的旧版迁移流程。 它不会重现已在其他位置提供的分步群集预配、CI/CD 或详细的Azure Migrate教程,请参阅 AKS 迁移概述(aks-migration)和Azure Migrate应用容器化教程,了解动手步骤和工具。 在这些页面上添加指向此旧版迁移指南的醒目交叉链接,以便使用旧版 .NET 或 IIS 工作负载的团队能够找到他们所需的单一、明确的入口。
1. 旧版应用程序评估 - 四阶段框架
在迁移任何工作负载之前,请先进行一次严谨的评估。 使用四阶段框架将即席决策转换为可重复的计划。
阶段 1 - 依赖项映射和就绪性评分
目标:发现应用程序在运行时需要的内容并生成容器化准备分数。
- 运行自动发现工具(例如 Azure Migrate 应用容器化),尽可能生成基线就绪性报告以及建议的 Dockerfile/清单文件。
- 梳理服务间和外部依赖关系:
- 下游数据库、消息总线、旧文件共享、SMTP、AD/LDAP、本地 API、硬件设备。
- 网络要求(静态 IP、VIP、保留端口)。
- OS 和内核依赖项(Windows API、本机驱动程序、内核模块)。
- 使用条件为每个服务创建简单的就绪性分数(0-10):
- 无状态 (无状态 = 更高的就绪性)。
- 外部依赖项复杂性(高复杂性 = 较低就绪性)。
- 机密信息处理(使用进程内机密还是外部机密存储)。
- Windows 或原生依赖项(会降低对 Linux 容器的就绪性)。
- 记录在容器化之前必须解决的任何阻塞项,例如:COM+ 组件、硬件加密狗、所需的桌面用户界面。
交付成果:每个服务的依赖关系图、就绪度评分卡,以及按优先级排序的迁移待办事项列表。
阶段 2 — 工作负载分类:重构、重平台化或直接迁移
目标:为每个服务选择正确的迁移路径。
决策指南:
- 重构(容器化和现代化):
- 最适合接口清晰、代码改动较少且没有仅限 Windows 的依赖项的无状态服务。
- 如果可以迁移到 .NET(Core/.NET 6/7/8)或现代 Java 运行时,则可作为候选方案。
- 建议的目标:AKS 上的 Linux 节点池;请考虑使用 AKS 自动执行托管操作。
- Replatform(使用某些体系结构更改或第三方替换进行容器化):
- 当服务的外部依赖易于管理时(例如,可迁移到托管数据库、替换为云服务,或通过边车适配器运行),则是合适的候选方案。
- 使用Azure Migrate应用容器化生成容器项目,然后验证。
- 直接迁移(只需极少代码更改,即可在 AKS 的 Windows 节点上运行):
- 尤其适用于 IIS、.NET Framework(3.5/4.x)、COM 互操作以及 Windows 身份验证这类重新改造成本高昂的工作负载。
- 使用 AKS Windows 节点池运行 Windows 容器,只需进行极少的更改。
对每个服务进行分类,并添加预期的迁移工作量估计(天/周)和回滚策略。
阶段 3 — Windows 特定的就绪情况检查
如果服务面向Windows,请验证以下具体信息:
- IIS 和应用池标识:
- 应用是否依赖于特定的 AppPool 标识或模拟? 为 gMSA 或托管标识做好规划。
- .NET框架兼容性:
- .NET Framework 3.5 和 4.x 在Windows容器中的Windows Server映像上运行。 如果可以移动到 .NET 6/7/8,首选 Linux 容器,但旧版 Framework 应用支持Windows容器。
- COM / COM+ / 原生互操作:
- 许多 COM 和 COM+ 组件无法完全容器化。 选项:重新实现、包装为 VM 中的Windows服务,并在组件在 Windows ServerCore 映像中工作时公开网络 API 或容器化(仔细验证)。
- Windows身份验证(Kerberos/NTLM):
- 为 Kerberos 约束委派场景规划采用 gMSA(组托管服务账户)或 Active Directory 集成。 某些工作负载需要采用 VM/AD 形式,以保留旧有行为。
- 文件系统和配置文件要求:
- 依赖计算机级注册表项、本地服务或桌面会话产物的应用可能需要重构。
交付成果:针对每个工作负载的 Windows 兼容性清单,以及决定是进行重构还是在 Windows 节点池上运行。
阶段 4 - 合规性和安全基线
在 AKS 上运行生产流量之前,请定义并强制实施安全基线。
- 图像来源:
- 强制执行已签名映像和映像扫描。 为允许使用的注册表和映像标记设置 ACR(Azure 容器注册表)策略。
- 适用于 AKS 的 Azure Policy 基线:
- 使用 Azure Policy 的来宾配置策略和 Kubernetes 策略,对命名空间、资源限制、允许使用的容器注册表以及禁止的权限提升实施强制执行。
- 机密管理:
- 将基于文件或配置的机密替换为Azure 密钥保管库或密封的机密。 确保 RBAC 和网络控制措施对机密存储提供保护。
- 注册表分发和可用性:
- 如果跨区域部署,请使用 ACR 异地复制进行多区域分发和冗余。
- 认证和供应链:
- 在合规要求规定时,采用镜像签名和证明流程(例如 Notation/Sigstore 模式)。
交付成果:一套可执行的策略,以及 CI 门禁标准(镜像扫描通过、存在签名、清单已验证)。
2. 旧版迁移路径 - 实用模式
根据分类选择每个服务的路径。 通常,在同一应用程序中使用多个模式(“strangler fig”+ 某些Windows直接迁移部分)。
路径 1 — 结合容器应用程序网关的绞杀者模式
如果您希望进行渐进式迁移,而不进行一次性整体切换,请使用此方式。
- 方法:
- 将新的容器化服务部署到 AKS。
- 使用 Application Gateway(或 Application Gateway for Containers/入口控制器)作为位于传统主机和 AKS 前端的路由入口。
- 按 URL 路径、主机标头或功能标志标头以增量方式移动流量。
- 当对于给定路径的流量完全切换到 AKS 后,请停用旧主机。
- 好处:
- 影响范围最小;只需将流量切回原有主机即可轻松回滚。
- 适用于边界清晰的场景,在这种情况下,你可以每次迁移一个路由或一个 API。
- 考虑:
- 会话相关性和粘滞会话 - 在迁移之前使用 redis 会话存储或转换为无状态会话。
- 两端的 TLS 终止和证书管理。
如果您拥有一个具有清晰模块边界的单体应用,或者一个可按路径进行路由的 Web 层,则建议采用。
路径 2 - 使用Windows节点池进行直接迁移
当重构成本高得难以承受且应用需要在 Windows 上运行时使用。
- 运作方式:
将Windows节点池添加到 AKS 群集:
az aks nodepool add \ --resource-group $RESOURCE_GROUP \ --cluster-name $CLUSTER_NAME \ --name winnp \ --os-type Windows \ --node-count 2 \ --node-vm-size Standard_D4s_v3- 使用节点选择器部署Windows容器:
spec: nodeSelector: "kubernetes.io/os": windows使用官方基础映像,例如:
- mcr.azk8s.cn/dotnet/framework/aspnet (.NET Framework 上的 ASP.NET)
- mcr.azk8s.cn/windows/servercore/iis (IIS 服务器)
AKS 中的 Windows 节点池需要使用 Azure CNI(因此需相应规划子网大小)。
- 何时选择:
- IIS 托管的应用、严重依赖 Windows API 的 .NET Framework 应用,或者依赖 Windows 身份验证和 COM 互操作的应用。
- 局限性:
- Windows 容器具有不同的资源特性,且映像大小更大。
- 某些 Kubernetes 功能和附加组件在 Windows 上可能存在差异;请验证你的可观测性和系统工具链。
- 保障性:
- AKS 节点镜像中的 Windows Server 2019/2022 镜像支持 .NET Framework 3.5 和 4.x。 验证运行时所用的具体补丁版本和映像版本。
路径 3 - 使用 AKS 自动分阶段重构
当您能够进行现代化改造,但又想减轻运维负担时。
- AKS 自动(托管节点预配和缩放)可以简化群集生命周期任务,使团队专注于应用。
- 方法:
- 一次将绑定上下文提取到一个服务的容器中。
- 使用绞杀榕路由层来管理流量。
- 让 AKS 自动处理节点预配、自动缩放、OS 修补和升级(如果适用)。
- 好处:
- 降低集群运维工作负担;在推进现代化的同时采用云原生最佳实践时尤为理想。
- 考虑:
- 需要对 CI/CD 和映像提升进行投资,以防止操作偏移。
3. Windows和.NET框架工作负荷迁移 - 实际清单
本部分合并了特定于 Azure 的命令和对 AKS 中Windows工作负荷的实际检查。
添加Windows节点池(示例)
使用Azure CLI代码片段(自定义资源名称):
az aks nodepool add \
--resource-group $RESOURCE_GROUP \
--cluster-name $CLUSTER_NAME \
--name winnp \
--os-type Windows \
--node-count 2 \
--node-vm-size Standard_D4s_v3
Notes:
- Windows节点池需要Azure CNI 网络。 在添加池之前规划子网 IP 容量。
- 您可以创建混合 OS 群集(Linux + Windows 节点池),并使用 nodeSelector 或 nodeAffinity 来限制 Windows Pod 的调度。
部署Windows容器
示例 Pod 选择器(YAML 片段):
spec:
nodeSelector:
"kubernetes.io/os": windows
containers:
- name: legacy-iis
image: mcr.azk8s.cn/windows/servercore/iis:windowsservercore-ltsc2022
ports:
- containerPort: 80
- 基础映像:
- 适用于 .NET Framework 上的 ASP.NET 应用的 mcr.azk8s.cn/dotnet/framework/aspnet
- 用于通用 IIS 工作负载的 mcr.azk8s.cn/windows/servercore/iis
- 网络:
- 使用 Azure CNI;确保子网大小足够,并验证网络策略。
Windows身份验证和 gMSA
若要在 AKS 群集上启用 gMSA,请执行以下操作:
az aks update \
--resource-group $RESOURCE_GROUP \
--name $CLUSTER_NAME \
--enable-windows-gmsa
高级步骤:
- 在 Active Directory 中准备 gMSA 凭据。
- 创建引用 gMSA 帐户的 Kubernetes 资源 (CredentialSpec)。
- 在 pod 规范中引用凭据规范。
如果应用依赖于 Kerberos 约束委派或 NTLM,请在迁移生产流量之前使用测试帐户和 AD 集成来验证端到端。
.NET现代化路径
- 如果应用可以升级到 .NET(Core/.NET 6/7/8),则首选 Linux 容器,以支持较小的映像和更好的生态系统支持。
- 使用 ASP.NET 容器化教程计划从 .NET Framework 移植到 .NET Core/.NET 6+。
- 对于无法快速完成现代化改造的应用,请采用 Windows 原样迁移路径,并规划并行推进的现代化改造待办事项清单。
4. 旧版迁移常见问题解答 (快速解答)
问:是否可以在 AKS 上的容器中运行 IIS? A:是的。 使用Windows节点池和 IIS 基础映像。 Azure Migrate应用容器化可以为许多 IIS 应用生成 Dockerfile 和 Kubernetes 清单,从而减少手动步骤。 对于Windows身份验证方案,请配置 gMSA。
问:是否可以容器化 COM+ 或 COM 互操作组件? A:通常不是——COM+ 和深度原生互操作通常与容器化模式不兼容。 选项:
- 重新实现或包装为托管在 VM 中的网络服务(REST/gRPC),或重构为.NET服务。
- 如果 COM 组件在 ServerCore 映像中正常运行,并且没有内核或硬件依赖项,则你也许可以测试 Windows 容器,但要预期存在兼容性风险。
问:如何为 Pod 启用 Kerberos/NTLM(Windows 身份验证)? 答:在群集上启用 gMSA(请参阅 az aks update --enable-windows-gmsa),在 AD 中创建 gMSA 凭据规范,并在 Pod 规范中引用它们。 验证票证转发和 SPN 端到端。
问:来自 ACR 的 ImagePullBackOff - 常见原因和修复
- 确保群集标识(托管标识或服务主体)在目标 ACR 上具有 AcrPull 角色分配。
- 确认 ACR URI 和映像标记正确,ACR 和群集具有网络连接(VNet 规则、专用终结点)。
- 如果使用专用终结点,请确保群集中注册表的 DNS 解析正确解析。
问:添加 Windows 节点池后,Azure CNI IP 地址耗尽
- Windows节点需要每个节点更多的保留 IP;相应地规划子网大小。
- 缓解措施:
在添加Windows节点池之前,使用足够的 IP 预先调整子网的大小。
创建节点池时,请使用较低的 --max-pods 设置,以减少每个节点上的 Pod IP 数量:
az aks nodepool add ... --max-pods 20仅在受支持的环境中评估 Azure CNI 覆盖网络或其他网络方案。
问:如何处理已迁移应用中的机密?
- 将基于文件的敏感信息和镜像中的配置替换为 Azure 密钥保管库,或替换为由 密钥保管库 提供程序支持的 Kubernetes Secret。
- 使用 Azure RBAC 和 Kubernetes RBAC 强制实施机密访问;使用最低权限。
问:ACR 异地复制和内容信任呢?
- 使用 ACR 异地复制将映像推送到区域群集更近,并减少冷拉。
- 采用镜像签名和供应链证明(例如 Sigstore/Notation 或其他解决方案),并在合规性有要求时,使用 Azure Policy 强制实施来源证明。
迁移清单(实际后续步骤)
- 运行自动发现(Azure Migrate应用容器化)并生成就绪情况报告。
- 生成依赖项映射并为每个服务评分,以便实现容器化准备。
- 对每个服务(重构、重新调整、直接迁移)进行分类,并确定积压工作优先级。
- 对于Windows工作负荷:
- 运行Windows兼容性清单(IIS、.NET Framework 版本、COM、gMSA)。
- 规划 Azure CNI 子网大小
- 在测试群集中添加Windows节点池,并验证端到端行为。
- 定义安全基线:
- ACR 策略、镜像扫描、镜像签名、适用于 AKS 的 Azure Policy。
- 机密迁移计划(密钥保管库)。
- 选择迁移方案,并以低风险流量开展试点:
- 使用 Application Gateway for Containers 的绞杀榕模式实现渐进式切换。
- 验证性能、日志记录和可观测性(App Insights、Prometheus、Fluentd)。
- 迭代推进:迁移下一个限界上下文,让遗留组件退役,并准备好回滚方案。