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

从应用程序网关入口控制器 (AGIC) 迁移到适用于容器的应用程序网关

应用程序网关入口控制器 (AGIC) 和适用于容器的应用程序网关是两种解决方案,可实现 Azure Kubernetes 服务 (AKS) 的应用程序负载均衡。 2018 年,应用程序网关启动了应用程序网关入口控制器,该控制器将 Kubernetes 入口配置转换为应用程序网关配置。 随着时间的推移,Kubernetes 推动了对缩放和性能的需求,并为入口引入了称为网关 API 的后续 API,这使得引入了适用于容器的应用程序网关。

适用于容器的应用程序网关是应用程序网关入口控制器的下一个演变,它提供以下优势:

  • 提高了性能,提供近乎实时的更新以添加或移动 Pod、路由和探测
  • 流量拆分/加权轮循机制
  • Kubernetes 网关和入口 API
  • 通过 Azure 或 Kubernetes 配置

由于提供的改进,我们建议你开始从应用程序网关入口控制器过渡到适用于容器的应用程序网关。

迁移目标

迁移到适用于容器的应用程序网关旨在满足三个目标:

  • 启用增量迁移方法
  • 允许在迁移之前进行端到端验证
  • 确保无故障时间

本文提供迁移策略概述。 参阅下图:

该关系图显示了适用于容器的应用程序网关和应用程序网关入口控制器共存进行迁移。

在描述的示例中,适用于容器的应用程序网关和应用程序网关入口控制器都使用唯一的前端为后端目标提供服务。 确认适用于容器的应用程序网关按预期运行之后,流量只能定向到适用于容器的应用程序网关前端,并且应用程序网关入口控制器的配置可能会被停用。

功能依赖关系和映射

在迁移之前,请务必确定应用程序网关入口控制器上是否有任何可能尚不可在适用于容器的应用程序网关中使用的依赖项。 应稍后在迁移策略中确定依赖于这些功能的工作负载的优先级,直到适用于容器的应用程序网关中取消阻止此类功能为止。

此类依赖关系包括:

  • Web 应用程序防火墙 (WAF)
  • 专用 IP
  • 除了80 和 443 之外的端口
  • 可配置的请求超时值

下面是 AGIC 注释的汇总列表,列表中还显示适用于容器的应用程序网关是否已将此类功能转换为网关或入口 API。

场景 AGIC 注释 网关 API 实现 入口 API 实现
到后端目标的路径替代 appgw.ingress.kubernetes.io/backend-path-prefix 网关 API 的 URL 重写 入口 API 的 URL 重写
到后端目标的路径替代 appgw.ingress.kubernetes.io/backend-hostname 网关 API 的 URL 重写 入口 API 的 URL 重写
到后端目标的路径替代 appgw.ingress.kubernetes.io/backend-protocol 网关 API 的 URL 重写 入口 API 的 URL 重写
HTTP 到 HTTPS 重定向 appgw.ingress.kubernetes.io/ssl-redirect 网关 API 的 URL 重定向 入口 API 的 URL 重定向
前端 TLS 证书 appgw.ingress.kubernetes.io/appgw-ssl-certificate 支持 支持
前端 TLS 策略/SSL 配置文件 appgw.ingress.kubernetes.io/appgw-ssl-profile 网关 API 中的前端 TLS 策略 不支持
建立后端证书链信任 appgw.ingress.kubernetes.io/appgw-trusted-root-certificate 支持 支持
连接排出 appgw.ingress.kubernetes.io/connection-draining 不可配置 不可配置
连接排出 appgw.ingress.kubernetes.io/connection-draining-timeout 不可配置 不可配置
会话亲和性/粘性会话 appgw.ingress.kubernetes.io/cookie-based-affinity 网关 API 中的会话亲和性 入口 API 中的会话亲和性
请求超时 appgw.ingress.kubernetes.io/request-timeout 不可配置 不可配置
80 和 443 以外的前端端口 appgw.ingress.kubernetes.io/override-frontend-port 不支持 不支持
专用前端 appgw.ingress.kubernetes.io/use-private-ip 不支持 不支持
WAF appgw.ingress.kubernetes.io/waf-policy-for-path 不支持 不支持
自定义运行状况探测 appgw.ingress.kubernetes.io/health-probe-hostname HealthCheckPolicy HealthCheckPolicy
自定义运行状况探测 appgw.ingress.kubernetes.io/health-probe-port HealthCheckPolicy HealthCheckPolicy
自定义运行状况探测 appgw.ingress.kubernetes.io/health-probe-path HealthCheckPolicy HealthCheckPolicy
自定义运行状况探测 appgw.ingress.kubernetes.io/health-probe-status-codes HealthCheckPolicy HealthCheckPolicy
自定义运行状况探测 appgw.ingress.kubernetes.io/health-probe-interval HealthCheckPolicy HealthCheckPolicy
自定义运行状况探测 appgw.ingress.kubernetes.io/health-probe-timeout HealthCheckPolicy HealthCheckPolicy
自定义运行状况探测 appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold HealthCheckPolicy HealthCheckPolicy
标头重写 appgw.ingress.kubernetes.io/rewrite-rule-set 网关 API 中的标头重写 入口 API 中的标头重写
标头重写 appgw.ingress.kubernetes.io/rewrite-rule-set-custom-resource 网关 API 中的标头重写 入口 API 中的标头重写
标头重写 appgw.ingress.kubernetes.io/hostname-extension 网关 API 中的标头重写 入口 API 中的标头重写

