使用DNS代理进行多集群服务发现

当您在多集群环境下遇到服务通信障碍时,可以使用DNS代理并解析跨越多个集群的服务请求,实现多集群服务发现,确保服务的平滑路由和快速访问,增强服务的可伸缩性和灵活性,降低系统的复杂度。

前提条件

功能介绍

在多集群管理模式下部署应用时,不同集群下部署的不同服务无法进行相互发现。要实现跨集群的服务调用,需要两个集群中部署相同的Service,才能使发送请求的工作负载通过DNS请求发现其它集群中的服务。

多集群模式应用部署场景示例如下。在示例中,由统一的服务网格控制面对集群1和集群2中的所有网格代理进行管理。服务之间的调用关系为sleep调用httpbin,且只有集群1中部署了sleep Service、只有集群2中部署了httpbin Service。此时,sleep无法调用httpbin应用,因为集群1中没有部署httpbin的Service,sleep无法自动发现httpbin服务。Dingtalk_20230823181631.png

服务网格ASM支持使用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: 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
    ---
  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: 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代理功能,验证多集群服务发现是否生效

  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内容,说明多集群服务发现生效。