从 Ingress( NGINX )迁移到 Traefik Ingress 控制器

将您的 Ingress 配置迁移至使用 Traefik 控制器,而非 Ingress- NGINX 控制器。

准备工作

在迁移之前,请仔细检查这些先决条件。

  1. 请确保您拥有所需的权限。

    • 集群的管理员平台访问角色
    • 所有命名空间中的 “管理员”服务访问角色
  2. 审查现有的 Ingress 资源,以查找针对 Ingress- NGINX 的特定注释或配置。 请查阅有关 这两个 Ingress 控制器之间主要区别的 文档。

  3. 根据工作负载要求、停机容忍度以及资源可用性来规划您的迁移策略。 在迁移过程中,两个控制器均可同时运行。

  4. 为确保高可用性,请确保您的集群在每个区域中至少有两个工作节点。

  5. 在进行更改之前,请备份您当前的 Ingress 配置。

策略 1:使用不同的域名将 Ingress 配置分离

在保持生产环境继续使用 Ingress 的同时,通过独立环境测试 Traefik—— NGINX。 该策略可提供最大的隔离性和安全性。

在以下情况下使用此策略:

  • 在将生产环境的工作负载迁移过来之前,您需要对 Traefik 进行全面测试。
  • 您可以部署另一组应用程序用于测试。
  • 您拥有运行更多 ALB 的资源。
  • 您希望在测试期间,生产环境完全不受影响。

步骤

  1. 获取可用的 Traefik 版本。
    ibmcloud ks ingress alb versions
    
  2. 使用 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

  1. 对于 VPC 集群,请手动部署一个额外的 LoadBalancer 服务,用于测试。 将 spec.selector 设置为包含 app.kubernetes.io/vpcComponent: public-cr<cluster_id>-traefik (如果是私有ALB,则为 private-cr<cluster_id>-traefik )。 在 Classic 集群上,系统会自动配置一个新的负载均衡器,无需进行额外配置。

  2. 为 Traefik ALB 创建一个自定义域名,并将其指向负载均衡器的主机名或 IP 地址。 有关详细说明,请参阅 “创建自定义域名”。

  3. 使用 Traefik Ingress 类为测试应用程序创建一个 Ingress 资源。 请访问 步骤 3:创建 Ingress 资源,并指定 ingressClassName: public-iks-traefik (如果是私有 ALB,则为 private-iks-traefik )。

  4. 通过 Traefik 域名测试应用程序,并验证其功能。

  5. 测试完成后,请继续执行 “切换”操作,以迁移您的生产工作负载。

策略 2:处理相同工作负载的双负载均衡器

通过创建两个指向同一服务的 Ingress 资源,在相同的工作负载上测试这两个控制器。 您可以直接比较控制器的工作行为,而不会影响生产环境中的流量。

在以下情况下使用此策略:

  • 你想比较Ingress( NGINX )和Traefik在相同工作负载下的行为表现。
  • 您需要验证 Traefik 能否正确处理您的特定应用程序。
  • 您可以使用非生产环境域名进行测试。
  • 您希望尽可能减少所需的测试应用程序数量。

步骤

  1. 启用一个基于 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

  1. 对于 VPC 集群,请手动部署一个额外的 LoadBalancer 服务,用于测试。 将 spec.selector 设置为包含 app.kubernetes.io/vpcComponent: public-cr<cluster_id>-traefik (如果是私有ALB,则为 private-cr<cluster_id>-traefik )。 在 Classic 集群上,系统会自动配置一个新的负载均衡器,无需进行额外配置。

  2. 为 Traefik ALB 创建一个自定义域名,并将其指向负载均衡器的主机名或 IP 地址。 有关详细说明,请参阅 “创建自定义域名”。

  3. 创建第二个 Ingress 资源,该资源使用 Traefik Ingress 类,但指向与现有 Ingress( NGINX )相同的服務。 请按照 “步骤 3:创建 Ingress 资源”中的说明操作,并确保:

    • 指定 ingressClassName: public-iks-traefik (如果是私有 ALB,则指定 private-iks-traefik )
    • 请使用与您现有的 Ingress- NGINX Ingress 资源相同的 service.name 值
    • 请在“host”和“tls.hosts”字段中使用您的测试域名
  4. 请通过这两个域名测试您的应用程序。

    • 通过 Ingress- NGINX 域名(生产环境)访问
    • 通过 Traefik 域名(testing)访问
  5. 比较这两个控制器在行为、性能和功能方面的差异。

  6. 验证完成后,请继续执行 “切换”操作,将您的生产域迁移到 Traefik。

