應用市場中的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應用。您可以登錄容器服務管理控制臺,選擇對應的集群,在左側導航欄中選擇 ,找到對應的發布并單擊右側的刪除。