kubernetes - kubernetes v1.18:Pod 的 DNS 解析记录
问题描述
问题是 Kubernetes 中的 Pod DNS 解析。来自官方文档的声明(从右上角的下拉列表中选择 v1.18): https ://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods
豆荚。
A/AAAA 记录
由 Deployment 或 DaemonSet 创建的任何 pod 都具有以下可用的 DNS 解析:
pod-ip-address.deployment-name.my-namespace.svc.cluster-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 deploy nginx --image=nginx
.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
:
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 for name 失败?是不是我做错了什么?
当我继续探索 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.cluster.local
10.244.1.4 的 pod 在 default 命名空间中也成功了?
解决方案
关于您的第一个问题,据我所知,您的假设是否正确,文档似乎不准确。pod 的 A/AAAA 参考是文档 (1.18) 中的新内容。为此,我强烈建议您在这里打开一个问题,以便开发人员可以仔细研究它。
我建议您在这方面参考1.17 文档,因为它反映了实际情况。
在 1.17 中我们可以看到这个注释:
注意: 因为不是为 Pod 名称创建
hostname
A 或 AAAA 记录,所以需要创建 Pod 的 A 或 AAAA 记录。一个没有hostname
但 有的 Podsubdomain
只会为无头服务 (default-subdomain.my-namespace.svc.cluster-domain.example
) 创建 A 或 AAAA 记录,指向 Pod 的 IP 地址。此外,除非在服务上设置,否则 Pod 需要准备好才能有记录publishNotReadyAddresses=True
。
据我所知,尽管文档在说什么,但在 1.18 上这仍然是正确的。
关于第二个问题的方向相同,您也可以打开一个问题,但我个人认为使用基于 IP 的 DNS 名称没有任何实际原因。这些名称供 kubernetes 内部使用,使用它并没有给您任何优势。
最好的方案是在 Kubernetes 上使用基于服务的 dns 名称。事实证明它非常可靠。
推荐阅读
- javascript - Having Javascript logic issues..again
- ios - iOS CoreMotion 态度相对于 iPhone 坐标系
- rest - RestTemplate 返回 null
- flask - 是否可以从文本中制作 Jinja/Flask 渲染代码?
- javascript - Using Media Querys with dynamic Properties in Vue
- entity-framework-core - Clone a record and all it's related records in Entity Framework CORE
- python - 从 sqlalchemy 引擎调用时提交内部 postgressql11 过程抛出错误
- c - 为什么 C99 编译器不将“!a && b”优化为布尔值的“a < b”?
- java - Apache Spark CSV 不解析包含选项(“headers”,true)的标题行
- c# - 为什么我们在 Visual Studio 生成的 ApplicationDbContext 类中添加模型的属性