提问者:小点点

Kubernetes v1.18:Pod的DNS分辨率记录


问题是在kubernetes中的podsDNS解析。官方文档中的声明(从右上角下拉列表中选择v1.18):https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods

豆荚。

A/AAAA记录

由部署或DaemonSet创建的任何Pod都具有以下可用的DNS分辨率:

pod-ip-address.deployment-name.my-namespace. s vc.set-domain.example.

这是我的kubernetes环境:

master $ kubectl version  
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:58:59Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}  
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:50:46Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}

在我使用kubectl create部署nginx--image=nginx创建一个简单的部署后,然后我在test命名空间中创建一个busybox pod来执行nslookup,如下所示:

kubectl create ns test

cat <<EOF | kubectl apply -n test -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    name: busybox
spec:
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox
EOF

然后我这样做nslookup,根据官方文档pod-ip-address.deployment-name.my-namesspace. svc.groust-domain.example

master $ kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-f89759699-h8cj9   1/1     Running   0          12m   10.244.1.4   node01   <none>           <none>

master $ kubectl get deploy -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
nginx   1/1     1            1           17m   nginx        nginx    app=nginx

master $ kubectl exec -it busybox1 -n test -- nslookup 10.244.1.4.nginx.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

nslookup: can't resolve '10.244.1.4.nginx.default.svc.cluster.local'
command terminated with exit code 1

master $ kubectl exec -it busybox1 -n test -- nslookup 10-244-1-4.nginx.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

nslookup: can't resolve '10-244-1-4.nginx.default.svc.cluster.local'
command terminated with exit code 1

问题1:
为什么nslookup查找名称失败?我做错了什么吗?

当我继续探索pod的dns名称时,我这样做了:

master $ kubectl exec -it busybox1 -n test -- nslookup 10-244-1-4.default.pod.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      10-244-1-4.default.pod.cluster.local
Address 1: 10.244.1.4
master $ kubectl exec -it busybox1 -n test -- nslookup 10-244-1-4.test.pod.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      10-244-1-4.test.pod.cluster.local
Address 1: 10.244.1.4

问题2:为什么nslookup 10-244-1-4. test.pod.club.local成功了,即使10.244.1.4的pod在默认命名空间中?


共2个答案

匿名用户

关于你的第一个问题,据我所知,你的假设是正确的,似乎留档不准确。Pod的A/AAAA参考是留档(1.18)中的新内容。为此,我强烈建议您在这里打开一个问题,以便开发人员可以仔细研究它。

我建议你参考1.17留档,因为它反映了实际情况。

在1.17中,我们可以看到这个注释:

注意:因为不会为Pod名称创建A或AAAA记录,所以要创建Pod的A或AAAA记录需要hostname。没有hostname但具有子域的Pod只会为无头服务(default-subdomain.my-namesspace. svc.crester-domain.example)创建A或AAAA记录,指向Pod的IP地址。此外,Pod需要准备好才能有记录,除非在服务上设置了PublishNotReadyAddress=True

据我所知,这在1.18仍然是正确的,尽管留档是这么说的。

关于第二个问题,你也可以打开一个问题,但我个人认为使用基于IP的DNS名称没有任何实际原因。这些名称是供kubernetes内部使用的,使用它不会给你带来任何好处。

最好的方案是在库伯内特斯上使用基于服务的dns名称。它被证明是非常可靠的。

匿名用户

对于问题1,这可能是文档不准确。如果我为部署创建ClusterIP服务:
kubectl公开部署nginx--name=前端--port=80

然后我可以看到这个名字:

kubectl exec -it busybox1 -n test -- nslookup 10-244-1-4.front-end.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      10-244-1-4.front-end.default.svc.cluster.local
Address 1: 10.244.1.4 10-244-1-4.front-end.default.svc.cluster.local