kubernetes v1.18:Pod的DNS解析记录

时间:2020-06-14 02:46:23

标签: kubernetes kubernetes-pod kube-dns coredns

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

豆荚。

A / AAAA记录

由Deployment或DaemonSet创建的任何Pod具有以下可用的DNS解析:

From mathcomp Require Import ssrnat ssreflect ssrfun ssrbool eqtype.

这是我的kubernetes环境:

pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example.

使用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 deploy nginx --image=nginx命名空间中创建一个busybox窗格,以执行nslookup:

test

然后根据官方文档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-namespace.svc.cluster-domain.example

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


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

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

问题2:
为什么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 成功地将10.244.1.4的pod设置为默认名称空间?

2 个答案:

答案 0 :(得分:0)

对于问题1,可能是文档不准确。如果我为部署创建ClusterIP服务:
kubectl expose deploy nginx --name=front-end --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

答案 1 :(得分:0)

关于您的第一个问题,据我确认您的假设是正确的,看来文档不正确。有关Pod的A / AAAA参考是文档(1.18)中的新增内容。为此,我强烈建议您打开问题here,以便开发人员可以仔细研究。

在这方面,我建议您参考1.17 documentation,因为它反映了实际情况。

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

注意:由于未为Pod名称创建A或AAAA记录,因此创建Pod的A或AAAA记录需要hostname。没有hostname但带有subdomain的Pod只会创建无头服务(default-subdomain.my-namespace.svc.cluster-domain.example)的A或AAAA记录,指向Pod的IP地址。另外,除非在服务上设置了publishNotReadyAddresses=True,否则Pod需要准备好进行记录。

据我所知,尽管文档在说什么,在1.18上仍然如此。

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

最佳方案是在Kubernetes上使用service based dns names。被证明是非常可靠的。