升级应用市场ack-ingress-nginx

应用市场中的ack-ingress-nginx和ack-ingress-nginx-v1提供了nginx ingress controller应用。本文介绍如何手动升级ack-ingress-nginx为ack-ingress-nginx-v1。

前提条件

  • 已有Kubernetes集群,且集群版本为1.20及以上。

说明

Chart版本4.0.17(对应组件版本v1.8.0-aliyun.1)及以上的ack-ingress-nginx-v1仅支持1.22及以上版本集群。若您的集群版本为1.20,需要选择4.0.16版本(对应组件版本v1.2.1-aliyun.1)进行部署。

  • 集群中存在从应用市场安装的ack-ingress-nginx应用。

背景信息

由于ACK Kubernetes 1.24版本弃用了v1beta1版本的Ingress资源,导致ACK Kubernetes 1.24版本中的旧版本Ingress Controller无法正常使用。

如果ack-ingress-nginx安装的Nginx Ingress Controller应用为0.44.0版本,该应用使用了v1beta1版本的Ingress资源,那么ACK Kubernetes升级到1.24版本后,会导致Nginx Ingress Controller应用不可用的情况。

出于对模板参数兼容性的考量,新版本Nginx Ingress Controller(版本≥1.1.0)使用ack-ingress-nginx-v1应用。您需要手动将ack-ingress-nginx替换为ack-ingress-nginx-v1,以完成应用版本的升级。

说明

该文档不适用于组件管理中提供的Nginx Ingress Controller组件。如需要升级Nginx Ingress Controller组件,请参见升级Nginx Ingress Controller组件

步骤一:创建ack-ingress-nginx-v1应用

通过应用市场创建ack-ingress-nginx-v1应用

对于每一套ack-ingress-nginx应用,您都需要为其部署对应的ack-ingress-nginx-v1。具体步骤以及参数配置,请参见部署多个Ingress Controller

说明

请勿将即将部署的ack-ingress-nginx-v1中controller.ingressClassResource.name与旧的ack-ingress-nginx中的controller.ingressClass设置成相同的值。Ingress Class的冲突可能会造成Ingress Controller的稳定性问题。

(可选)对SLB规格和参数进行调整

如果您之前对ack-ingress-nginx中的SLB规格或参数进行过调整,则可能需要同时对新部署的应用中的SLB参数也进行相同调整。通过参数中的Annotations controller.service(公网)或Annotation controller.service.internal(私网)对Service进行配置,创建对应的ack-ingress-nginx-v1。通过Annotations对Service进行配置的详细信息,请参见通过Annotation配置传统型负载均衡CLB

步骤二:创建Ingress路由规则并验证

创建完新的ack-ingress-nginx-v1应用后,为了不影响现有的流量和应用稳定性,您需要将原有的Ingress路由规则复制一份,修改Ingress Class后,应用到集群中。例如,原有Ingress路由规则如下。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx-intranet # 原Ingress Class为nginx-intranet。
spec:
  rules:
  - host: test-ingress.com
    http:
      paths:
      - path: /foo
        backend:
          service:
            name: web1-service
            port:
              number: 8080
        pathType: ImplementationSpecific
      - path: /bar
        backend:
          service:
            name: web1-service
            port:
              number: 8080
        pathType: ImplementationSpecific

创建新的Ingress路由规则。

  • 使用Annotation时,请更改Annotation中的Ingress Class名称,其他配置保持不变。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test-ingress-v1 # 需要创建新的Ingress资源
      namespace: default
      annotations:
        kubernetes.io/ingress.class: nginx-intranet-v1 # 更改为ack-ingress-nginx-v1使用的Ingress Class名称,示例为nginx-intranet-v1。
    spec:
      rules:
      - host: test-ingress.com
        http:
          paths:
          - path: /foo
            backend:
              service:
                name: web1-service
                port:
                  number: 8080
            pathType: ImplementationSpecific
          - path: /bar
            backend:
              service:
                name: web1-service
                port:
                  number: 8080
            pathType: ImplementationSpecific
  • 不使用Annotation,而是spec.ingressClassName指定Ingress Class时,请参考上述操作创建新的Ingress路由规则,且更改spec.ingressClassName中的Ingress Class名称。

在创建完新的Ingress路由规则后,您可以通过设置hosts,将域名解析到新的CLB IP上的方式,来验证功能是否正常。

步骤三:迁移流量

在Ingress路由规则新建完成并确认业务功能正常后,您可以通过更改DNS解析的方式来将流量迁移至新的ack-ingress-nginx-v1应用中。

登录云解析DNS控制台或者您的域名所在的解析控制台,将业务所在域名解析至新的IP上。解析需要一定时间才能生效,在此期间,请您密切关注业务状态,以便在发现问题时及时修复或回滚。您可以通过容器内日志或Metrics来监控流量迁移情况。

后续步骤

在流量全部迁移完成并确认业务正常后,即可删除原来的ack-ingress-nginx应用。您可以登录容器服务管理控制台,选择对应的集群,在左侧导航栏中选择应用 > Helm,找到对应的发布并单击右侧的删除