在組件安裝、升級、更改配置等過程中出現異常問題時,控制台通常會提示相應的操作異常碼。您可以根據操作異常碼尋找對應的問題,查看問題原因和解決方案。本文介紹操作異常碼及其問題原因和解決方案。
AddonOperationFailed.ResourceExists
問題原因
該組件包含的部分資源已經存在於叢集中,組件無法直接安裝。該現象可能由以下原因造成。
已經通過其他途徑在叢集中安裝了該組件的其他版本,例如社區版本等。
此前使用Helm v2安裝過該組件,在升級Helm v3之前沒有遷移或卸載組件。
叢集中的已建立的某些資源與該組件包含的資源同名。
解決方案
不同原因的解決方案相同,您需要清理叢集中存在衝突的資源。具體的資源資訊可以從錯誤資訊中擷取,以下列錯誤訊息為例。
Addon status not match, failed upgrade helm addon arms-cmonitor for cluster c3cf94b952cd34b54b71b10b7********, err: rendered manifests contain a resource that already exists. Unable to continue with update: ConfigMap "otel-collector-config" in namespace "arms-prom" exists and cannot be imported into the current release
該資訊表示您需要先刪除arms-prom命名空間下名稱為otel-collector-config的ConfigMap。
針對部分特定組件,可以參考下列說明解決資源衝突問題。
arms-prometheus
如果在安裝或升級arms-prometheus時遇到資源衝突問題,請您刪除之前安裝arms-prometheus的命名空間(一般為arms-prom),然後執行如下命令,手動清理以下資源後再試。
kubectl delete ClusterRole arms-kube-state-metrics kubectl delete ClusterRole arms-node-exporter kubectl delete ClusterRole arms-prom-ack-arms-prometheus-role kubectl delete ClusterRole arms-prometheus-oper3 kubectl delete ClusterRole arms-prometheus-ack-arms-prometheus-role kubectl delete ClusterRole arms-pilot-prom-k8s kubectl delete ClusterRoleBinding arms-node-exporter kubectl delete ClusterRoleBinding arms-prom-ack-arms-prometheus-role-binding kubectl delete ClusterRoleBinding arms-prometheus-oper-bind2 kubectl delete ClusterRoleBinding kube-state-metrics kubectl delete ClusterRoleBinding arms-pilot-prom-k8s kubectl delete ClusterRoleBinding arms-prometheus-ack-arms-prometheus-role-binding kubectl delete Role arms-pilot-prom-spec-ns-k8s kubectl delete Role arms-pilot-prom-spec-ns-k8s -n kube-system kubectl delete RoleBinding arms-pilot-prom-spec-ns-k8s kubectl delete RoleBinding arms-pilot-prom-spec-ns-k8s -n kube-system
ack-node-local-dns
如果在升級ack-node-local-dns時遇到資源衝突問題,請執行如下命令,手動清理以下資源後再試。
重要刪除這些資源不會對您的業務產生影響,但在刪除資源之後到再次升級成功的這段時間內,請盡量避免新增容器Pod。如果在這期間有新增容器Pod,建議在組件升級完成後對新增Pod進行刪除重建,以重新注入DNS緩衝。
kubectl delete MutatingWebhookConfiguration ack-node-local-dns-admission-controller
arms-cmonitor
如果在安裝或升級arms-cmonitor時遇到資源衝突問題,請執行如下命令,手動清理以下資源後再試。
kubectl delete ConfigMap otel-collector-config -n arms-prom kubectl delete ClusterRoleBinding arms-prom-cmonitor-role-binding kubectl delete ClusterRoleBinding arms-prom-cmonitor-install-init-role-binding kubectl delete ClusterRole arms-prom-cmonitor-role kubectl delete ClusterRole arms-prom-cmonitor-install-init-role kubectl delete ServiceAccount cmonitor-sa-install-init -n kube-system
AddonOperationFailed.ReleaseNameInUse
問題原因
該組件使用Helm安裝,叢集中已存在同名的Helm Release執行個體,無法直接安裝或升級組件。該現象可能由以下原因造成。
已經通過其他途徑在叢集中安裝了該組件的其他版本,例如社區版本等。
此前安裝的Helm Release刪除後未完全清理。
解決方案
不同原因的解決方案相同,請先清理叢集中已存在的執行個體,操作步驟如下。
登入Container Service管理主控台,在左側導覽列單擊叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇
。在Helm應用列表中尋找同名的Helm Release,Helm Release名稱與組件名稱相同。然後單擊操作列的刪除,選中清除發布記錄,將同名Release刪除。
確認刪除完成後,重新安裝或升級組件。
AddonOperationFailed.WaitForAddonReadyTimeout
問題原因
組件變更已下發,但組件Pod沒有到達就緒狀態,導致組件變更無法完成。
排查方法
通過查看叢集事件判斷組件Pod無法就緒的原因,操作步驟如下。
登入Container Service管理主控台,在左側導覽列單擊叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇
。在事件列表頁簽中,選擇組件所在的命名空間,類型選擇Pod,層級選擇Warning,查看對應的事件。
在查詢到的事件列表中查看組件Pod相關的例外狀況事件,根據事件內容和詳細描述初步判斷Pod未就緒的原因。一些常見例外狀況事件類型、原因和解決方案,請參見下文常見異常原因和解決方案。
常見異常原因和解決方案
原因一:Pod無法被調度
對應事件內容:FailedScheduling
原因詳述:叢集中的節點無法滿足Pod的調度要求,可能由以下一種或多種原因導致。可以通過事件的詳細描述確定具體原因。
叢集節點可用的CPU、記憶體資源不足,無法滿足組件Pod的資源需求,對應事件描述中存在Insufficient memory或Insufficient cpu等字樣;
節點存在組件Pod未容忍的汙點,對應事件描述中存在the pod didn't tolerate等字樣;
節點數量過少,無法滿足組件Pod的反親和性要求,對應事件描述中存在didn't match pod anti-affinity rules等字樣。
解決方案:可以參考以下方法滿足組件Pod的調度要求,處理完成之後再次嘗試組件變更操作。
檢查節點的汙點,刪除不必要的汙點。具體操作,請參見管理節點汙點。
刪除或減少不必要的Pod。具體操作,請參見管理容器組(Pod)。
在叢集中添加新的節點。具體操作,請參見建立節點池。
為節點進行升配。具體操作,請參見升配Worker節點的資源。
原因二:Pod建立失敗
對應事件內容:FailedCreatePodSandBox
原因詳述:Pod sandbox建立失敗,常見原因是網路外掛程式無法為Pod分配IP地址。
解決方案:
如果事件描述中包含vSwitch have insufficient IP等字樣,請擴容Terway情境下的Pod虛擬交換器。具體操作,請參見擴容Terway情境下的Pod虛擬交換器。
如果事件描述中包含transport: Error while dialing等字樣,請檢查叢集網路外掛程式是否工作正常。檢查方法,請參見Pod異常問題排查。
AddonOperationFailed.APIServerUnreachable
問題原因
ACK無法訪問叢集APIServer,可能由叢集APIServer SLB等資源異常或配置錯誤導致。
解決方案
請參見當前叢集APIServer請求異常ErrorQueryClusterNamespace或APIServer.500進行排查。
AddonOperationFailed.ResourceNotFound
問題原因
組件相關資源查詢異常,無法直接升級,可能由於相關資源被手工修改或刪除導致。
解決方案
請先卸載該組件,然後重新安裝最新版本。
AddonOperationFailed.TillerUnreachable
問題原因
安裝組件時使用Helm v2且依賴叢集中的tiller,或者升級組件時依賴叢集中的tiller,而tiller出現異常,無法訪問,導致組件相關操作無法執行。
解決方案
可以嘗試重啟叢集中的tiller解決異常問題,操作步驟如下。
登入Container Service管理主控台,在左側導覽列單擊叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇
。切換到kube-system命名空間,在列表中尋找名為tiller的容器組,將其刪除,等待重新拉起。
等待tiller pod到達就緒狀態後,再次嘗試組件操作。
AddonOperationFailed.FailedCallingWebhook
問題原因
叢集中配置了針對某些資源的Mutating Webhook,並且Webhook服務無法正常調用,導致組件包含的資源無法正常變更。
解決方案
排查相關Webhook服務存在的異常,待Webhook恢複正常後再嘗試組件變更操作。存在異常的Webhook服務可以從錯誤訊息中擷取。以下列錯誤訊息為例。
failed to create: Internal error occurred: failed calling webhook "rancher.cattle.io": failed to call webhook: Post "https://rancher-webhook.cattle-system.svc:443/v1/webhook/mutation?timeout=10s": no endpoints available for service "rancher-webhook"
該資訊表明rancher-webhook存在異常。
AddonOperationFailed.UserForbidden
問題原因
叢集使用了Helm v2,並且沒有為tiller配置正確的RBAC許可權,tiller無法正常查詢和更新資源,導致組件無法安裝或升級。
解決方案
為tiller配置RBAC許可權。詳細資料,請參見Role-based Access Control。
AddonOperationFailed.TillerNotFound
問題原因
叢集使用了Helm v2,但叢集中沒有處於正常狀態的tiller pod,導致組件操作無法通過Helm發起。
解決方案
可以檢查kube-system命名空間下名稱首碼為tiller-deploy的Pod,將該Pod恢複正常狀態後再次嘗試組件操作。Pod異常問題排查,請參見Pod異常問題排查。
AddonOperationFailed.ErrPatchingClusterRoleBinding
問題原因
叢集中已存在該組件依賴的同名ClusterRoleBinding,但定義存在差異,無法直接升級。一般是由於叢集內已經安裝該組件的社區版本導致。
解決方案
如果希望安裝或升級該組件,請先清理叢集中已存在的版本,操作步驟如下。
登入Container Service管理主控台,在左側導覽列單擊叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇
。在Helm應用列表中尋找同名的Helm Release,Helm Release名稱與組件名稱相同。然後單擊操作列的刪除,選中清除發布記錄,將同名release刪除。
確認刪除完成後,重新安裝或升級組件。
AddonOperationFailed.ErrApplyingPatch
問題原因
該組件新舊版本的YAML模板存在無法相容的問題,導致組件無法正常升級。該現象可能由於以下原因造成:
已經通過其他途徑在叢集中安裝了該組件的其他版本,例如社區版本等。
手動修改過組件的YAML模板。
當前組件舊版本已經不再維護。
解決方案
您可能需要根據報錯資訊對當前叢集已安裝的組件模板進行手動處理。具體解決方案,可提交工單諮詢。
樣本
例如,由於叢集安裝的舊版Flannel版本已經不再維護,升級時存在Container Name衝突的問題,導致組件升級失敗。報錯如下:
spec.template.spec.initContainers[1].name: Duplicate value: \"install-cni\"
解決此類問題,您可以通過執行命令kubectl -n kube-system edit ds kube-flannel-ds
,編輯Flannel的YAML模板,刪除spec.template.spec.containers
欄位中名為install-cni
的一整段container
定義(刪除範例程式碼的7~21行注釋行)。
containers:
- name: kube-flannel
image: registry-vpc.{{.Region}}.aliyuncs.com/acs/flannel:{{.ImageVersion}}
command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr" ]
...
# 此處省略,刪除7~21注釋行。
# - command:
# - /bin/sh
# - -c
# - set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf;
# while true; do sleep 3600; done
# image: registry-vpc.cn-beijing.aliyuncs.com/acs/flannel:v0.11.0.1-g6e46593e-aliyun
# imagePullPolicy: IfNotPresent
# name: install-cni
# resources: {}
# terminationMessagePath: /dev/termination-log
# terminationMessagePolicy: File
# volumeMounts:
# - mountPath: /etc/cni/net.d
# name: cni
# - mountPath: /etc/kube-flannel/
# 以下省略,刪除7~21注釋行。
name: flannel-cfg
...
刪除上述YAML模板片段不會導致業務中斷,片段刪除後Flannel容器會自動進行變換。更新完成後,您可在控制台重新觸發Flannel組件版本升級。關於如何升級組件,請參見管理組件。