你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
应用程序网关入口控制器 (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-gateway
的 ingressClassName
的每个入口资源。
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
值为 https
的 requestRedirect
。 总共需要定义两个入口资源,一个用于侦听端口 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 在每个网关或入口资源中定义。