當您在多叢集環境下遇到服務通訊障礙時,可以使用DNS代理並解析跨越多個叢集的服務要求,實現多叢集服務發現,確保服務的平滑路由和快速存取,增強服務的延展性和靈活性,降低系統的複雜度。
前提條件
已添加兩個ACK叢集(本例中為m1c1和m1c2)到ASM執行個體。具體操作,請參見使用ASM Serverless網關實現多叢集入口的步驟一至步驟三。
已為default命名空間啟用自動注入。具體操作,請參見管理全域命名空間。
功能介紹
在多叢集管理員模式下部署應用時,不同叢集下部署的不同服務無法進行相互發現。要實現跨叢集的服務調用,需要兩個叢集中部署相同的Service,才能使發送請求的工作負載通過DNS請求發現其它叢集中的服務。
多叢集模式應用部署情境樣本如下。在樣本中,由統一的Service Mesh控制面對叢集1和叢集2中的所有網格代理進行管理。服務之間的調用關係為sleep調用httpbin,且只有叢集1中部署了sleep Service、只有叢集2中部署了httpbin Service。此時,sleep無法調用httpbin應用,因為叢集1中沒有部署httpbin的Service,sleep無法自動探索httpbin服務。
Service MeshASM支援使用DNS代理功能。開啟DNS代理功能後,當網格代理收到來自應用程式的DNS查詢時,網格代理將進行透明地攔截與解析,從而提供對跨叢集服務的服務發現能力。
步驟一:部署sleep和httpbin應用
使用以下內容,在m1c2叢集中部署sleep應用。具體操作,請參見在ASM執行個體關聯的叢集中部署應用。
使用以下內容,在m1c1叢集中部署httpbin應用。具體操作,請參見在ASM執行個體關聯的叢集中部署應用。
步驟二:驗證多叢集服務發現是否生效
在m1c2叢集對應的KubeConfig環境下,執行以下命令,從sleep容器發起請求。
kubectl exec -it deploy/sleep -c sleep -- curl httpbin:8000預期輸出:
curl: (6) Could not resolve host: httpbin由於m1c2叢集未部署名為httpbin的Service,叢集內的DNS請求無法解析httpbin的網域名稱,因此sleep應用無法實際將請求發出,說明多叢集服務發現未生效。
步驟三:啟用DNS代理功能,驗證多叢集服務發現是否生效
為ASM執行個體啟用DNS代理功能。具體操作,請參見啟用DNS代理功能。
在m1c2叢集中,重新部署sleep應用的工作負載。具體操作,請參見重新部署工作負載。
在m1c2叢集對應的KubeConfig環境下,執行以下命令,從sleep容器發起請求。
kubectl exec -it deploy/sleep -c sleep -- curl httpbin:8000預期輸出:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>httpbin.org</title>
...預期輸出表明請求的響應內容為httpbin服務響應的HTML內容,說明多叢集服務發現生效。