迁移体验和预期内容

根据设计,可通过 4 个步骤从应用程序网关入口控制器迁移到适用于容器的应用程序网关:

步骤 1:安装适用于容器的应用程序网关的 ALB 控制器
步骤 2:将 AGIC 入口转换为适用于容器的应用程序网关入口
步骤 3:针对适用于容器的应用程序网关执行端到端测试
步骤 4:将流量从 AGIC 定向到适用于容器的应用程序网关

对于计划迁移的每个服务,将重复步骤 2-4。

步骤 1:安装 ALB 控制器

迁移的第一步是确保安装并运行适用于容器的应用程序网关的 ALB 控制器。 验证应用程序网关入口控制器和适用于容器的应用程序网关 ALB 控制器是否可以在同一群集上并行运行。

有关如何部署 ALB 控制器的说明,请参阅安装适用于容器的应用程序网关 ALB 控制器

步骤 2:转换入口

适用于容器的应用程序网关已调整其实现,以便在可能的情况下本机使用入口或网关 API。 如果需要不由 API 提供的其他功能,则会应用自定义资源而不是注释。

有关 AGIC 注释及其在入口或网关 API 中的等效实现的列表,可查看本文的注释部分。

步骤 3:执行端到端验证

客户端流量将到达适用于容器的应用程序网关前端资源。 每个前端都有一个网关或入口资源的基数。 在网关或入口资源中定义配置后,请确定正确的前端。

使用主机文件或 DNS 记录检查入口和网关设置,测试流向适用于容器的应用程序网关的流量。 确保流量可以通过适用于容器的应用程序网关从客户端移动到后端,并且所有请求和响应都具有预期的标头、重定向和路由条件。

步骤 4:将流量定向到适用于容器的应用程序网关

完成端到端测试后,将流量定向到适用于容器的应用程序网关。 更新公共 DNS 记录以指向适用于容器的应用程序网关的前端 A 记录。 在大多数情况下,这采用 CNAME 记录的形式;如果指定顶点域名,则为别名记录。 允许流量有时间自然地流向适用于容器的应用程序网关前端。

提示

  • 在迁移之前,请确定 DNS 记录的生存时间 (TTL) 值,该记录当前将流量提供给应用程序网关前端。 确保等待应用程序网关中为连接排出而配置的相同时间量过去,以确保在停用入口/网关配置而改用 AGIC 之前,所有客户端都已将新的 DNS 记录解析到适用于容器的应用程序网关。
  • 考虑在低高峰流量期间进行迁移以进行验证
  • 如果迁移的行为与预期不同,请将 DNS 记录还原为再指向应用程序网关前端,然后重复流程。