策略 3:拆分 DNS 测试

使用拆分 DNS 配置,在类似生产环境的条件下使用您的生产域名测试 Traefik,同时不会影响您的用户。

在以下情况下使用此策略:

  • 你想使用实际的生产域进行测试。
  • 您可以控制测试环境的 DNS 配置。
  • 您需要验证确切的生产环境配置。
  • 您希望尽可能减少测试环境与生产环境之间的差异。

步骤

  1. 启用一个基于 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

  1. 对于 VPC 集群,请手动部署一个额外的 LoadBalancer 服务,用于测试。 将 spec.selector 设置为包含 app.kubernetes.io/vpcComponent: public-cr<cluster_id>-traefik (如果是私有ALB,则为 private-cr<cluster_id>-traefik )。 在 Classic 集群上,系统会自动配置一个新的负载均衡器,无需进行额外配置。

  2. 获取新 Traefik ALB 的 IP 地址(经典模式)或主机名(VPC 模式)。

    ibmcloud ks ingress alb ls --cluster CLUSTER_NAME
    
  3. 在测试环境中配置拆分 DNS。

    • 对于您的测试机器或网络,请配置 DNS,将您的生产域解析到 Traefik ALB 的 IP 地址/主机名
    • 生产环境的用户继续将请求路由到 Ingress—— NGINX ALB
    • 这可以通过本地 /etc/hosts 文件、内部DNS服务器或VPN专用的DNS配置来实现
  4. 使用 Traefik Ingress 类,结合您的生产环境域名,创建一个新的 Ingress 资源。 请访问 步骤 3:创建 Ingress 资源,并在 host 和 tls.hosts 字段中分别指定 ingressClassName: public-iks-traefik (或私有 ALB 的 private-iks-traefik )以及您的生产域。

  5. 在您的拆分 DNS 环境中进行测试,以验证 Traefik 是否能与生产环境的域名和配置正常配合使用。

  6. 验证完成后,请继续执行 “切换”操作,将生产环境的 DNS 指向 Traefik。

策略 4:直接迁移

只需进行最少的配置更改和资源管理,即可直接从 Ingress( NGINX )切换到 Traefik。

该策略会在迁移期间导致服务中断。 在开始之前,请规划好维护窗口。

在以下情况下使用此策略:

  • 您的工作负载较小,或者运行的是非关键型应用程序。
  • 在迁移过程中,您可以接受短暂的服务中断。
  • 您希望尽可能减少需要管理的资源数量。
  • 您已经在另一个环境中验证了 Traefik 的兼容性。
  • 在 Classic 环境中,您必须保持 ALB 的 IP 地址不变,因为客户端是通过 IP 地址而非 DNS 域名进行连接的。

禁用并重新启用 ALB 时,其原始 IP 地址将得以保留,除非在此期间该 IP 地址已被其他服务占用。 有关详细信息,请参阅 “启用或禁用 ALB”。

步骤

  1. 获取当前 Ingress- NGINX ALB 的 ID。

    ibmcloud ks ingress alb ls --cluster CLUSTER_NAME
    
  2. 禁用 Ingress- NGINX ALB。

    ibmcloud ks ingress alb disable --alb ALB_ID --cluster CLUSTER_NAME
    

    VPC 集群:如果您禁用了最后一个公共或私有 ALB,请等待 ALB 部署及相应的负载均衡器服务资源被删除后,再启用 Traefik ALB。

  3. 使用某个版本的 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
