CoreDNS自動(dòng)升級
本文介紹CoreDNS升級前的檢查和優(yōu)化操作,以及自動(dòng)升級的步驟。
前提條件
已通過kubectl工具連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
升級CoreDNS過程說明
CoreDNS升級過程中,ACK會用新版本的YAML模板覆蓋您集群中舊版本的CoreDNS YAML模板,其中CoreDNS的配置文件會被自動(dòng)升級,但CoreDNS的副本數(shù)不會變化。
若您此前對YAML模板進(jìn)行手動(dòng)自定義變更,修改了容忍Toleration、內(nèi)存和CPU的資源請求和限制等字段,將會被覆蓋。針對這種情況,您可以手動(dòng)升級CoreDNS,或者在自動(dòng)升級CoreDNS后再次更新YAML模板內(nèi)容。關(guān)于如何手動(dòng)升級,請參見CoreDNS手動(dòng)升級。
如果您使用了IPVS作為kube-proxy負(fù)載均衡模式,在CoreDNS升級完成后,您可能會遇到五分鐘內(nèi)全集群范圍內(nèi)的解析超時(shí)或失敗的情況,通過以下任意方式可以降低IPVS缺陷的影響:
修改kube-proxy中IPVS UDP會話保持的超時(shí)時(shí)間,具體操作,請參見如何修改kube-proxy中IPVS UDP會話保持的超時(shí)時(shí)間?。
使用節(jié)點(diǎn)DNS緩存NodeLocal DNSCache,具體操作,請參見使用節(jié)點(diǎn)DNS緩存NodeLocal DNSCache。
如果集群節(jié)點(diǎn)采用Alibaba Cloud Linux 2,建議您將節(jié)點(diǎn)內(nèi)核升級至4.19.91-25.1.al7.x86_64或更新版本,關(guān)于Alibaba Cloud Linux 2的版本記錄,請參見Alibaba Cloud Linux 2鏡像發(fā)布記錄。
如果集群節(jié)點(diǎn)采用其它操作系統(tǒng),您可以配置IPVS類型集群的UDP超時(shí)時(shí)間避免此問題。具體操作,請參見配置IPVS類型集群的UDP超時(shí)時(shí)間。
如果您不希望執(zhí)行上述操作,可以將所有業(yè)務(wù)容器接入NodeLocal DNSCache后再進(jìn)行CoreDNS升級。具體操作,請參見使用NodeLocal DNSCache。
升級過程約2分鐘,實(shí)際耗時(shí)可能和集群中CoreDNS副本數(shù)相關(guān)。如果遇到新副本無法調(diào)度或啟動(dòng)的情況,可提交工單咨詢。但舊的副本不會被停止,因此不影響業(yè)務(wù)解析,升級十分鐘內(nèi)系統(tǒng)會自動(dòng)回滾。
開啟ready
插件
如果您之前有手動(dòng)升級CoreDNS且當(dāng)前CoreDNS版本大于1.5.0,那您在自動(dòng)升級CoreDNS之前,需要檢查CoreDNS配置文件是否已經(jīng)開啟ready
插件。如果配置文件中沒有ready
插件,您需要開啟ready
插件,然后再進(jìn)行自動(dòng)升級CoreDNS操作,否則CoreDNS將無法正常啟動(dòng)。
在控制臺左側(cè)導(dǎo)航欄,單擊集群。
在集群列表頁面,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的詳情。
在集群管理頁左側(cè)導(dǎo)航欄,選擇 。
在配置項(xiàng)頁面頂部設(shè)置命名空間為kube-system,然后單擊coredns右側(cè)操作列下的YAML編輯。
在查看YAML面板檢查是否有
ready
字段,如果沒有,請?zhí)砑?span data-tag="ph" id="codeph-116-x0e-06t" class="ph">ready
字段,然后單擊確定。apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready #如果沒有這一行,請?jiān)黾颖拘?,注意縮進(jìn)與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 }
執(zhí)行以下命令,檢查CoreDNS Pod的標(biāo)準(zhǔn)輸出是否加載了CoreDNS配置。熱加載新配置一般需要30s。
kubectl logs coredns-78d4b8bd88-n6wjm -n kube-system
預(yù)期輸出中包含
plugin/reload
信息,說明加載了CoreDNS配置。
開始升級
您可以通過控制臺的組件管理入口進(jìn)行CoreDNS的版本升級。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在組件管理頁面,搜索CoreDNS,然后單擊升級。
配置IPVS類型集群的UDP超時(shí)時(shí)間
如果您的ACK集群使用了kube-proxy IPVS模式,IPVS的會話保持策略會導(dǎo)致整個(gè)集群在升級完成后五分鐘內(nèi)出現(xiàn)概率性解析失敗的問題。您可以按以下方式降低IPVS UDP類型的會話保持超時(shí)時(shí)間至10秒,以減少解析失敗的次數(shù)。如果您ACK集群中包含UDP類型的業(yè)務(wù),需要您提前評估該操作是否有影響再執(zhí)行該操作。如果您無法評估,您可以提交工單咨詢。
如果您的集群不是IPVS類型,請忽略配置IPVS類型集群的UDP超時(shí)時(shí)間的操作。關(guān)于如何查看kube-proxy代理模式,請參見查看集群信息。
K8s 1.18及以上版本集群
控制臺操作方式
在控制臺左側(cè)導(dǎo)航欄,單擊集群。
在集群列表頁面,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的詳情。
在集群管理頁左側(cè)導(dǎo)航欄,選擇 。
在頂部選擇kube-system命名空間,然后單擊配置項(xiàng)kube-proxy-worker右側(cè)的YAML編輯。
在查看YAML面板中的ipvs字段下,添加
udpTimeout: 10s
,然后單擊確定。apiVersion: v1 data: config.conf: | apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration # 其它不相關(guān)字段已省略。 mode: ipvs # 如果ipvs鍵不存在,需要添加此鍵。 ipvs: udpTimeout: 10s
重建所有名為kube-proxy-worker的容器。
在集群管理頁左側(cè)導(dǎo)航欄中,選擇 。
在守護(hù)進(jìn)程集列表中,找到并單擊kube-proxy-worker。
在kube-proxy-worker頁面中的容器組頁簽下對應(yīng)容器組右側(cè),選擇 ,然后單擊確定。
重復(fù)操作刪除所有容器組。刪除容器組后,系統(tǒng)會自動(dòng)重建所有容器。
驗(yàn)證UDP超時(shí)時(shí)間的配置是否成功。
執(zhí)行以下命令安裝ipvsadm。
ipvsadm是IPVS模塊的管理工具。更多信息,請參見ipvsadm。
sudo yum install -y ipvsadm
在集群任意一臺ECS節(jié)點(diǎn)中執(zhí)行以下命令查看第三個(gè)數(shù)字。
sudo ipvsadm -L --timeout
如果輸出結(jié)果中第三個(gè)數(shù)字是10,則說明IPVS類型集群的UDP超時(shí)時(shí)間變更成功。
說明變更成功后,請觀察至少五分鐘后再進(jìn)行下一步操作。
命令行操作方式
執(zhí)行以下命令修改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 # 其它不相關(guān)字段已省略。 mode: ipvs # 如果ipvs鍵不存在,需要添加此鍵。 ipvs: udpTimeout: 10s
執(zhí)行以下命令重建所有名為kube-proxy-worker的容器。
執(zhí)行以下命令查看存在的容器組信息。
kubectl -n kube-system get pod -o wide | grep kube-proxy-worker
執(zhí)行以下命令刪除上步驟中查看所有容器,系統(tǒng)將會自動(dòng)重建名為kube-proxy-worker容器。
kubectl -n kube-system delete pod <kube-proxy-worker-****>
說明將<kube-proxy-worker-****>替換為上述打印的所有容器組名稱。
驗(yàn)證UDP超時(shí)時(shí)間的配置是否成功。
執(zhí)行以下命令安裝ipvsadm。
ipvsadm是IPVS模塊的管理工具。更多信息,請參見ipvsadm。
sudo yum install -y ipvsadm
在集群任意一臺ECS節(jié)點(diǎn)中執(zhí)行以下命令查看第三個(gè)數(shù)字。
sudo ipvsadm -L --timeout
如果輸出結(jié)果中第三個(gè)數(shù)字是10,則說明IPVS類型集群的UDP超時(shí)時(shí)間變更成功。
說明變更成功后,請觀察至少五分鐘后再進(jìn)行下一步操作。
K8s 1.16及以下版本集群
此類版本集群的kube-proxy不支持udpTimeout參數(shù),推薦使用OOS服務(wù)批量在所有集群機(jī)器上執(zhí)行ipvsadm
命令以調(diào)整UDP超時(shí)時(shí)間配置。命令如下:
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
關(guān)于OOS的批量操作實(shí)例介紹,請參見批量操作實(shí)例。
后續(xù)步驟
升級完成后,您可以對CoreDNS進(jìn)行優(yōu)化,合理配置CoreDNS。具體操作,請參見合理配置CoreDNS。