从 Ingress( NGINX )迁移到 Traefik Ingress 控制器
将您的 Ingress 配置迁移至使用 Traefik 控制器,而非 Ingress- NGINX 控制器。
准备工作
在迁移之前,请仔细检查这些先决条件。
-
请确保您拥有所需的权限。
- 集群的管理员平台访问角色
- 所有命名空间中的 “管理员”服务访问角色
-
审查现有的 Ingress 资源,以查找针对 Ingress- NGINX 的特定注释或配置。 请查阅有关 这两个 Ingress 控制器之间主要区别的 文档。
-
根据工作负载要求、停机容忍度以及资源可用性来规划您的迁移策略。 在迁移过程中,两个控制器均可同时运行。
-
为确保高可用性,请确保您的集群在每个区域中至少有两个工作节点。
-
在进行更改之前,请备份您当前的 Ingress 配置。
策略 1:使用不同的域名将 Ingress 配置分离
在保持生产环境继续使用 Ingress 的同时,通过独立环境测试 Traefik—— NGINX。 该策略可提供最大的隔离性和安全性。
在以下情况下使用此策略:
- 在将生产环境的工作负载迁移过来之前,您需要对 Traefik 进行全面测试。
- 您可以部署另一组应用程序用于测试。
- 您拥有运行更多 ALB 的资源。
- 您希望在测试期间,生产环境完全不受影响。
步骤
- 获取可用的 Traefik 版本。
ibmcloud ks ingress alb versions - 使用 Traefik 创建一个新的 ALB。
经典簇
sh {: pre} ibmcloud ks ingress alb create classic --cluster CLUSTER_NAME --type PUBLIC_OR_PRIVATE --zone ZONE --vlan VLAN_ID --version TRAEFIK_VERSION
VPC 集群
sh {: pre} ibmcloud ks ingress alb create vpc-gen2 --cluster CLUSTER_NAME --type PUBLIC_OR_PRIVATE --zone ZONE --version TRAEFIK_VERSION
-
对于 VPC 集群,请手动部署一个额外的 LoadBalancer 服务,用于测试。 将
spec.selector设置为包含app.kubernetes.io/vpcComponent: public-cr<cluster_id>-traefik(如果是私有ALB,则为private-cr<cluster_id>-traefik)。 在 Classic 集群上,系统会自动配置一个新的负载均衡器,无需进行额外配置。 -
为 Traefik ALB 创建一个自定义域名,并将其指向负载均衡器的主机名或 IP 地址。 有关详细说明,请参阅 “创建自定义域名”。
-
使用 Traefik Ingress 类为测试应用程序创建一个 Ingress 资源。 请访问 步骤 3:创建 Ingress 资源,并指定
ingressClassName: public-iks-traefik(如果是私有 ALB,则为private-iks-traefik)。 -
通过 Traefik 域名测试应用程序,并验证其功能。
-
测试完成后,请继续执行 “切换”操作,以迁移您的生产工作负载。
策略 2:处理相同工作负载的双负载均衡器
通过创建两个指向同一服务的 Ingress 资源,在相同的工作负载上测试这两个控制器。 您可以直接比较控制器的工作行为,而不会影响生产环境中的流量。
在以下情况下使用此策略:
- 你想比较Ingress( NGINX )和Traefik在相同工作负载下的行为表现。
- 您需要验证 Traefik 能否正确处理您的特定应用程序。
- 您可以使用非生产环境域名进行测试。
- 您希望尽可能减少所需的测试应用程序数量。
步骤
- 启用一个基于 Traefik 的新 ALB。
经典簇
sh {: pre} ibmcloud ks ingress alb create classic --cluster CLUSTER_NAME --type PUBLIC_OR_PRIVATE --zone ZONE --vlan VLAN_ID --version TRAEFIK_VERSION
VPC 集群
sh {: pre} ibmcloud ks ingress alb create vpc-gen2 --cluster CLUSTER_NAME --type PUBLIC_OR_PRIVATE --zone ZONE --version TRAEFIK_VERSION
-
对于 VPC 集群,请手动部署一个额外的 LoadBalancer 服务,用于测试。 将
spec.selector设置为包含app.kubernetes.io/vpcComponent: public-cr<cluster_id>-traefik(如果是私有ALB,则为private-cr<cluster_id>-traefik)。 在 Classic 集群上,系统会自动配置一个新的负载均衡器,无需进行额外配置。 -
为 Traefik ALB 创建一个自定义域名,并将其指向负载均衡器的主机名或 IP 地址。 有关详细说明,请参阅 “创建自定义域名”。
-
创建第二个 Ingress 资源,该资源使用 Traefik Ingress 类,但指向与现有 Ingress( NGINX )相同的服務。 请按照 “步骤 3:创建 Ingress 资源”中的说明操作,并确保:
- 指定
ingressClassName: public-iks-traefik(如果是私有 ALB,则指定private-iks-traefik) - 请使用与您现有的 Ingress- NGINX Ingress 资源相同的
service.name值 - 请在“
host”和“tls.hosts”字段中使用您的测试域名
- 指定
-
请通过这两个域名测试您的应用程序。
- 通过 Ingress- NGINX 域名(生产环境)访问
- 通过 Traefik 域名(testing)访问
-
比较这两个控制器在行为、性能和功能方面的差异。
-
验证完成后,请继续执行 “切换”操作,将您的生产域迁移到 Traefik。
策略 3:拆分 DNS 测试
使用拆分 DNS 配置,在类似生产环境的条件下使用您的生产域名测试 Traefik,同时不会影响您的用户。
在以下情况下使用此策略:
- 你想使用实际的生产域进行测试。
- 您可以控制测试环境的 DNS 配置。
- 您需要验证确切的生产环境配置。
- 您希望尽可能减少测试环境与生产环境之间的差异。
步骤
- 启用一个基于 Traefik 的新 ALB。
经典簇
sh {: pre} ibmcloud ks ingress alb create classic --cluster CLUSTER_NAME --type PUBLIC_OR_PRIVATE --zone ZONE --vlan VLAN_ID --version TRAEFIK_VERSION
VPC 集群
sh {: pre} ibmcloud ks ingress alb create vpc-gen2 --cluster CLUSTER_NAME --type PUBLIC_OR_PRIVATE --zone ZONE --version TRAEFIK_VERSION
-
对于 VPC 集群,请手动部署一个额外的 LoadBalancer 服务,用于测试。 将
spec.selector设置为包含app.kubernetes.io/vpcComponent: public-cr<cluster_id>-traefik(如果是私有ALB,则为private-cr<cluster_id>-traefik)。 在 Classic 集群上,系统会自动配置一个新的负载均衡器,无需进行额外配置。 -
获取新 Traefik ALB 的 IP 地址(经典模式)或主机名(VPC 模式)。
ibmcloud ks ingress alb ls --cluster CLUSTER_NAME -
在测试环境中配置拆分 DNS。
- 对于您的测试机器或网络,请配置 DNS,将您的生产域解析到 Traefik ALB 的 IP 地址/主机名
- 生产环境的用户继续将请求路由到 Ingress—— NGINX ALB
- 这可以通过本地
/etc/hosts文件、内部DNS服务器或VPN专用的DNS配置来实现
-
使用 Traefik Ingress 类,结合您的生产环境域名,创建一个新的 Ingress 资源。 请访问 步骤 3:创建 Ingress 资源,并在
host和tls.hosts字段中分别指定ingressClassName: public-iks-traefik(或私有 ALB 的private-iks-traefik)以及您的生产域。 -
在您的拆分 DNS 环境中进行测试,以验证 Traefik 是否能与生产环境的域名和配置正常配合使用。
-
验证完成后,请继续执行 “切换”操作,将生产环境的 DNS 指向 Traefik。
策略 4:直接迁移
只需进行最少的配置更改和资源管理,即可直接从 Ingress( NGINX )切换到 Traefik。
该策略会在迁移期间导致服务中断。 在开始之前,请规划好维护窗口。
在以下情况下使用此策略:
- 您的工作负载较小,或者运行的是非关键型应用程序。
- 在迁移过程中,您可以接受短暂的服务中断。
- 您希望尽可能减少需要管理的资源数量。
- 您已经在另一个环境中验证了 Traefik 的兼容性。
- 在 Classic 环境中,您必须保持 ALB 的 IP 地址不变,因为客户端是通过 IP 地址而非 DNS 域名进行连接的。
禁用并重新启用 ALB 时,其原始 IP 地址将得以保留,除非在此期间该 IP 地址已被其他服务占用。 有关详细信息,请参阅 “启用或禁用 ALB”。
步骤
-
获取当前 Ingress- NGINX ALB 的 ID。
ibmcloud ks ingress alb ls --cluster CLUSTER_NAME -
禁用 Ingress- NGINX ALB。
ibmcloud ks ingress alb disable --alb ALB_ID --cluster CLUSTER_NAMEVPC 集群:如果您禁用了最后一个公共或私有 ALB,请等待 ALB 部署及相应的负载均衡器服务资源被删除后,再启用 Traefik ALB。
-
使用某个版本的 Traefik 启用 ALB。
经典簇
sh {: pre} ibmcloud ks ingress alb enable classic --alb ALB_ID --version TRAEFIK_VERSION --cluster CLUSTER_NAME 要在经典版中为 ALB 使用特定的 IP 地址,请使用 --ip 标志。 有关详细信息,请参阅 “启用或禁用 ALB”。
[VPC 集群]{: tag-vpc}
```sh {: pre}
ibmcloud ks ingress alb enable vpc-gen2 --alb ALB_ID --version TRAEFIK_VERSION --cluster CLUSTER_NAME
```
- 对于 VPC 集群,请将负载均衡器的后端设置为 Traefik。
VPC 集群
sh {: pre} ibmcloud ks ingress load-balancer backend set --cluster CLUSTER-ID --public-backend traefik [--private-backend traefik]
-
更新您的 Ingress 资源,使其使用 Traefik Ingress 类。 如果您的资源显式设置了 Ingress 类,请将
spec.ingressClassName中的public-iks-k8s-nginx更新为public-iks-traefik(对于私有 ALB,则将private-iks-k8s-nginx更新为private-iks-traefik)。 -
应用更新的 Ingress 资源。
kubectl apply -f ingress.yaml -
请确认您的应用程序可通过 Traefik 控制器访问。
curl https://<domain>/<app_path>
迁移到 Traefik
测试完成后,将生产流量切换至使用 Traefik 控制器。 经典集群和 VPC 集群的操作步骤有所不同。 请选择与您的集群类型和配置相匹配的选项。
经典簇
对于经典集群,请将您的生产域更新为指向暴露 Traefik 的负载均衡器,而不是 Ingress—— NGINX。
选项 1:更新域名映射
- 获取您的 Traefik ALB 的 IP 地址。
ibmcloud ks ingress alb ls --cluster CLUSTER_NAME - 将您的域名指向 Traefik ALB。
ibmcloud ks ingress domain update --cluster CLUSTER_NAME --domain DOMAIN_NAME --ip TRAEFIK_ALB_IP - 验证域名更新。
ibmcloud ks ingress domain ls --cluster CLUSTER_NAME - 通过生产环境域名测试您的应用程序,以确保它们现在由 Traefik 提供服务。
选项 2:禁用 Ingress—— NGINX ALB
或者,您可以禁用所有基于 Ingress- NGINX 的 ALB,这将自动更新域名映射。
- 列出所有ALB,并识别出基于Ingress- NGINX 的ALB。
ibmcloud ks ingress alb ls --cluster CLUSTER_NAME - 禁用每个 Ingress- NGINX ALB。
ibmcloud ks ingress alb disable --alb NGINX_ALB_ID --cluster CLUSTER_NAME - 请确认您的域名现已指向 Traefik ALB。
ibmcloud ks ingress domain ls --cluster CLUSTER_NAME
选项 3:保留 ALB IP 地址
如果您的客户直接连接到 ALB IP 地址而非 DNS 名称,您可以在迁移过程中保留这些 IP 地址。 要保留 IP 地址,需要暂时禁用 ALB,这会导致服务短暂中断。
禁用并重新启用 ALB 时,其原始 IP 地址将得以保留,除非该 IP 地址已被其他服务占用。
-
列出所有ALB,并识别基于Ingress- NGINX 的ALB,以获取其ID和IP地址。
ibmcloud ks ingress alb ls --cluster CLUSTER_NAME -
禁用 Ingress- NGINX ALB。 这会导致该IP地址的流量出现短暂的服务中断。
ibmcloud ks ingress alb disable --alb ALB_ID --cluster CLUSTER_NAME -
使用 Traefik 的某个版本重新启用 ALB,以便继续使用相同的 IP 地址。
ibmcloud ks ingress alb enable classic --alb ALB_ID --version TRAEFIK_VERSION --cluster CLUSTER_NAME或者,创建一个新的ALB,并使用
--ip标志来复用原始的IP地址。 -
更新您的 Ingress 资源,使其使用 Traefik Ingress 类。 如果您的资源显式设置了 Ingress 类,请将
spec.ingressClassName中的public-iks-k8s-nginx更新为public-iks-traefik(对于私有 ALB,则将private-iks-k8s-nginx更新为private-iks-traefik)。 -
应用更新的 Ingress 资源。
kubectl apply -f ingress.yaml -
请确认您的应用程序可通过 Traefik 控制器访问。
curl https://<domain>/<app_path>
VPC 集群
对于 VPC 集群,请将负载均衡器的后端更新为暴露 Traefik 而不是 Ingress—— NGINX。
选项 1:更新负载均衡器的后端
- 将负载均衡器更新为使用 Traefik 后端。
ibmcloud ks ingress load-balancer backend set --cluster CLUSTER_NAME --public-backend traefik [--private-backend traefik] - 验证负载均衡器的配置。
ibmcloud ks ingress load-balancer get --cluster CLUSTER_NAME - 测试您的应用程序,以确保它们现在由 Traefik 提供服务。
选项 2:禁用 Ingress—— NGINX ALB
或者,您可以禁用所有基于 Ingress- NGINX 的 ALB。
- 列出所有ALB,并识别出基于Ingress- NGINX 的ALB。
ibmcloud ks ingress alb ls --cluster CLUSTER_NAME - 禁用每个 Ingress- NGINX ALB。
ibmcloud ks ingress alb disable --alb NGINX_ALB_ID --cluster CLUSTER_NAME - 请确认负载均衡器现在是否已使用 Traefik ALB。
ibmcloud ks ingress load-balancer get --cluster CLUSTER_NAME
迁移后任务
迁移到 Traefik 后,请完成以下任务:
-
迁移完成后,请监控您的应用程序,以查看是否有任何意外行为或错误。
-
更新内部文档,以反映使用 Traefik 进行的新 Ingress 配置。
-
删除所有不再需要的测试 ALB、域名或 Ingress 资源。
-
在确认 Traefik 运行正常后,禁用剩余的 Ingress- NGINX ALB。
ibmcloud ks ingress alb disable --alb NGINX_ALB_ID --cluster CLUSTER_NAME
故障诊断
如果您在迁移过程中或迁移后遇到问题,请按照以下步骤进行排查和解决。
- 检查Ingress等级
-
请确认 Ingress 资源使用了正确的 Traefik 类(
public-iks-traefik或private-iks-traefik)。 - 验证 ALB 状态
-
请确保您的 Traefik ALB 处于正常运行状态。
ibmcloud ks ingress alb ls --cluster CLUSTER_NAME - 检查Ingress状态
-
查看您的 Ingress 资源状态。
kubectl get ingress -A - 查看日志
-
请检查 Traefik 控制器日志中是否有错误。
kubectl logs -n kube-system -l alb-image-type=traefik - 运行诊断
-
使用 Ingress 状态报告来排查问题。
ibmcloud ks ingress status-report get --cluster CLUSTER_NAME - 如有必要,请回滚
-
NGINX 如果您遇到严重问题,请禁用 Traefik ALB,并重新启用原始版本的 Ingress- NGINX ALB,以回滚至 Ingress-。 制定计划以解决这些问题,然后再次进行迁移。
如需更多帮助,请参阅《 Ingress 故障排除 》或联系 IBM Cloud 支持团队。