当您在多集群环境下遇到服务通信障碍时,可以使用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实例关联的集群中部署应用。
使用以下内容,在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内容,说明多集群服务发现生效。