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服務器地址
解析不存在的域名地址