k8s dns理解
这个博主讲的很详细
我的这篇文章主要是演示测试 k8s的dns nslookup怎么解析到k8spod域名
创建一个busybox的pod,测试一下pod内是否可以解析
1、流程验证
cat >dns-Deployment.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox-deployment
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
restartPolicy: Always
containers:
- name: busybox
command:
- sleep
- "3600"
image: busybox:1.28.4
EOF
Kubernetes会为其设置一个
< pod-ip >.< namespace >.pod.< cluster-domain > 格式的DNS域名
kubectl apply -f dns-Deployment.yaml
kubectl get pods |grep busybox
kubectl exec busybox -- cat /etc/resolv.conf
kubectl exec -ti busybox -- nslookup kubernetes.default
[root@master ~]# kubectl get pods -o wide|grep busybox
nslookup 10-244-1-36.default.pod.cluster.local
可以看到是无法解析的。根据coredns解析集群内域名原理可知:DNS 如何解析,依赖容器内 resolv 文件的配置。查看busybox容器内的resolve.conf文件
可以看到nameserver 10.96.0.10 这个就是配置的 DNS Server,一般就是 K8S 中,coredns的 Service 的 ClusterIP,这个IP是虚拟IP,无法ping,但可以访问。
kubectl get svc -n system
发请求时,会根据 /etc/resolv.conf 进行解析流程。选择 nameserver 10.96.0.10进行解析,依次在/etc/resolve.conf 中的 search 域,进行DNS查找,分别是:
search 内容类似如下(不同的pod,第一个域会有所不同)
search default.svc.cluster.local svc.cluster.local cluster.local
*.default.svc.cluster.local -> *.svc.cluster.local -> *.cluster.local
2、宿主机加入域名验证
nameserver表示解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的,且只有当第一个nameserver没有反应时才查询下面的nameserver。
kubectl get svc -n kube-system
kubectl get pod -n kube-system -o wide|grep dns
kubectl exec -ti busybox-deployment -- cat /etc/resolv.conf
vi /etc/resolv.conf 将search 域,dns服务器地址加入首部
现在就可以解析了