應用市場中的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應用中。
登入Alibaba Cloud DNS控制台或者您的網域名稱所在的解析控制台,將業務所在網域名稱解析至新的IP上。解析需要一定時間才會生效,在此期間,請您密切關注業務狀態,以便在發現問題時及時修複或復原。您可以通過容器內日誌或Metrics來監控流量遷移情況。
後續步驟
在流量全部遷移完成並確認業務正常後,即可刪除原來的ack-ingress-nginx應用。您可以登入Container Service管理主控台,選擇對應的叢集,在左側導覽列中選擇 ,找到對應的發布並單擊右側的刪除。