busybox工具安装

apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - name: busybox image: busybox:1.28 command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: Always
kubectl create -f busybox.yaml
kubectl exec busybox cat /etc/resolv.conf
Core DNS解析异常排查
异常现象检查
k8s DNS 解析步骤
普通Pod的dnsPolicy属性是默认值ClusterFirst,也就是会指向集群内部的DNS服务器,kube-dns负责解析集群内部的域名
kube-dns Pod的dnsPolicy值是Default,意思是从所在Node继承DNS服务器,对于无法解析的外部域名,kube-dns会继续向集群外部的dns进行查询
kube-dns只能解析集群内部地址,而集群外部地址应该发给外部DNS服务器进行解析
宿主机可以访问Pod的主机名
在宿主机上/etc/resolv.conf里配置了nameserver {coredns的podIP}
nameserver表示解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的,且只有当第一个nameserver没有反应时才查询下面的nameserver,一般不要指定超过3个服务器
Pod如何解析DNS记录 依赖于Pod容器中依赖容器内 resolv 文件的配置.这个文件中.配置的 DNS Server,一般就是 K8S 中kubedns 的Service 的ClusterIP.这个IP是虚拟IP.无法ping但可以访问
k8s的4种DNS策略
None
表示空的DNS设置,这种方式一般用于想要自定义 DNS 配置的场景,往往需要和 dnsConfig 配合一起使用达到自定义 DNS 的目的
Default
此种方式是让kubelet来决定使用何种DNS策略。而kubelet默认的方式,就是使用宿主机的/etc/resolv.conf文件。
同时,kubelet也可以配置指定的DNS策略文件,使用kubelet参数即可,如:–resolv-conf=/etc/resolv.conf
ClusterFirst
此种方式是使用kubernets集群内部中的kubedns或coredns服务进行域名解析。若解析不成功,才会使用宿主机的DNS配置来进行解析
ClusterFistWithHostNet
在某些场景下,我们的 POD 是用 HOST 模式启动的(HOST模式,是共享宿主机网络的),一旦用 HOST 模式,表示这个 POD 中的所有容器,都要使用宿主机的 /etc/resolv.conf 配置进行DNS查询,但如果你想使用了 HOST 模式,还继续使用 Kubernetes 的DNS服务,那就将 dnsPolicy 设置为 ClusterFirstWithHostNet
search域作用
resolv.conf中search域分别是default.svc.cluster.local svc.cluster.local cluster.local,在kubernets中,域名的全称必须是 service-name.namespace.svc.cluster.local
假如集群中有一个svc(Service)名为a,在某个Pod中执行命令 curl a 时,在此Pod中会根据/etc/resolv.conf进行解析流程。选择nameserver 10.96.0.2进行解析,将字符串'a'带入到/etc/resolv.conf文件中不同的search域,依次进行查找,如下
a.default.svc.cluster.local -> a.svc.cluster.local -> a.cluster.local
先查找 a.default.svc.cluster.local ,若找不到,则再查找 a.svc.cluster.local ,依次往下进行,直到找到为止
options ndots:5 解释
a)请求域名中点数少于5个时,先走search域,最后将其视为绝对域名进行查询;
b)请求域名中点数大于等于5个时,直接视为绝对域名进行查找,只有当查询不到的时候,才继续走 search 域。
k8s配置自定义DNS记录
kubectl edit configmap coredns -n kube-system
修改configmap后进行保存稍微等待几分钟即可生效

kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } hosts { 192.168.30.136 app.example.choerodon.io 192.168.30.136 chart.example.choerodon.io 192.168.30.136 minio.example.choerodon.io 192.168.30.136 registry.example.choerodon.io 192.168.30.136 gitlab.example.choerodon.io 192.168.30.136 notify.example.choerodon.io 192.168.30.136 hzero.example.choerodon.io 192.168.30.136 api.example.choerodon.io 192.168.30.136 sonarqube.example.choerodon.io 192.168.30.136 devops.example.choerodon.io fallthrough } prometheus :9153
域名解析配置成功
解析异常排查
k8s默认在pod中的resolv.conf中配置的nameserver的ip是kube-dns的svc的ip 使用这个svc ip进行解析域名的时候会提示解析失败 手动把pod中的resolv.conf中的nameserver的ip配置成core-dns pod的ip即可成功解析
1.查看core-dns的service ip kubectl get svc -n kube-system service ip是一个虚拟IP 它是不能够被ping通的
2.查看core dns的pod ip
3.查看业务pod中配置的dns服务器地址
解析不存在的域名地址