0%

kubernetes DNS 调试工具

用于排查k8s dns 问题调试工具

部署 DNS 调试工具

  • ndsutils.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    apiVersion: v1
    kind: Pod
    metadata:
    name: dnsutils
    spec:
    containers:
    - name: dnsutils
    image: mydlqclub/dnsutils:1.3
    imagePullPolicy: IfNotPresent
    command: ["sleep","3600"]
  • 查看日志

    1
    2
    $ for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); \
    do kubectl logs --namespace=kube-system $p; done
  • CoreDNS 域名解析日志信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    使用 kubectl edit 命令来修改存储于 Kubernetes ConfigMap 中的 CoreDNS 配置参数信息,添加 log 参数,让 CoreDNS 日志中显示域名解析信息:

    ## 编辑 coredns 配置
    $ kubectl edit configmap coredns -n kube-system

    apiVersion: v1
    data:
    Corefile: |
    .:53 {
    log #添加log
    errors
    health {
    lameduck 5s
    }
    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
    cache 30
    loop
    reload
    loadbalance
    }
1
2
3
4
5
6
7
8
9
10
11
12
CoreDNS 配置参数说明:

errors: 输出错误信息到控制台。
health:CoreDNS 进行监控检测,检测地址为 http://localhost:8080/health 如果状态为不健康则让 Pod 进行重启。
ready: 全部插件已经加载完成时,将通过 endpoints 在 8081 端口返回 HTTP 状态 200。
kubernetes:CoreDNS 将根据 Kubernetes 服务和 pod 的 IP 回复 DNS 查询。
prometheus:是否开启 CoreDNS Metrics 信息接口,如果配置则开启,接口地址为 http://localhost:9153/metrics
forward:任何不在Kubernetes 集群内的域名查询将被转发到预定义的解析器 (/etc/resolv.conf)。
cache:启用缓存,30 秒 TTL。
loop:检测简单的转发循环,如果找到循环则停止 CoreDNS 进程。
reload:监听 CoreDNS 配置,如果配置发生变化则重新加载配置。
loadbalance:DNS 负载均衡器,默认 round_robin。
  • Pod 中的 DNS 配置信息

一般 Pod 中的 DNS 策略默认为 ClusterFirst,该参数起到的作用是,优先从 Kubernetes DNS 插件地址读取 DNS 配置。所以,我们正常创建的 Pod 中,DNS 配置 DNS 服务器地址应该指定为 Kubernetes 集群的 DNS 插件 Service 提供的虚拟 IP 地址。

1
2
3
4
5
6
注:其中 DNS 策略(dnsPolicy)支持四种类型:

Default: 从 DNS 所在节点继承 DNS 配置,即该 Pod 的 DNS 配置与宿主机完全一致。
ClusterFirst:预先从 Kubenetes 的 DNS 插件中进行 DNS 解析,如果解析不成功,才会使用宿主机的 DNS 进行解析。
ClusterFirstWithHostNet:Pod 是用 HOST 模式启动的(hostnetwork),用 HOST 模式表示 Pod 中的所有容器,都使用宿主机的 /etc/resolv.conf 配置进行 DNS 解析,但如果使用了 HOST 模式,还继续使用 Kubernetes 的 DNS 服务,那就将 dnsPolicy 设置为 ClusterFirstWithHostNet。
None:完全忽略 kubernetes 系统提供的 DNS,以 Pod Spec 中 dnsConfig 配置为主。