當您在多集群環境下遇到服務通信障礙時,可以使用DNS代理并解析跨越多個集群的服務請求,實現多集群服務發現,確保服務的平滑路由和快速訪問,增強服務的可伸縮性和靈活性,降低系統的復雜度。
前提條件
已添加兩個ACK集群(本例中為m1c1和m1c2)到ASM實例。具體操作,請參見使用ASM Serverless網關實現多集群入口的步驟一至步驟三。
已為default命名空間啟用自動注入。具體操作,請參見管理全局命名空間。
功能介紹
在多集群管理模式下部署應用時,不同集群下部署的不同服務無法進行相互發現。要實現跨集群的服務調用,需要兩個集群中部署相同的Service,才能使發送請求的工作負載通過DNS請求發現其它集群中的服務。
多集群模式應用部署場景示例如下。在示例中,由統一的服務網格控制面對集群1和集群2中的所有網格代理進行管理。服務之間的調用關系為sleep調用httpbin,且只有集群1中部署了sleep Service、只有集群2中部署了httpbin Service。此時,sleep無法調用httpbin應用,因為集群1中沒有部署httpbin的Service,sleep無法自動發現httpbin服務。
服務網格ASM支持使用DNS代理功能。開啟DNS代理功能后,當網格代理收到來自應用程序的DNS查詢時,網格代理將進行透明地攔截與解析,從而提供對跨集群服務的服務發現能力。
步驟一:部署sleep和httpbin應用
使用以下內容,在m1c2集群中部署sleep應用。具體操作,請參見在ASM實例關聯的集群中部署應用。
apiVersion: v1 kind: ServiceAccount metadata: name: sleep --- apiVersion: v1 kind: Service metadata: name: sleep labels: app: sleep service: sleep spec: ports: - port: 80 name: http selector: app: sleep --- apiVersion: apps/v1 kind: Deployment metadata: name: sleep spec: replicas: 1 selector: matchLabels: app: sleep template: metadata: labels: app: sleep spec: terminationGracePeriodSeconds: 0 serviceAccountName: sleep containers: - name: sleep image: curl:8.1.2 command: ["/bin/sleep", "infinity"] imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /etc/sleep/tls name: secret-volume volumes: - name: secret-volume secret: secretName: sleep-secret optional: true ---
使用以下內容,在m1c1集群中部署httpbin應用。具體操作,請參見在ASM實例關聯的集群中部署應用。
apiVersion: v1 kind: ServiceAccount metadata: name: httpbin --- apiVersion: v1 kind: Service metadata: name: httpbin labels: app: httpbin service: httpbin spec: ports: - name: http port: 8000 targetPort: 80 selector: app: httpbin --- apiVersion: apps/v1 kind: Deployment metadata: name: httpbin spec: replicas: 1 selector: matchLabels: app: httpbin version: v1 template: metadata: labels: app: httpbin version: v1 spec: serviceAccountName: httpbin containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin ports: - containerPort: 80
步驟二:驗證多集群服務發現是否生效
在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內容,說明多集群服務發現生效。