使用 DNS SRV 记录发现服务

SRV 记录(服务记录)是域名系统中的数据规范,用于定义位置,即指定服务的主机名和端口号。该记录还定义了每个服务器的权重和优先级。

SRV 记录的示例:

_http._tcp.example.com. 100 IN SRV 10 60 5060 a.example.com.

下表描述 SRV 记录中的每个项目:

本地化后的图片

您可以使用 DNS SRV 记录发现服务端点。Citrix ADC 设备配置为定期查询具有与服务关联的 SRV 记录的 DNS 服务器。在接收 SRV 记录时,SRV 记录中发布的每个目标主机都绑定到与该服务关联的服务组。每个绑定都会继承 SRV 记录的端口、优先级和权重。对于每个服务部署,用户必须在启动 Citrix ADC 设备时配置一次,从而使其成为应用程序的单触式部署。

重要提示: 动态学习的服务组成员的权重无法使用 CLI 或 GUI 进行修改。

用例:负载平衡微服务

应用程序正在从单片体系结构转向微服务体系结构。迁移到微服务架构以及后端服务器自动缩放解决方案,使应用程序部署变得更加动态。要支持此类动态部署,代理或 ADC 必须能够动态检测后端应用程序或服务实例并将其吸收到代理配置中。 使用 DNS SRV 记录的服务发现功能有助于在此类动态部署方案中配置 Citrix ADC 设备。应用程序开发人员可以使用某些业务流程平台来部署应用程序。在应用程序部署期间实例化容器时,编排平台可能不会为每个容器分配特定于协议的标准端口。在这种情况下,发现端口信息将成为配置 Citrix ADC 设备的关键。SRV 记录在这种情况下很有帮助。SRV 记录参数(如优先级和权重)可用于更好地平衡应用程序的负载。

  • 优先级参数可用于指定服务器池的优先级。
  • 权重参数可用于指定后端服务实例的容量,因此可用于加权负载均衡。
  • 每当后端服务器池发生更改时(例如从池中删除后端实例),只有在支持所有现有客户端连接后,才会慷慨地删除该实例。

注意:

  • A/AAAA 记录的基于服务发现,所有已解析的 IP 地址都具有相同的权重,因为您将权重分配给正在解析的域。

  • 如果 SRV 响应中的权重大于 100,则不会创建服务。

基于 SRV 记录的优先级负载均衡

您可以使用 SRV 记录执行基于优先级的负载均衡。基于优先级的服务器池可以是备份虚拟服务器的替代方案。与备份虚拟服务器相比,ns.conf 文件需要最少的配置。

在使用 SRV 记录的基于优先级的负载平衡中,将为每个服务器池分配一个优先级编号。数量越少,优先级越高。根据服务器的运行状况和可用性,选择优先级最高池中的一个服务器进行负载平衡。如果优先级最高的服务器池中的所有服务器都关闭,则选择具有下一个最高优先级的服务器进行负载平衡。但是,如果优先级最高的服务器池中的服务器再次启动,则会再次从优先级最高的池中选择服务器。

从一个优先级服务器池切换到另一个服务器池通过出血现有的客户端事务来慷慨地发生。因此,当前客户端看不到应用程序访问中的任何中断。

使用 CLI 启用 SRV 记录查询

您必须执行以下任务才能启用 SRV 记录的查询:

  1. 通过将查询类型参数指定为 SRV 来创建服务器。

    在命令提示窗口中,键入:

    add server <name> <domain> [-queryType <queryType>])
    

    示例:

    add server web_serv example.com -queryType SRV
    

    注意:

    • 默认情况下,会发送 IPv4 查询。要发送 IPv6 查询,您必须启用 IPv6 域。
    • SRV 目标域名不得超过 127 个字符。
  2. 创建具有自动缩放模式作为 DNS 的服务组。

    在命令提示窗口中,键入:

    add serviceGroup <serviceGroupName> <serviceType> [-autoScale <autoScale>]
    

    示例:

    add servicegroup svc_grp_1 http -autoscale dns
    
  3. 将在步骤 1 中创建的服务器作为成员绑定到服务组。

    在命令提示窗口中,键入:

    bind serviceGroup <serviceGroupName> <serverName>
    

    示例:

    bind servicegroup svc_grp_1 web_serv
    

注意:

  • 将服务器绑定到服务组成员时,不必输入 SRV 服务器类型的端口号。如果您为 SRV 服务器类型指定端口号,则会显示一条错误消息。

  • 在将服务器绑定到服务组时,您可以选择指定名称服务器和 TTL 值。

使用 GUI 启用 SRV 记录查询