```
  1. 对于 VPC 集群,请将负载均衡器的后端设置为 Traefik。

VPC 集群 sh {: pre} ibmcloud ks ingress load-balancer backend set --cluster CLUSTER-ID --public-backend traefik [--private-backend traefik]

  1. 更新您的 Ingress 资源,使其使用 Traefik Ingress 类。 如果您的资源显式设置了 Ingress 类,请将 spec.ingressClassName 中的 public-iks-k8s-nginx 更新为 public-iks-traefik (对于私有 ALB,则将 private-iks-k8s-nginx 更新为 private-iks-traefik )。

  2. 应用更新的 Ingress 资源。

    kubectl apply -f ingress.yaml
    
  3. 请确认您的应用程序可通过 Traefik 控制器访问。

    curl https://<domain>/<app_path>
    

迁移到 Traefik

测试完成后,将生产流量切换至使用 Traefik 控制器。 经典集群和 VPC 集群的操作步骤有所不同。 请选择与您的集群类型和配置相匹配的选项。

经典簇

对于经典集群,请将您的生产域更新为指向暴露 Traefik 的负载均衡器,而不是 Ingress—— NGINX。

选项 1:更新域名映射

  1. 获取您的 Traefik ALB 的 IP 地址。
    ibmcloud ks ingress alb ls --cluster CLUSTER_NAME
    
  2. 将您的域名指向 Traefik ALB。
    ibmcloud ks ingress domain update --cluster CLUSTER_NAME --domain DOMAIN_NAME --ip TRAEFIK_ALB_IP
    
  3. 验证域名更新。
    ibmcloud ks ingress domain ls --cluster CLUSTER_NAME
    
  4. 通过生产环境域名测试您的应用程序,以确保它们现在由 Traefik 提供服务。

选项 2:禁用 Ingress—— NGINX ALB

或者,您可以禁用所有基于 Ingress- NGINX 的 ALB,这将自动更新域名映射。

  1. 列出所有ALB,并识别出基于Ingress- NGINX 的ALB。
    ibmcloud ks ingress alb ls --cluster CLUSTER_NAME
    
  2. 禁用每个 Ingress- NGINX ALB。
    ibmcloud ks ingress alb disable --alb NGINX_ALB_ID --cluster CLUSTER_NAME
    
  3. 请确认您的域名现已指向 Traefik ALB。
    ibmcloud ks ingress domain ls --cluster CLUSTER_NAME
    

选项 3:保留 ALB IP 地址

如果您的客户直接连接到 ALB IP 地址而非 DNS 名称,您可以在迁移过程中保留这些 IP 地址。 要保留 IP 地址,需要暂时禁用 ALB,这会导致服务短暂中断。

禁用并重新启用 ALB 时,其原始 IP 地址将得以保留,除非该 IP 地址已被其他服务占用。

  1. 列出所有ALB,并识别基于Ingress- NGINX 的ALB,以获取其ID和IP地址。

    ibmcloud ks ingress alb ls --cluster CLUSTER_NAME
    
  2. 禁用 Ingress- NGINX ALB。 这会导致该IP地址的流量出现短暂的服务中断。

    ibmcloud ks ingress alb disable --alb ALB_ID --cluster CLUSTER_NAME
    
  3. 使用 Traefik 的某个版本重新启用 ALB,以便继续使用相同的 IP 地址。

    ibmcloud ks ingress alb enable classic --alb ALB_ID --version TRAEFIK_VERSION --cluster CLUSTER_NAME
    

    或者,创建一个新的ALB,并使用 --ip 标志来复用原始的IP地址。

  4. 更新您的 Ingress 资源,使其使用 Traefik Ingress 类。 如果您的资源显式设置了 Ingress 类,请将 spec.ingressClassName 中的 public-iks-k8s-nginx 更新为 public-iks-traefik (对于私有 ALB,则将 private-iks-k8s-nginx 更新为 private-iks-traefik )。

  5. 应用更新的 Ingress 资源。

    kubectl apply -f ingress.yaml
    
  6. 请确认您的应用程序可通过 Traefik 控制器访问。

    curl https://<domain>/<app_path>
    

VPC 集群

对于 VPC 集群,请将负载均衡器的后端更新为暴露 Traefik 而不是 Ingress—— NGINX。

选项 1:更新负载均衡器的后端

  1. 将负载均衡器更新为使用 Traefik 后端。
    ibmcloud ks ingress load-balancer backend set --cluster CLUSTER_NAME --public-backend traefik [--private-backend traefik]
    
  2. 验证负载均衡器的配置。
    ibmcloud ks ingress load-balancer get --cluster CLUSTER_NAME
    
  3. 测试您的应用程序,以确保它们现在由 Traefik 提供服务。

选项 2:禁用 Ingress—— NGINX ALB

或者,您可以禁用所有基于 Ingress- NGINX 的 ALB。

  1. 列出所有ALB,并识别出基于Ingress- NGINX 的ALB。
    ibmcloud ks ingress alb ls --cluster CLUSTER_NAME
    
  2. 禁用每个 Ingress- NGINX ALB。
    ibmcloud ks ingress alb disable --alb NGINX_ALB_ID --cluster CLUSTER_NAME
    
  3. 请确认负载均衡器现在是否已使用 Traefik ALB。
    ibmcloud ks ingress load-balancer get --cluster CLUSTER_NAME
    

迁移后任务

迁移到 Traefik 后,请完成以下任务:

  1. 迁移完成后,请监控您的应用程序,以查看是否有任何意外行为或错误。

  2. 更新内部文档,以反映使用 Traefik 进行的新 Ingress 配置。

  3. 删除所有不再需要的测试 ALB、域名或 Ingress 资源。

  4. 在确认 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 支持团队。