如果您在Container ServiceACK控制台的組件管理頁面CoreDNS組件上無法看到升級按鈕,且當前組件版本較低,說明您的叢集無法進行CoreDNS的自動升級。針對無法自動升級CoreDNS的情況,您可以手動升級CoreDNS。本文介紹CoreDNS手動升級的操作步驟。
前提條件
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
升級CoreDNS過程說明
如果您使用了IPVS作為kube-proxy負載平衡模式,在CoreDNS升級完成後,您可能會遇到五分鐘內全叢集範圍內的解析逾時或失敗的情況,通過以下任意方式可以降低IPVS缺陷的影響:
修改kube-proxy中IPVS UDP會話保持的逾時時間。具體操作,請參見如何修改kube-proxy中IPVS UDP會話保持的逾時時間?
使用節點DNS緩衝NodeLocal DNSCache。具體操作,請參見使用節點DNS緩衝NodeLocal DNSCache。
升級過程約2分鐘,實際耗時可能和叢集中CoreDNS副本數相關。如果遇到新副本無法調度或啟動的情況,可提交工單諮詢。舊的副本不會被停止,不影響業務解析。
手動升級
確認叢集版本與CoreDNS版本的相容性。
您需要先確認叢集版本號碼,然後再確認與CoreDNS 1.6.2版本的相容性。ACK Kubernetes叢集版本與CoreDNS 1.6.2版本相容情況如下表(Kubernetes 1.11/1.12/1.14/1.16均相容CoreDNS 1.6.2版本)。
版本
相容資訊
Kubernetes版本
1.11
1.12
1.14
1.16
CoreDNS
1.6.2
1.6.2
1.6.2
1.6.2
確認叢集版本號碼的操作步驟如下:
在控制台左側導覽列,單擊叢集。
在叢集列表中,找到目的地組群,然後查看叢集Kubernetes版本。
確認叢集CoreDNS的版本。
您可以在ACK控制台確認CoreDNS的版本。
在控制台左側導覽列中,單擊叢集。
在叢集列表頁面中,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁面左側導覽列選擇
。在無狀態頁面頂部設定命名空間為kube-system,然後查看CoreDNS的版本。
您還可以通過以下kubectl命令尋找CoreDNS的版本。
kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"
預期輸出:
registry-vpc.cn-hangzhou.aliyuncs.com/acs/coredns:1.3.1
變更CoreDNS配置項。
1.6.2版本CoreDNS廢棄了Proxy外掛程式,使用forward來替代。您需要先將kube-system命名空間下的配置項coredns內的proxy欄位替換為forward欄位。
您可以在ACK控制台上更新配置項coredns。
在控制台左側導覽列中,單擊叢集。
在叢集列表頁面中,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁面左側導覽列選擇
。在配置項頁面頂部設定命名空間為kube-system,然後單擊coredns右側操作列下的YAML編輯。
在查看YAML面板,將proxy修改為forward,然後單擊確定。
您還可以通過kubectl命令變更配置項CoreDNS。
# 開啟編輯。 kubectl edit configmap/coredns -n kube-system # 替換proxy欄位為forward。 # 儲存並退出。
查看CoreDNS Pod的標準輸出是否正常重新載入了配置(熱載入新配置一般需要30s)。
執行以下命令,查看叢集內的CoreDNS Pod,確定其是否處於運行狀態。
kubectl get pods -n kube-system | grep coredns
預期輸出:
coredns-78d4b8bd88-6g62w 1/1 Running 0 9d coredns-78d4b8bd88-n6wjm 1/1 Running 0 9d
執行以下命令,查看CoreDNS Pod的日誌。
kubectl logs coredns-78d4b8bd88-n6wjm -n kube-system
預期輸出:
.:53 [INFO] plugin/reload: Running configuration MD5 = 71c5f1ff539d304c630521f315dc2ac2 CoreDNS-1.6.7 linux/amd64, go1.13.6, da7f65b [INFO] 127.0.0.1:48329 - 42313 "HINFO IN 1108347002237365533.4506541768939609094. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.008874794s
預期輸出中包含
plugin/reload
資訊,說明載入了CoreDNS配置。
變更CoreDNS應用內鏡像版本到1.6.2。
通過控制台操作。
在控制台左側導覽列中,單擊叢集。
在叢集列表頁面中,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁面左側導覽列選擇
。在無狀態頁面頂部設定命名空間為kube-system,找到coredns,然後在其右側選擇
。在編輯YAML頁面,更新image中的版本為1.6.2。然後單擊更新。
通過kubectl命令操作。
# 開啟編輯。 kubectl edit deployment/coredns -n kube-system # 變更鏡像版本到1.6.2。 # 儲存並退出。
驗證結果。
執行以下命令查看叢集內所有CoreDNS Pod是否都處於Running的正常狀態。
kubectl get pods -n kube-system | grep coredns
預期輸出:
coredns-78d4b8****-6g62w 1/1 Running 0 9d coredns-78d4b8****-n6wjm 1/1 Running 0 9d
配置IPVS類型叢集的UDP逾時時間
如果您的ACK叢集使用了kube-proxy IPVS模式,IPVS的會話保持策略會導致整個叢集在升級完成後五分鐘內出現機率性解析失敗的問題。您可以按以下方式降低IPVS UDP類型的會話保持逾時時間至10秒,以減少解析失敗的次數。如果您ACK叢集中包含UDP類型的業務,需要您提前評估該操作是否有影響再執行該操作。如果您無法評估,您可以提交工單諮詢。
如果您的叢集不是IPVS類型,請忽略配置IPVS類型叢集的UDP逾時時間的操作。關於如何查看kube-proxy代理模式,請參見查看叢集資訊。
K8s 1.18及以上版本叢集
控制台操作方式
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在頂部選擇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。