由于 Nginx Controller 各个版本支持的 Kubernetes 版本范围比较窄,所以用户会遇到 Nginx Controller 升级的相关问题。本文向您介绍通过新建实例实现过渡的方案,以帮助您顺利升级 Nginx Controller。
迁移升级示例
集群与 Nginx 实例相关信息
当前 Kubernetes 集群版本:1.20
当前 Nginx Addon 版本:1.2.0(Nginx Addon 是 Nginx Controller 的安装工具,您可以在插件列表查看该插件与版本)
当前 Nginx Controller 版本:v0.49.3(Nginx Controller 是实际运行的社区组件,您可以在 Nginx Controller 的工作负载中查询到镜像版本)
当前 Nginx Ingress Class:prod-0-49-3
说明:
集群如果升级到 1.22,有许多旧版本的社区 CRD 定义被废弃,Nginx Controller 版本低于v1.0.0将无法正常工作。所以大部分用户在这个集群版本升级时,需要对 Nginx Controller 进行升级。
升级过程
安装新版本 Nginx Controller 实例
参考 Nginx 的安装文档,安装v1.1.3版本的 Nginx,同时建议开启日志、监控。假定文档中的新实例 Ingress Class 为 prod-1-1-3 安装新版本 Nginx Controller 实例之后。参考原实例配置,调整 Workload 规格或 HPA,避免新实例出现容量问题。
迁移 Ingress 资源
将所有旧 Nginx Controller 相关资源复制到新实例中。n这里以其中一个 Ingress 资源为例,说明迁移过程:
apiVersion: extensions/v1beta1kind: Ingressmetadata:annotations:kubernetes.io/ingress.class: prod-0-49-3name: accessnamespace: defaultspec:rules:- host: www.exsample.comhttp:paths:- backend:serviceName: access-serverservicePort: 8080path: /pathType: ImplementationSpecificstatus:loadBalancer:ingress:- ip: 172.17.99.37
迁移注意事项:
1. 请保留原有 Ingress 不变,复制一个新的 Ingress 实例。请确保实例名称不能出现冲突。
2. 注意将新实例的 “kubernetes.io/ingress.class” 修改为 prod-1-1-3。
3. 请注意从 Kubernetes 1.22 版本开始,“apiVersion: extensions/v1beta1”已被删除。升级到 Nginx 版本1.1.3的同时,请将资源升级到 “apiVersion: networking.k8s.io/v1”。
4. 请注意,extensions/v1beta1 和 networking.k8s.io/v1 在 backend 内的字段格式有变化,您需要做出一定的调整。
5. 在将资源添加到集群后,Nginx Controller 会自动更新 status 的内容并提供新的 IP 地址。
apiVersion: networking.k8s.io/v1kind: Ingressmetadata:annotations:kubernetes.io/ingress.class: prod-1-1-3name: access-newnamespace: defaultspec:rules:- host: www.exsample.comhttp:paths:- backend:service:name: access-serverport:number: 8080path: /pathType: ImplementationSpecificstatus:loadBalancer:ingress:- ip: 172.17.22.11
测试、流量切换与回滚方案
1. 在本地通过 Host 绑定进行测试:
172.17.22.11 www.exsample.com
2. 测试通过之后,您可以更新 DNS 解析至新的 IP,以验证新的入口访问是否正常。
3. 如果在更新 DNS 解析配置后发现数据面流量异常,您可以通过回滚 DNS 解析配置的方式,将域名解析切换至旧实例,以恢复正常的流量。
4. 直到流量切换操作之前,在新旧版本并行存在的期间,旧版本的 Nginx Ingress 实例不会有任何变更。新实例的创建和测试都不会受到影响,这是一个相对安全可控的升级方案。
清理资源
在全部流量迁移至新实例之后,您可以按照以下步骤进行清理:
1. 可以先清理旧 Nginx Ingress 实例相关的 Ingress 资源。
2. 在控制台中销毁 Nginx Ingress 实例。