步骤 5:弃用应用程序网关入口控制器

迁移所有服务后,你可能会弃用应用程序网关入口控制器。

删除入口资源

删除引用具有 kubernetes.io/ingress.class: azure/application-gateway 注释的应用程序网关入口控制器或定义 azure-application-gatewayingressClassName 的每个入口资源。

kubectl delete ingress your-ingress-name -n your-ingress-namespace

AGIC 加载项

如果使用 AGIC 加载项,可通过运行以下命令来删除加载项:

az aks disable-addons -n <AKS-cluster-name> -g <AKS-resource-group-name> -a ingress-appgw

Helm 部署

如果 AGIC 是通过 Helm 部署的,可通过运行以下命令来卸载控制器:

helm uninstall ingress-azure

清理 Azure 资源

删除入口控制器后,需要删除应用程序网关资源。

注意

如果在引用 Azure 中以前部署的应用程序网关的上下文中预配了 aks 加载项,则需要手动删除应用程序网关资源。

注释

以下应用程序网关入口控制器注释和适用于容器的应用程序网关中的等效实现如下所示。

到后端目标的路径替代

AGIC 注释

  • appgw.ingress.kubernetes.io/backend-path-prefix
  • appgw.ingress.kubernetes.io/backend-hostname
  • appgw.ingress.kubernetes.io/backend-protocol

适用于容器的应用程序网关实现

对于重写后端目标路径的请求,请使用适用于容器的应用程序网关的 URL 重写功能。

网关 API 的 URL 重写

在网关 API 中,需要定义一个 HTTPRoute 资源,该资源有一个筛选器来对路径执行 URLRewrite 操作。

入口 API 的 URL 重写

在入口 API 中,需要定义一个 IngressExtension 资源,使用 ReplacePrefixMatch 定义重写。

重定向

AGIC 注释

  • appgw.ingress.kubernetes.io/ssl-redirect

适用于容器的应用程序网关实现

对于应从 HTTPS 端口 80 重定向到 443 的请求,请在适用于容器的应用程序网关中使用 URL 重定向支持。

网关 API 的 URL 重定向

在网关 API 中,需要定义一个侦听端口 80 和 443 的网关资源。 此外,还创建了两个 HTTPRoute 资源,一个用于侦听和处理 443 上的流量,另一个资源用于触发端口 80 上收到的流量的重定向。

入口 API 的 URL 重定向

在入口 API 中,需要定义一个 IngressExtension 资源,其中包含一个规则来定义 scheme 值为 httpsrequestRedirect。 总共需要定义两个入口资源,一个用于侦听端口 80 以便 HTTP 请求触发重定向,另一个用于侦听端口 443 来处理 HTTPS 请求。

网关 API 中的 SSL 证书

在网关 API 中,引用网关资源上的证书。

tls:
  mode: Terminate
  certificateRefs:
  - kind : Secret
    group: ""
    name: listener-tls-secret

入口 API 中的 SSL 证书

在入口 API 中,使用 tls 属性,例如

tls:
- hosts:
    - example.com
    secretName: listener-tls-secret

前端 TLS 证书

AGIC 注释

  • appgw.ingress.kubernetes.io/appgw-ssl-certificate

适用于容器的应用程序网关实现

无法直接上传证书和引用 Azure Key Vault 中的证书。

机密应存储在 AKS 机密存储中,并按名称引用。

建立后端证书链信任

AGIC 注释

  • appgw.ingress.kubernetes.io/appgw-trusted-root-certificate

适用于容器的应用程序网关实现

在网关和入口 API 中,可以利用 BackendTLSPolicy 自定义资源来定义自己的证书颁发机构,以建立对后端服务使用的证书的链信任。

前端 TLS 策略/SSL 配置文件

AGIC 注释

  • appgw.ingress.kubernetes.io/appgw-ssl-profile

适用于容器的应用程序网关实现

