本文介紹CoreDNS升級前的檢查和最佳化操作,以及自動升級的步驟。
前提條件
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
升級CoreDNS過程說明
CoreDNS升級過程中,ACK會通過更新YAML模板對CoreDNS的Deployment以RollingUpgrade模式進行升級:在新版本的CoreDNS Pod成功運行後,才會刪除舊版本的Pod,升級後CoreDNS的Pod數量不會變更。但如果舊版本Pod仍有正在處理中的DNS解析,可能會導致解析失敗。在這種情況下,請通過使用NodeLocal DNSCache組件保證叢集中DNS服務的可用性。
若此前對YAML模板進行手動自訂變更,修改了容忍Toleration、記憶體和CPU的資源請求和限制等欄位,這些修改將會被覆蓋。針對這種情況,請手動升級CoreDNS,或者在自動升級CoreDNS後再次更新YAML模板內容。關於如何手動升級,請參見非託管CoreDNS手動升級。
如果使用了IPVS作為kube-proxy負載平衡模式,在CoreDNS升級完成後,可能會出現五分鐘內全叢集範圍內的解析逾時或失敗的情況,通過以下任意方式可以降低IPVS缺陷的影響:
修改kube-proxy中IPVS UDP會話保持的逾時時間,具體操作,請參見如何修改kube-proxy中IPVS UDP會話保持的逾時時間?。
使用節點DNS緩衝NodeLocal DNSCache,具體操作,請參見使用NodeLocal DNSCache。
如果叢集節點採用Alibaba Cloud Linux 2,建議將節點核心升級至4.19.91-25.1.al7.x86_64或更新版本,關於Alibaba Cloud Linux 2的版本記錄,請參見Alibaba Cloud Linux 2鏡像發布記錄。
如果叢集節點採用其它作業系統,可以配置IPVS類型叢集的UDP逾時時間避免此問題。具體操作,請參見配置IPVS類型叢集的UDP逾時時間。
如果不希望執行上述操作,可以將所有業務容器接入NodeLocal DNSCache後再進行CoreDNS升級。具體操作,請參見使用NodeLocal DNSCache組件。
升級過程約2分鐘,實際耗時可能和叢集中CoreDNS副本數相關。升級採用了優雅終止策略,舊的副本不會立即停止,因此不影響業務解析。升級若因各種異常導致失敗,十分鐘內系統會自動復原。
開啟ready外掛程式
如果之前手動升級過CoreDNS且當前CoreDNS版本大於1.5.0,那麼在自動升級CoreDNS之前,請檢查CoreDNS設定檔是否已經開啟ready外掛程式。如果設定檔中沒有ready外掛程式,請開啟ready外掛程式,然後再進行自動升級CoreDNS操作,否則CoreDNS將無法正常啟動。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在配置項頁面頂部設定命名空間為kube-system,然後單擊coredns右側操作列下的YAML 編輯。
在查看YAML面板檢查是否有
ready欄位,如果沒有,請添加ready欄位,然後單擊確定。apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready #如果沒有這一行,請增加本行,注意縮排與kubernetes保持一致。 kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop log reload loadbalance }執行以下命令,檢查CoreDNS Pod的標準輸出是否載入了CoreDNS配置。熱載入新配置一般需要30s。
kubectl logs coredns-78d4b8bd88-n6wjm -n kube-system預期輸出中包含
plugin/reload資訊,說明載入了CoreDNS配置。
開始升級
通過控制台的組件管理入口進行CoreDNS的版本升級。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在組件管理頁面,搜尋CoreDNS,然後單擊升級。
配置IPVS類型叢集的UDP逾時時間
如果叢集使用了kube-proxy IPVS模式,IPVS的會話保持策略會導致整個叢集在升級完成後五分鐘內出現機率性解析失敗的問題。請按以下方式降低IPVS UDP類型的會話保持逾時時間至10秒,以減少解析失敗的次數。如果叢集中包含UDP類型的業務,請在操作前評估該操作是否有影響。
如果叢集不是IPVS類型,請忽略配置IPVS類型叢集的UDP逾時時間的操作。關於如何查看kube-proxy代理模式,請參見查看叢集資訊。
K8s 1.18及以上版本叢集
控制台操作方式
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在配置項頁面選擇kube-system命名空間,然後單擊配置項kube-proxy-worker操作列的YAML 編輯。
在查看YAML面板中的ipvs欄位下,添加
udpTimeout: 10s,然後單擊確定。apiVersion: v1 data: config.conf: | apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration # 其它不相關欄位已省略。 mode: ipvs # 如果ipvs鍵不存在,需要添加此鍵。 ipvs: udpTimeout: 10s重建所有名為kube-proxy-worker的容器。
在叢集資訊頁左側導覽列中,選擇。
在守護進程集列表中,找到並單擊kube-proxy-worker。
在kube-proxy-worker頁面中的容器組頁簽下對應容器組右側,選擇,然後單擊確定。
重複操作刪除所有容器組。刪除容器組後,系統會自動重建所有容器。
驗證UDP逾時時間的配置是否成功。
執行以下命令安裝ipvsadm。
ipvsadm是IPVS模組的管理工具。更多資訊,請參見ipvsadm。
sudo yum install -y ipvsadm在叢集任意一台ECS節點中執行以下命令查看第三個數字。
sudo ipvsadm -L --timeout如果輸出結果中第三個數字是10,則說明IPVS類型叢集的UDP逾時時間變更成功。
變更成功後,請觀察至少五分鐘後再進行下一步操作。
命令列操作方式
執行以下命令修改kube-proxy的設定檔kube-proxy-worker。
kubectl -n kube-system edit configmap kube-proxy-worker在kube-proxy設定檔中的ipvs欄位下,添加
udpTimeout: 10s並儲存退出。apiVersion: v1 data: config.conf: | apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration # 其它不相關欄位已省略。 mode: ipvs # 如果ipvs鍵不存在,需要添加此鍵。 ipvs: udpTimeout: 10s執行以下命令重建所有名為kube-proxy-worker的容器。
執行以下命令查看存在的容器組資訊。
kubectl -n kube-system get pod -o wide | grep kube-proxy-worker執行以下命令刪除上步驟中查看所有容器,系統將會自動重建名為kube-proxy-worker容器。
kubectl -n kube-system delete pod <kube-proxy-worker-****>將<kube-proxy-worker-****>替換為上述所有容器組名稱。
驗證UDP逾時時間的配置是否成功。
執行以下命令安裝ipvsadm。
ipvsadm是IPVS模組的管理工具。更多資訊,請參見ipvsadm。
sudo yum install -y ipvsadm在叢集任意一台ECS節點中執行以下命令查看第三個數字。
sudo ipvsadm -L --timeout如果輸出結果中第三個數字是10,則說明IPVS類型叢集的UDP逾時時間變更成功。
變更成功後,請觀察至少五分鐘後再進行下一步操作。
K8s 1.16及以下版本叢集
此類版本叢集的kube-proxy不支援udpTimeout參數,推薦使用OOS服務批量在所有叢集機器上執行ipvsadm命令以調整UDP逾時時間配置。命令如下:
sudo yum install -y ipvsadm
sudo ipvsadm -L --timeout > /tmp/ipvsadm_timeout_old
sudo ipvsadm --set 900 120 10
sudo ipvsadm -L --timeout > /tmp/ipvsadm_timeout_new
diff /tmp/ipvsadm_timeout_old /tmp/ipvsadm_timeout_new關於OOS的大量操作執行個體介紹,請參見大量操作執行個體。
後續步驟
升級完成後,可以對CoreDNS進行最佳化,合理配置CoreDNS。具體操作,請參見最佳化CoreDNS配置。