k8s-5. 问题整理

534 阅读2分钟

记线上一次unknownhost问题

线上容器报错:java.net.UnkonwnHostException: yamluhmz.kubeflow

问题定位

[k8s@212 ~]$ sudo docker inspect 8966363a9acf |grep Pid
            "Pid": 7069,
            "PidMode": "",
            "PidsLimit": 0,
[k8s@212 ~]$ nsenter -n -t 7069
[root@212 ~]# tcpdump -i eth0 udp dst port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
###当ping yamluhmz时
。。。
###当ping yamluhmz.kubeflow.svc.cluster.local时
。。。
  • coredns报错timeout, 查看主机日志
[root@TX-220-54-4 ~]#dmesg -H -w
neighbour: arp_cache: neighbor table overflow!
neighbour: arp_cache: neighbor table overflow!
neighbour: arp_cache: neighbor table overflow!

问题解决

优化dns查找

[root@jupyter-yamluhmz ~]# cat /etc/resolv.conf
nameserver 10.96.0.10
search kubeflow.svc.cluster.local svc.cluster.local cluster.local h.chinabank.com.cn d.chinabank.com.cn
options ndots:5
resolv.conf详细

ndots:5,表示:如果查询的域名包含的点“.”,不到5个,那么进行DNS查找,将使用非完全限定名称(或者叫绝对域名),如果你查询的域名包含点数大于等于5,那么DNS查询,默认会使用绝对域名进行查询。

  • 优化方式1:使用全限定域名 其实最直接,最有效的优化方式,就是使用 “fully qualified name”,简单来说,使用“完全限定域名”(也叫绝对域名),你访问的域名,必须要以 “.” 为后缀,这样就会避免走 search 域进行匹配
  • 优化方式2:具体应用配置特定的 ndots
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsConfig:
    options:
      - name: ndots
        value: "1"
Kubernetes DNS 策略

在Kubernetes 中,有4种 DNS 策略,从 Kubernetes 源码中看:

  1. None 表示空的DNS设置 这种方式一般用于想要自定义 DNS 配置的场景,而且,往往需要和 dnsConfig 配合一起使用达到自定义 DNS 的目的。

  2. Default 有人说 Default 的方式,是使用宿主机的方式,这种说法并不准确。 这种方式,其实是,让 kubelet 来决定使用何种 DNS 策略。而 kubelet 默认的方式,就是使用宿主机的 /etc/resolv.conf(可能这就是有人说使用宿主机的DNS策略的方式吧),但是,kubelet 是可以灵活来配置使用什么文件来进行DNS策略的,我们完全可以使用 kubelet 的参数:–resolv-conf=/etc/resolv.conf 来决定你的DNS解析文件地址。

  3. ClusterFirst 这种方式,表示 POD 内的 DNS 使用集群中配置的 DNS 服务,简单来说,就是使用 Kubernetes 中 kubedns 或 coredns 服务进行域名解析。如果解析不成功,才会使用宿主机的 DNS 配置进行解析。

  4. ClusterFirstWithHostNet 在某些场景下,我们的 POD 是用 HOST 模式启动的(HOST模式,是共享宿主机网络的),一旦用 HOST 模式,表示这个 POD 中的所有容器,都要使用宿主机的 /etc/resolv.conf 配置进行DNS查询,但如果你想使用了 HOST 模式,还继续使用 Kubernetes 的DNS服务,那就将 dnsPolicy 设置为 ClusterFirstWithHostNet。

解决neighbor table overflow问题

echo "1024" > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo "2048" > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo "4096" > /proc/sys/net/ipv4/neigh/default/gc_thresh3