借助适用于容器的应用程序网关,客户可以引用预构建的 TLS 策略来控制客户端协商到适用于容器的应用程序网关前端的密码范围。

网关 API 中的前端 TLS 策略

若要利用此功能,必须使用网关 API。 有关 TLS 策略的更多详细信息,请参阅此处

注意

预定义策略名称和密码套件不同于应用程序网关入口控制器。 请参阅预定义的 TLS 策略表

入口 API 中的前端 TLS 策略

适用于容器的应用程序网关目前不支持自定义 TLS 策略。

会话相关性

AGIC 注释

  • appgw.ingress.kubernetes.io/cookie-based-affinity

适用于容器的应用程序网关实现

适用于容器的应用程序网关通过 Cookie 支持网关和入口 API 的会话亲和性。

网关 API 中的会话亲和性

在网关 API 中,使用与 sessionAffinity 相关的属性定义 RoutePolicy 资源。

入口 API 中的会话亲和性

在入口 API 中,使用与 sessionAffinity 相关的属性定义 IngressExtension 资源。

若要更详细地了解如何为适用于容器的应用程序网关配置会话亲和性,请参阅:会话亲和性

专用前端

AGIC 注释

  • appgw.ingress.kubernetes.io/use-private-ip

适用于容器的应用程序网关实现

适用于容器的应用程序网关当前不支持专用 IP 前端。

WAF

AGIC 注释

  • appgw.ingress.kubernetes.io/waf-policy-for-path

适用于容器的应用程序网关实现

适用于容器的应用程序网关不支持 WAF。

自定义运行状况探测

AGIC 注释

  • appgw.ingress.kubernetes.io/health-probe-hostname
  • appgw.ingress.kubernetes.io/health-probe-port
  • appgw.ingress.kubernetes.io/health-probe-path
  • appgw.ingress.kubernetes.io/health-probe-status-codes
  • appgw.ingress.kubernetes.io/health-probe-interval
  • appgw.ingress.kubernetes.io/health-probe-timeout
  • appgw.ingress.kubernetes.io/health-probe-unhealthy-threshold

适用于容器的应用程序网关实现

HealthCheckPolicy

对于网关和入口 API,等效项是新的 HealthCheckPolicy 资源。 有关更多详细信息,可查看自定义运行状况探测文档。

标头重写

AGIC 注释

  • appgw.ingress.kubernetes.io/rewrite-rule-set
  • appgw.ingress.kubernetes.io/rewrite-rule-set-custom-resource
  • appgw.ingress.kubernetes.io/hostname-extension

适用于容器的应用程序网关实现

网关 API 中的标头重写

在网关 API 中,定义 RequestHeaderModifier 匹配和筛选器来重写请求。

入口 API 中的标头重写

在入口 API 中,使用重写规则定义 IngressExtension 资源。

连接排出

AGIC 注释

  • appgw.ingress.kubernetes.io/connection-draining
  • appgw.ingress.kubernetes.io/connection-draining-timeout

适用于容器的应用程序网关实现

所有适用于容器的应用程序网关部署默认启用连接排出,并且是不可配置的。

方案:

  • 横向缩减:自动缩放横向缩减时,连接排出 5 分钟。 5 分钟后,连接关闭,客户端必须启动新的连接。
  • 运行不正常的运行状况探测:检测到运行不正常的运行状况探测时,连接将一直持续到客户端断开连接。
  • Pod 从后端中删除:在 AKS 中删除 Pod 时,适用于容器的应用程序网关将继续保持打开的连接,直到客户端断开连接。

请求超时

AGIC 注释

  • appgw.ingress.kubernetes.io/request-timeout

适用于容器的应用程序网关实现

在适用于容器的应用程序网关中,不可配置请求超时。 默认超时值的列表记录在此处

前端端口替代

AGIC 注释

  • appgw.ingress.kubernetes.io/override-frontend-port

适用于容器的应用程序网关实现

适用于容器的应用程序网关仅支持 80 和 443 上的端口。 端口 80 和/或 443 在每个网关或入口资源中定义。