[转帖]k8s集群内偶现无法访问外部域名怎么解?

k8s,集群,无法访问,外部,域名,怎么 · 浏览次数 : 0

小编点评

# 测试DNS服务器 ** telnet 211.136.17.107 53** * 连接到服务器* * 测试DNS服务器* # 测试tcp dns ** dig +tcp @114.114.114.114 www.baidu.com** * 测试连接服务器* * 测试响应是否正常* * 测试响应的响应时间* # 测试udp dns ** dig @114.114.114.114 www.baidu.com** * 测试连接服务器* * 测试响应是否正常* * 测试响应的响应时间* # 测试Coredns排障方法 ** Corefile: | .:53 { errors health ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance }kind: ConfigMapmetadata: name: coredns namespace: kube-system prefer_udp参数的表示即使查询请求通过tcp传入,也首先尝试使用udp。如果响应被截断(在响应中设置了 TC 标志),再通过tcp进行另一次尝试。可参看:https://coredns.io/plugins/forward/ **其他相关知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览9032 人正在系统学习中 。归纳总结以上内容,生成内容时需要带简单的排版

正文

故障现象

容器内频现无法访问外部服务,是用ping测试有如下现象:

# ping baidu.com -c 4
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=49 time=34.3 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=49 time=38.4 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=3 ttl=49 time=43.4 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=4 ttl=49 time=35.9 ms

