本文介紹您在建立叢集、使用叢集、管理叢集等過程中可能遇到的常見問題及對應解決方案。
如何將自建的Kubernetes叢集遷移到ACK上來?
ACK提供了遷移方案,支援將自建Kubernetes叢集平滑遷移至ACK叢集,並盡量確保遷移期間對業務無影響。具體流程,請參見Kubernetes遷移方案概述。
Alibaba Cloud Linux作業系統的叢集相容CentOS的容器鏡像嗎?
相容。更多資訊,請參見Alibaba Cloud Linux 3。
建立叢集選擇了containerd容器運行時,是否可以改為Docker?
叢集建立後,容器運行時不可更改。您可以建立不同類型運行時的節點池,節點池與節點池的運行時可以不同。更多資訊,請參見建立和管理節點池。
如需將節點容器運行時從Docker遷移到containerd。具體操作,請參見將節點容器運行時從Docker遷移到containerd。
v1.24及之後的叢集版本不再支援將Docker作為內建容器運行時。請在v1.24及之後的叢集中使用containerd作為節點池運行時。
容器運行時containerd、Docker、安全沙箱有什麼區別?
Container Service for Kubernetes支援containerd、Docker、安全沙箱三種運行時。推薦您使用containerd運行時。Docker運行時僅支援v1.22版本及以下的叢集;安全沙箱運行時僅支援v1.24版本及以下的叢集。更多運行時的對比資訊,請參見containerd、安全沙箱、Docker運行時的對比。將ACK叢集升級至v1.24及更高版本時,需將節點容器運行時從Docker遷移到containerd。具體操作,請參見將節點容器運行時從Docker遷移到containerd。
Container ServiceACK通過等保三級認證了嗎?
您可以為您的叢集開啟等保加固、設定基準檢查策略,基於Alibaba Cloud Linux實現等保2.0三級版以及配置等保合規的基準檢查,以便滿足以下等保合規要求:
身份鑒別
存取控制
安全審計
入侵防範
惡意代碼防範
更多資訊,請參見ACK等保加固使用說明。
ACK叢集是否支援Istio?
支援。您可以使用阿里雲Service MeshASM。ASM是完全相容社區Istio的服務網格產品,控制面全託管,讓您更專註於業務應用的開發部署。ASM適配ACK節點的各種作業系統以及叢集中部署的各類網路外掛程式。您可以將建立好的ACK叢集添加到ASM執行個體中,使用ASM提供的流量管理、故障處理、統一監控和日誌管理等功能。具體操作,請參見添加叢集到ASM執行個體。關於ASM涉及的計費,請參見ASM計費說明。
如何收集Kubernetes叢集診斷資訊?
當Kubernetes叢集出現問題或者節點異常時,您可通過Container ServiceACK提供的一鍵故障診斷功能,輔助您定位叢集中出現的問題,詳情請參見使用叢集診斷。
如果叢集診斷功能無法滿足需求,您需要分別在Master節點和異常的Worker節點上收集Kubernetes叢集的診斷資訊時,請根據下文步驟收集Linux節點或Windows節點的診斷資訊。
收集Linux節點診斷資訊
不同節點所使用的作業系統有所限制,Worker節點可以使用Linux系統和Windows系統,Master節點只能使用Linux系統,以下方法同時適用於Linux系統的Master和Worker節點,該操作以Master節點為例。
登入Kubernetes叢集的Master節點,執行以下命令,下載診斷指令碼。
curl -o /usr/local/bin/diagnose_k8s.sh http://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/public/diagnose/diagnose_k8s.sh說明Linux節點的診斷指令碼僅支援從華東1(杭州)地區下載。
執行以下命令,給診斷指令碼添加執行許可權。
chmod u+x /usr/local/bin/diagnose_k8s.sh執行以下命令,進入指定目錄。
cd /usr/local/bin執行以下命令,運行診斷指令碼。
diagnose_k8s.sh系統顯示類似如下,每次執行診斷指令碼,產生的記錄檔名稱不同,本文以diagnose_1514939155.tar.gz為例,現場以實際環境為準。
...... + echo 'please get diagnose_1514939155.tar.gz for diagnostics' please get diagnose_1514939155.tar.gz for diagnostics + echo '請上傳 diagnose_1514939155.tar.gz' 請上傳 diagnose_1514939155.tar.gz執行如下命令,查看存放叢集診斷資訊的檔案。
ls -ltr | grep diagnose_1514939155.tar.gz說明將diagnose_1514939155.tar.gz替換為現場環境產生的記錄檔名稱。
收集Windows節點診斷資訊
Windows系統的Worker節點,請下載並運行diagnose診斷指令碼,收集叢集診斷資訊,具體操作如下。
Windows系統僅充當Worker節點。
登入異常Worker節點,開啟命令列工具。
執行以下命令,進入PowerShell模式。
powershell執行以下命令,下載並運行診斷指令碼。
Windows節點的診斷指令碼支援從所屬地區下載,請根據叢集所在地區替換命令列中的
[$Region_ID]。Invoke-WebRequest -UseBasicParsing -Uri http://aliacs-k8s-[$Region_ID].oss-[$Region_ID].aliyuncs.com/public/pkg/windows/diagnose/diagnose.ps1 | Invoke-Expression預期輸出如下,表示收集診斷資訊成功。
INFO: Compressing diagnosis clues ... INFO: ...done INFO: Please get diagnoses_1514939155.zip for diagnostics說明diagnoses_1514939155.zip檔案會儲存在指令碼執行時所在目錄。
如何排查ACK叢集出現的問題?
1、檢查叢集節點
執行以下命令,查看叢集中的節點狀態,確認所有的Node節點都存在並且狀態是Ready。
執行以下命令,查看節點上的詳細資料以及節點上的事件。
替換
[$NODE_NAME]為您的節點名稱。kubectl describe node [$NODE_NAME]說明關於kubectl輸出的資訊解析,請參見Node status。
2、檢查叢集組件
如果檢查完叢集Node節點後仍然無法確認問題,請繼續在控制平面上檢查叢集組件日誌。
執行以下命令,查看kube-system命名空間下所有的組件。
kubectl get pods -n kube-system預期輸出如下。
其中,以kube-開頭的Pod都是Kubernetes叢集的系統組件,coredns-開頭的是DNS外掛程式。預期輸出表明,組件狀態正常。如果組件狀態異常,請執行下一步。執行以下命令,查看其日誌資訊,定位並解決問題。
替換
[$Component_Name]為異常組件名稱。kubectl logs -f [$Component_Name] -n kube-system
3、檢查kubelet組件
執行以下命令,查看kubelet的運行狀態。
systemctl status kubelet如果您的kubelet運行狀態不是active (running),那麼您需要執行以下命令,進一步查看kubelet的日誌,定位並解決問題。
journalctl -u kubelet
叢集常見問題
下表羅列了一部分ACK叢集常見的故障原因以及處理方法。
故障情境 | 處理方法 |
API Server組件停止或Master組件停止:
| ACK組件本身有一定高可用的功能,建議您查看組件本身是否有異常。例如,ACK叢集的API Server預設使用CLB執行個體,您可以排查CLB狀態異常的原因。 |
API Server後端資料丟失:
| 若您建立了快照,在出現問題時,可以通過快照恢複正常的資料。若沒有建立快照,可聯絡我們。問題解決後,請參見以下方法預防該問題:
|
個別節點關機,即該節點上的所有Pod不再運行。 | 使用Deployment、StatefulSet、DaemonSet等工作負載建立Pod,而不是直接建立Pod,避免Pod無法調度到其他正常節點。 |
kubelet組件故障:
|
|
人為配置或其他問題。 | 若您建立了快照,在出現問題時,可以通過快照恢複正常的資料。若沒有建立快照,請聯絡我們反饋問題。問題解決後,周期性地為kubelet軟體所使用的資料卷建立快照。詳細資料,請參見為單個雲端硬碟儲存卷建立快照。 |
使用RAM使用者操作ACK叢集時,如何進行精細化授權?
預設情況下,RAM使用者或RAM角色沒有使用雲端服務OpenAPI的任何許可權,您需要為其授予Container Service的系統許可權AliyunCSFullAccess或所需的自訂許可權才能使用ACK並管理ACK叢集,請參見使用RAM授予叢集及雲資源存取權限。
基於Kubernetes RBAC機制,需使用RBAC為叢集內資源操作授權,RAM使用者才能管理叢集的內部資源,例如建立Deployment、Service等。
針對需要細粒度控制資源讀寫權限的情境,請參見使用自訂RBAC限制叢集內資源操作通過自訂ClusterRole和Role實現更精細化的RBAC許可權配置。
使用RAM使用者存取控制台時,還需配置對應的雲端服務許可權後才能正常使用,例如通過控制台查看節點池伸縮活動、查看叢集監控大盤等,請參見Container Service控制台許可權依賴。
配置叢集API Server的SLB存取控制策略時需要允許存取哪些IP網段?
API Server的SLB的ACL控制規則必須允許存取以下網段。
Container Service for Kubernetes管控的網段100.104.0.0/16。
叢集Virtual Private Cloud的主網段及附加網段(如有),或叢集節點所在的交換器vSwitch網段。
使用者側需訪問API Server串連端點的用戶端出口網段。
除允許存取以上網段之外,ACK Edge叢集還需要允許存取邊緣節點出口網段。
除允許存取以上網段之外,ACK靈駿叢集還需要允許存取靈駿VPD網段。
詳細資料,請參見配置API Server的存取控制策略。
ACK託管叢集的控制面是如何確保高可用的?
ACK託管叢集的控制面由阿里雲側託管,並提供節點與節點池、工作負載、負載平衡等資料面維度高可用推薦配置,以構建穩定、安全、可靠的叢集和應用架構,詳情請參見叢集高可用架構推薦配置。
ACK託管叢集的API Server網域名稱能否跨VPC解析?
ACK叢集的API Server網域名稱(apiserver.<cluster-id>.<region-id>.cs.aliyuncs.com)預設通過內網DNS解析(PrivateZone)解析,其解析記錄僅在叢集所在的VPC內生效,無法在另一個VPC中被正常解析。
為何ACK託管叢集的API Server網域名稱解析失敗?
ACK會將ACK託管叢集的API Server網域名稱註冊到內網DNS解析(PrivateZone)。當節點使用自訂DNS伺服器,即非阿里雲預設的100.100.2.136和100.100.2.138時,可能出現API Server網域名稱解析失敗的問題。
此時,需將API Server網域名稱(apiserver.<cluster-id>.<region-id>.cs.aliyuncs.com)解析上遊伺服器(Upstream)設定為100.100.2.136和100.100.2.138。
如果自訂DNS伺服器與ACK託管叢集處於不同VPC,請進一步提交工單完成跨VPC解析配置。
ACK託管叢集API Server自動建立的CLB執行個體是否支援複用?
不可以。API Server的內網CLB是存取控制面的核心入口,專用於API Server。任何複用或修改該CLB執行個體配置(如添加監聽、修改後端伺服器組等)的操作,都可能導致API Server訪問異常,進而影響整個叢集的穩定性。請勿對該CLB執行個體進行任何修改。
如何訪問Master節點?
ACK專有叢集:具體操作,請參見通過SSH串連ACK專有叢集的Master節點。
ACK託管叢集:ACK託管叢集下控制面節點完全託管,您無法登入到控制面節點的終端。如果需要登入到控制面節點,您可以考慮使用ACK專有叢集。
誤刪了ACK專有叢集的一個Master節點後,還能升級叢集嗎?
不能。刪除ACK專有叢集的Master節點後,無法添加Master節點,也無法進行叢集的版本升級。您可以重新建立ACK專有叢集(已停止建立)。
ACK專有叢集的Master節點可以移除或新增嗎?有哪些是高危操作?
不可以。自行增加或減少ACK專有叢集的Master節點都可能導致叢集無法使用,且不可恢複。
對於ACK專有叢集的Master節點,錯誤的操作可能導致Master節點不可用,甚至叢集不可用。自行更換Master或etcd 認證、自行修改核心組件、刪除或格式化節點/etc/kubernetes等核心目錄資料、重裝作業系統等均屬於高危操作,詳情請參見叢集相關高危操作。
ACK專有叢集API Server提示api/v1/namespaces/xxx/resourcequotes": x509: certificate has expired or is not yet valid: current time XXX is after xxx怎麼辦?
問題現象
當您在ACK專有叢集中建立Pod時,API Server返回認證到期的錯誤,或kube-controller-manager的日誌或Event中顯示認證到期的錯誤。報錯資訊如下。
"https://localhost:6443/api/v1/namespaces/xxx/resourcequotes": x509: certificate has expired or is not yet valid: current time XXX is after XXX"https://[::1]:6443/api/v1/namespaces/xxx/resourcequotes": x509: certificate has expired or is not yet valid: current time XXX is after XXX問題原因
在Kubernetes中,API Server內建了用於其內部LoopbackClient服務端工作的認證。該認證在社區版本中有效期間為1年且無法自動輪轉,只有當API Server Pod發生重啟時,才會自動輪轉更新。如果Kubernetes版本長時間未升級(超過 1 年),內部認證會到期,導致 API 請求失敗。詳細資料,請參見#86552。
為了降低社區版本中認證有效期間較短帶來的穩定性風險,ACK在1.24及以上版本的叢集中調整了該內建認證的預設到期時間,有效期間延長至10年。具體變更內容及影響範圍請參見【產品變更】ACK叢集API Server內部認證有效時間長度變更公告。
解決方案
您可以登入Master節點,執行以下命令,查詢LoopbackClient認證到期時間。
其中,XX.XX.XX.XX為Master節點的本地IP。
curl --resolve apiserver-loopback-client:6443:XX.XX.XX.XX -k -v https://apiserver-loopback-client:6443/healthz 2>&1 |grep expire對於已到期或即將到期的1年期認證叢集,請參見手動升級叢集將叢集升級至1.24或以上版本。推薦遷移至ACK託管叢集Pro版(熱遷移ACK專有叢集至ACK託管叢集Pro版)。
對於短期無法操作升級的ACK專有叢集,請逐一登入Master節點,手動重啟API Server,以產生新的有效認證。
containerd節點
crictl pods | grep kube-apiserver- | awk '{print $1}' | xargs -I '{}' crictl stopp {}Docker節點
docker ps | grep kube-apiserver- | awk '{print $1}' | xargs -I '{}' docker restart {}
