全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用DNS代理進行多叢集服務發現

更新時間:Apr 19, 2025

當您在多叢集環境下遇到服務通訊障礙時,可以使用DNS代理並解析跨越多個叢集的服務要求,實現多叢集服務發現,確保服務的平滑路由和快速存取,增強服務的延展性和靈活性,降低系統的複雜度。

前提條件

功能介紹

在多叢集管理員模式下部署應用時,不同叢集下部署的不同服務無法進行相互發現。要實現跨叢集的服務調用,需要兩個叢集中部署相同的Service,才能使發送請求的工作負載通過DNS請求發現其它叢集中的服務。

多叢集模式應用部署情境樣本如下。在樣本中,由統一的Service Mesh控制面對叢集1和叢集2中的所有網格代理進行管理。服務之間的調用關係為sleep調用httpbin,且只有叢集1中部署了sleep Service、只有叢集2中部署了httpbin Service。此時,sleep無法調用httpbin應用,因為叢集1中沒有部署httpbin的Service,sleep無法自動探索httpbin服務。Dingtalk_20230823181631.png

Service MeshASM支援使用DNS代理功能。開啟DNS代理功能後,當網格代理收到來自應用程式的DNS查詢時,網格代理將進行透明地攔截與解析,從而提供對跨叢集服務的服務發現能力。

步驟一:部署sleep和httpbin應用

  1. 使用以下內容,在m1c2叢集中部署sleep應用。具體操作,請參見在ASM執行個體關聯的叢集中部署應用

    展開查看sleep YAML檔案

    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: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/curl:asm-sleep
            command: ["/bin/sleep", "infinity"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
    ---
  2. 使用以下內容,在m1c1叢集中部署httpbin應用。具體操作,請參見在ASM執行個體關聯的叢集中部署應用

    展開查看httpbin YAML檔案

    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: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/httpbin:0.1.0
            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代理功能,驗證多叢集服務發現是否生效

  1. 為ASM執行個體啟用DNS代理功能。具體操作,請參見啟用DNS代理功能

  2. 在m1c2叢集中,重新部署sleep應用的工作負載。具體操作,請參見重新部署工作負載

  3. 在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內容,說明多叢集服務發現生效。