--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3013ms
rtt min/avg/max/mdev = 34.303/38.032/43.460/3.474 ms
#
# ping baidu.com
ping: www.baidu.com: Name or service not known

    从容器所在宿主机dig测试无异常,ping测试无异常。

    故障排查思路

    1、检查coredns运行状态

    首先检查coredns pod运行是否正常:

    kubectl -n kube-system get pod -o wide -l k8s-app=kube-dns
    
    • 1

    如果coredns pod不处于running状态,或pod频繁发生重启,则应检查pod运行异常原因:

    kubectl -n kube-system describe pod <CoreDNS Pod名称>
    
    • 1

    2、检查coredns日志

    如果pod状态正常,检查coredns日志:

    kubectl -n kube-system logs <CoreDNS Pod名称>
    

      本次故障场景中,可在日志中看到大量如下报错:

      [ERROR] plugin/errors: 2 localhost. AAAA: dial tcp 114.114.115.115:53: i/o timeout
      [ERROR] plugin/errors: 2 localhost. AAAA: dial tcp 114.114.115.115:53: i/o timeout
      [ERROR] plugin/errors: 2 localhost. AAAA: dial tcp 114.114.114.114:53: i/o timeout
      [ERROR] plugin/errors: 2 ip. A: dial tcp 114.114.115.115:53: i/o timeout
      [ERROR] plugin/errors: 2 localhost. AAAA: dial tcp 114.114.114.114:53: i/o timeout
      [ERROR] plugin/errors: 2 www.baidu.com. A: dial tcp 114.114.114.114:53: i/o timeout
      

        3、检查coredns负载情况

        看到上述报错,接着检查coredns pod负载情况:

        kubectl -n kube-system top pod -l k8s-app=kube-dns
        

        检查coredns资源限制情况:

        # kubectl -n kube-system describe deploy coredns
            Limits:
              memory:  170Mi
            Requests:
              cpu:        100m
              memory:     70Mi
        

          top命令查询的负载情况比较,如cpu、memory使用量接近Limits值,考虑增加coredns副本数或适当增加Limits值。

          4、检查coredns配置文件

          如上述检查均无异常,继续检查coredns配置文件,以确认步骤2报错原因,本次故障场景的配置文件如下:

          # kubectl -n kube-system get cm coredns -o yaml
          apiVersion: v1
          data:
            Corefile: |
              .:53 {
                  errors
                  health
                  ready
                  kubernetes cluster.local in-addr.arpa ip6.arpa {
                     pods insecure
                     fallthrough in-addr.arpa ip6.arpa
                     ttl 30
                  }
                  prometheus :9153
                  forward . 211.136.17.107 114.114.114.114 114.114.115.115
                  cache 30
                  loop
                  reload
                  loadbalance
              }
          kind: ConfigMap
          metadata:
            name: coredns
            namespace: kube-system
          

            从上述配置可以看到,当访问外部域名时,域名查询请求转移到预定义DNS服务器211.136.17.107 114.114.114.114 114.114.115.115,请求在三个DNS服务器间随机分发。

            同时检查主机DNS配置:

            # cat /etc/resolv.conf
            nameserver 211.136.17.107
            nameserver 211.136.20.203
            

              发现主机与容器使用了不同的DNS服务器,而日志中大量出现的报错内容仅涉及容器是用的DNS服务器114.114.114.114 114.114.115.115,且为tcp查询。

              5、测试DNS服务器

              是用如下命令测试dns服务器:

              telnet 211.136.17.107 53
              telnet 114.114.114.114 53
              telnet 114.114.115.115 53
              

                或如下命令进行更精准的测试:

                测试tcp dns:

                # dig +tcp @114.114.114.114 www.baidu.com      
                ;; Connection to 114.114.114.114#53(114.114.114.114) for www.baidu.com failed: timed out.
                ;; Connection to 114.114.114.114#53(114.114.114.114) for www.baidu.com failed: timed out.
                

                ; <<>> DiG 9.11.5-P4-5.1+deb10u8-Debian <<>> +tcp @114.114.114.114 www.baidu.com
                ; (1 server found)
                ;; global options: +cmd
                ;; connection timed out; no servers could be reached
                ;; Connection to 114.114.114.114#53(114.114.114.114) for www.baidu.com failed: timed out.

                  测试udp dns:

                  # dig @114.114.114.114 www.baidu.com
                  ; <<>> DiG 9.11.5-P4-5.1+deb10u8-Debian <<>> @114.114.114.114 www.baidu.com
                  ; (1 server found)
                  ;; global options: +cmd
                  ;; Got answer:
                  ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27280
                  ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
                  

                  ;; OPT PSEUDOSECTION:
                  ; EDNS: version: 0, flags:; udp: 512
                  ;; QUESTION SECTION:
                  ;www.baidu.com. IN A

                  ;; ANSWER SECTION:
                  www.baidu.com. 241 IN A 39.156.66.18
                  www.baidu.com. 241 IN A 39.156.66.14

                  ;; Query time: 21 msec
                  ;; SERVER: 114.114.114.114#53(114.114.114.114)
                  ;; WHEN: Mon Dec 05 11:31:00 CST 2022
                  ;; MSG SIZE rcvd: 74

                    多次测试可以发现,服务器访问DNS服务器114.114.114.114、114.114.115.115的tcp 53端口网络异常,且异常频率较高,可能因为移动云屏蔽了tcp 53端口的访问或屏蔽了友商的DNS服务器(测试了多个DNS服务器均有此现象)。

                    处理方法

                    修改coredns配置文件,添加prefer_udp参数,并删除友商DNS服务器:

                    apiVersion: v1
                    data:
                      Corefile: |
                        .:53 {
                            errors
                            health
                            ready
                            kubernetes cluster.local in-addr.arpa ip6.arpa {
                               pods insecure
                               fallthrough in-addr.arpa ip6.arpa
                               ttl 30
                            }
                            prometheus :9153
                            forward . /etc/resolv.conf {
                              prefer_udp
                            }
                            cache 30
                            loop
                            reload
                            loadbalance
                        }
                    kind: ConfigMap
                    metadata:
                      name: coredns
                      namespace: kube-system
                    

                      prefer_udp参数的表示即使查询请求通过tcp传入,也首先尝试使用udp。如果响应被截断(在响应中设置了 TC 标志),再通过tcp进行另一次尝试。可参看:https://coredns.io/plugins/forward/

                      有关Coredns排障的方法,也可参看:https://help.aliyun.com/document_detail/404754.html

                      文章知识点与官方知识档案匹配,可进一步学习相关知识
                      云原生入门技能树首页概览9032 人正在系统学习中

                      与[转帖]k8s集群内偶现无法访问外部域名怎么解?相似的内容:

                      [转帖]k8s集群内偶现无法访问外部域名怎么解?

                      故障现象 容器内频现无法访问外部服务,是用ping测试有如下现象: # ping baidu.com -c 4 PING baidu.com (110.242.68.66) 56(84) bytes of data. 64 bytes from 110.242.68.66 (110.242.68.6

                      [转帖]0.03秒引发的网络血案

                      https://www.jianshu.com/p/45085331b9f0 背景 用户Pike版Openstack,Firewall drivers为Openvswitch。Openstack内一租户网络下多台虚拟机中部署一K8S集群,其中Openstack下租户网络使用VxLAN,K8S集群采用

                      [转帖]K8S集群内部 无持久化Redis单节点配置文件

                      K8S集群内部 无持久化Redis单节点配置文件 apiVersion: apps/v1 kind: Deployment metadata: name: redis-deploy spec: selector: matchLabels: prod: redis replicas: 1 templa

                      [转帖]K8S从懵圈到熟练 – 集群服务的三个要点和一种实现

                      https://developer.aliyun.com/article/711580?spm=a2c6h.13262185.profile.81.32d83219xsvxWd 以我的经验来讲,理解K8S集群服务的概念,是比较不容易的一件事情。尤其是当我们基于似是而非的理解,去排查服务相关问题的时候

                      [转帖]k8s-mtu设置不当引发的线上故障

                      https://www.cnblogs.com/zisefeizhu/p/16611626.html 背景 在部署新的paas平台线上环境时,突发consul和es中间件无法创建。 排查过程 以consul 通过查询k8s集群中pod状态发现原来3pod的consul集群,其中2个pod一直重启。

                      [转帖]K8S部署Redis Cluster集群(三主三从模式) - 部署笔记

                      https://www.cnblogs.com/cheyunhua/p/15619317.html 一、Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理。它可以存储和操作高级数据类型,例如列表,地图,集合和排序

                      [转帖]k8s部署有状态应用redis-cluster集群踩坑总结

                      https://segmentfault.com/a/1190000039196137 redis-cluster集群的部署网上一堆,用k8s部署也不在少数,但都是抄来抄去,问题不少,实际操作分享出来的还是太少。 1、redis启动配置文件,使用CofigMap来管理比较方便,redis-confi

                      [转帖]k8s学习: kubeconfig文件详解

                      1.什么是kubeconfig文件 用于配置集群访问的文件称为kubeconfig文件,这是引用配置文件的常用方法,.但并不是说有一个名为ubeconfi的文件。用于配置集群访问信息的文件叫作 kubeconfig 文件,在开启了 TLS 的集群中,每次与集群交互时都需要身份认证,生产环境一般使用证

                      [转帖]IoT运维 - 如何部署一套高可用K8S集群

                      https://zhuanlan.zhihu.com/p/579983530 如何部署一套高可用k8s集群,下面直接演示一下 环境 ip角色主机名 192.168.3.20 kubectl、ansible deploy 192.168.3.21 etcd1 etcd1 192.168.3.22 et

                      [转帖][译] Cilium 未来数据平面:支撑 100Gbit/s k8s 集群(KubeCon, 2022)

                      http://arthurchiao.art/blog/cilium-tomorrow-networking-data-plane-zh/ 作者写的非常好呢 基础支持的确非常重要呢. Published at 2022-11-12 | Last Update 2022-11-12 译者序 本文翻译自