创建服务器

  1. 导航至“流量管理”>“负载平衡”>“服务器”,然后单击“添加”。

    本地化后的图片

  2. 创建服务器 页面中,选择域名。

  3. 输入所有必需参数的详细信息。

  4. 查询类型中,选择 SRV

  5. 单击创建

创建具有自动缩放模式作为 DNS 的服务组

  1. 导航到 流量管理 > 负载平衡 > 服务组

  2. 负载平衡服务组 页面中,输入所有必需参数的详细信息。

  3. 自动扩展模式下,选择 DNS

    本地化后的图片

  4. 单击确定

将服务器绑定到服务组成员

  1. 导航到 流量管理 > 负载平衡 > 服务组

  2. 在“服务组”页面中,选择已创建的服务组,然后单击“编辑”。

  3. 负载平衡服务组 页面中,单击 服务组成员

  4. 在“服务组成员绑定”页中,选择已创建的服务器,然后单击“关闭”。

    本地化后的图片

注意:

  • 绑定时,您不必输入 SRV 服务器类型的端口号。如果输入 SRV 服务器类型的端口号,将显示一条错误消息。

  • 在将服务器绑定到服务组时,您可以选择指定名称服务器和 TTL 值。

覆盖 TTL 值

Citrix ADC 设备配置为在应用程序启动期间定期查询 DNS 服务器中与应用程序关联的 SRV 记录中的任何更新。默认情况下,此查询的周期取决于 SRV 记录中发布的 TTL。在微服务或云世界应用程序中,部署更动态。因此,代理必须更快地吸收对应用程序部署的任何更改。因此,建议用户将基于域的服务 TTL 参数显式设置为低于 SRV 记录 TTL 且最适合您的部署的值。您可以通过两种方法覆盖 TTL 值:

  • 将成员绑定到服务组时
  • 使用 set lb 参数命令全局设置 TTL 值。

如果在绑定服务组成员时同时配置 TTL 值,则绑定服务组成员时指定的 TTL 值优先。 如果绑定服务组成员时或在全局级别未指定 TTL 值,则 DBS 监视器间隔从 DNS 响应中的 TTL 值派生。

使用 CLI 覆盖 TTL 值

  • 要在绑定时覆盖 TTL 值,请在命令提示符处键入:

     bind serviceGroup <serviceGroupName> (<serverName> [-dbsTTL <secs>])
    

    示例:

     bind servicegroup svc_grp_1 web_serv -dbsTTL 10
    
  • 要全局覆盖 TTL 值,请在命令提示符处键入:

     set lb parameter [-dbsTTL <secs>]
    

    示例:

     set lb parameter -dbsTTL 15
    

使用 GUI 覆盖 TTL 值

要在绑定时覆盖 TTL 值,请执行以下操作:

  1. 导航到 流量管理 > 负载平衡 > 服务组

  2. 在“服务组”页面中,选择已创建的服务组,然后单击“编辑”。

  3. 负载平衡服务组 页面中,单击 服务组成员

  4. 在“服务组成员绑定”页面中,选择已创建的服务器,然后单击“编辑”。

  5. 基于域的服务 TTL中,输入 TTL 值。

要在全局级别覆盖 TTL 值,请执行以下操作:

  1. 导航到 流量管理 > 负载平衡 > 更改负载平衡参数

  2. 基于域的服务 TTL中,输入 TTL 值。

注意:如果基于域的服务器 TTL 值设置为 0,则使用数据包中的 TTL 值。

为服务组和域名绑定指定不同的名称服务器

您可以为特定组中的不同域名配置不同的名称服务器。在将 DBS 服务器绑定到服务组时,设置 Nameerver 参数是可选的。如果在将成员绑定到服务组时未指定名称服务器,则考虑全局配置的名称服务器。

使用 CLI 将服务器绑定到服务组时指定名称服务器

在命令提示窗口中,键入:

bind serviceGroup <serviceGroupName> (<serverName> [-nameServer <ip_addr>] [-dbsTTL <secs>])

示例

bind servicegroup svc_grp_1 web_serv  -ns.nameserver.com 10.102.27.155 -dbsTTL 10

使用 GUI 将服务器绑定到服务组时指定名称服务器

  1. 导航到 流量管理 > 负载平衡 > 服务组

  2. 在“服务组”页面中,选择已创建的服务组,然后单击“编辑”。

  3. 负载平衡服务组 页面中,单击 服务组成员

  4. 在“服务组成员绑定”页面中,选择已创建的服务器,然后单击“编辑”。

  5. 名称服务器中,指定绑定域的查询需要发送到的名称服务器名称。