【问题标题】:Timeout Issues inside Kubernetes Cluster PowerdnsKubernetes 集群 Powerdns 中的超时问题
【发布时间】:2022-11-10 12:35:01
【问题描述】:

我在我的 k8s 集群中运行 PowerDNS 递归器。我的 python 脚本在另一个 pod 上,它正在对我的 powerdns rescursor 应用程序执行 rdns。我将我的 hpa Max replica 设置为 8。但是,我不认为负载是这里的问题。我不确定如何解决我遇到的这个超时错误。我可以增加副本来暂时解决问题,然后它会再次发生。

[ipmetadata][MainThread][source.py][144][WARNING]: dns_error code=12, message=Timeout while contacting DNS servers

似乎我的 pod 正在拒绝传入的流量,因此它输出 dns_error code=12。

这是我运行 rdns 的脚本的一部分

        return_value = {
            'rdns': None
        }
        try:
            async for attempt in AsyncRetrying(stop=stop_after_attempt(3)):
                with attempt:
                    try:
                        if ip:
                            result = await self._resolver.query(ip_address(ip).reverse_pointer, 'PTR')
                            return_value['rdns'] = result.name
                        return return_value
                    except DNSError as dns_error:
                        # 1  = DNS server returned answer with no data
                        # 4  = Domain name not found
                        # (seems to just be a failure of rdns lookup no sense in retrying)
                        # 11 = Could not contact DNS servers
                        if int(dns_error.args[0]) in [1, 4, 11]:
                            return return_value
                        LOG.warning('dns_error code=%d, message=%s, ip=%s', dns_error.args[0], dns_error.args[1], ip)
                        raise

        except RetryError as retry_ex:
            inner_exception = retry_ex.last_attempt.exception()
            if isinstance(inner_exception, DNSError):
                # 12 = Timeout while contacting DNS servers
                LOG.error('dns_error code=%d, message=%s, ip=%s', inner_exception.args[0], inner_exception.args[1], ip)
            else:
                LOG.exception('rnds lookup failed')
            return return_value

【问题讨论】:

    标签: python amazon-web-services ubuntu kubernetes powerdns


    【解决方案1】:

    错误代码 12 表示 PowerDNS 递归器在配置的超时时间内未收到任何来自所查询域的权威服务器的响应。这可能是由于网络问题、防火墙规则、速率限制或递归器或权威服务器的错误配置造成的。

    可能的解决方案

    您可以尝试一些方法来解决此超时错误:

    • 检查 python pod 和递归器 pod 之间以及递归器 pod 和权威服务器之间的网络连接和延迟。您可以使用pingtraceroutedig 等工具来诊断网络问题。
    • 检查您的 k8s 集群和权威服务器上的防火墙规则。确保它们允许端口 53 上的 UDP 和 TCP 流量用于 DNS 查询和响应。您可以使用iptablesnftablesufw 等工具来管理防火墙规则。
    • 检查递归器和权威服务器上的速率限制设置。速率限制是一种通过限制每秒来自给定来源的查询数量来防止拒绝服务攻击或滥用 DNS 资源的机制。您可以使用pdnsutilpdns_control 等工具在PowerDNS 递归和权威服务器上配置速率限制。
    • 检查递归器和权威服务器的配置。确保它们具有正确的 IP 地址、域名和 DNSSEC 设置。您可以使用pdnsutilpdns_control 等工具来管理PowerDNS 配置文件和设置。

    例子

    以下是如何使用上述工具解决超时错误的一些示例:

    • 要从 python pod ping 递归 pod,可以使用以下命令:
    import subprocess
    recursor_pod_ip = "10.0.0.1" # replace with the actual IP address of the recursor pod
    ping_result = subprocess.run(["ping", "-c", "4", recursor_pod_ip], capture_output=True)
    print(ping_result.stdout.decode())
    

    这将向递归器 pod 发送四个 ICMP 数据包并打印输出。您应该看到如下内容:

    PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
    64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.123 ms
    64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.098 ms
    64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.102 ms
    64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=0.101 ms
    
    --- 10.0.0.1 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3060ms
    rtt min/avg/max/mdev = 0.098/0.106/0.123/0.010 ms
    

    这表明 python pod 和递归 pod 之间的网络连接和延迟都很好。

    • 要从递归 pod 跟踪权威服务器,可以使用以下命令:
    kubectl exec -it recursor-pod -- traceroute 8.8.8.8
    

    这将跟踪数据包从递归 pod 到位于 8.8.8.8 (Google DNS) 的权威服务器的路由。您应该看到如下内容:

    traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
     1  10.0.0.1 (10.0.0.1)  0.123 ms  0.098 ms  0.102 ms
     2  10.0.1.1 (10.0.1.1)  0.456 ms  0.432 ms  0.419 ms
     3  10.0.2.1 (10.0.2.1)  0.789 ms  0.765 ms  0.752 ms
     4  192.168.0.1 (192.168.0.1)  1.123 ms  1.098 ms  1.085 ms
     5  192.168.1.1 (192.168.1.1)  1.456 ms  1.432 ms  1.419 ms
     6  192.168.2.1 (192.168.2.1)  1.789 ms  1.765 ms  1.752 ms
     7  192.168.3.1 (192.168.3.1)  2.123 ms  2.098 ms  2.085 ms
     8  192.168.4.1 (192.168.4.1)  2.456 ms  2.432 ms  2.419 ms
     9  192.168.5.1 (192.168.5.1)  2.789 ms  2.765 ms  2.752 ms
    10  8.8.8.8 (8.8.8.8)  3.123 ms  3.098 ms  3.085 ms
    

    这表明到权威服务器的路由是清晰的,没有防火墙阻塞或网络问题。

    • 要从递归 pod 中挖掘域名,可以使用以下命令:
    kubectl exec -it recursor-pod -- dig example.com
    

    这会将域名 example.com 的 DNS 查询发送到递归 pod 并打印响应。您应该看到如下内容:

    ; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> example.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;example.com.           IN  A
    
    ;; ANSWER SECTION:
    example.com.        3600    IN  A   93.184.216.34
    
    ;; Query time: 12 msec
    ;; SERVER: 10.0.0.1#53(10.0.0.1)
    ;; WHEN: Tue Jun 15 12:34:56 UTC 2021
    ;; MSG SIZE  rcvd: 56
    

    这表明递归 pod 收到了来自权威服务器对域名 example.com 的有效响应。

    • 要检查递归 pod 上的速率限制设置,您可以使用以下命令:
    kubectl exec -it recursor-pod -- pdns_control get-all
    

    这将打印递归器 pod 的所有配置设置。您应该寻找以下设置:

    max-cache-entries=1000000
    max-packetcache-entries=500000
    max-recursion-depth=40
    max-tcp-clients=128
    max-udp-queries-per-round=1000
    max-udp-queries-per-second=10000
    

    这些设置控制了递归 pod 可以处理的缓存条目、TCP 客户端、UDP 查询和递归深度的最大数量。您可以根据自己的需要和资源进行调整。您可以使用以下命令为设置设置新值:

    kubectl exec -it recursor-pod -- pdns_control set max-udp-queries-per-second 20000
    

    这会将每秒 UDP 查询的最大数量设置为 20000。

    • 查看8.8.8.8的权威服务器配置,可以使用如下命令:
    dig +short CHAOS TXT version.bind @8.8.8.8
    

    这将在 8.8.8.8 发送权威服务器版本的 DNS 查询。您应该看到如下内容:

    "google-public-dns-a.google.com"
    

    这表明权威服务器正在运行 Google Public DNS,这是一种众所周知且可靠的 DNS 服务。您可以查看 Google Public DNS 的文档以获取有关其配置和功能的更多信息。您还可以使用以下命令检查权威服务器的 DNSSEC 状态:

    dig +short CHAOS TXT id.server @8.8.8.8
    

    这将在 8.8.8.8 发送权威服务器身份的 DNS 查询。您应该看到如下内容:

    "edns0"
    

    这表明权威服务器支持 EDNS0,它是 DNS 协议的扩展,可以启用 DNSSEC 和其他功能。您可以查看 EDNS0 的文档以获取有关其功能和优势的更多信息。

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 2020-04-07
      • 2022-01-20
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 2021-06-29
      相关资源
      最近更新 更多