DNS 与服务发现
了解 Pod 如何使用 Kubernetes 内置 DNS 互相查找,以及服务发现的底层工作原理
DNS 与服务发现 是 CoddyKit 上的免费 Kubernetes Basics 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kubernetes Basics 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kubernetes Basics 课程共包含 4 节课。
服务发现问题
容器组不断创建和销毁,其 IP 地址也持续变化。硬编码 IP 会立即失效。Kubernetes 通过基于 DNS 的服务发现解决这一问题。
您无需使用 IP,而是访问一个稳定的名称。
集群 DNS
每个集群都会运行 DNS 服务(通常是 CoreDNS)。它会自动为服务和容器组创建 DNS 记录,使名称解析到正确的 ClusterIP。
服务 DNS 名称
服务会按照可预测的模式获得 DNS 名称:
service-name.namespace.svc.cluster.local
在同一命名空间内,您只需使用简短的 service-name。
# from a Pod in the same namespace
curl http://payment-service:8080
# fully qualified, from any namespace
curl http://payment-service.shop.svc.cluster.local:8080命名空间与名称
命名空间是名称的一部分。要访问另一个命名空间中的服务,请将其包含在名称中:service.namespace。
# Pod in 'frontend' namespace calling 'backend' namespace
curl http://api.backend.svc.cluster.local从容器组测试 DNS
您可以启动一个临时容器组来测试名称解析。
kubectl run dnstest --image=busybox:1.36 --rm -it --restart=Never -- nslookup payment-serviceCoreDNS 如何解析名称
当容器组查询名称时,请求会发送到 CoreDNS。CoreDNS 查找匹配的服务并返回其 ClusterIP。对于无头服务,它会直接返回容器组的 IP 地址。
无头服务
无头服务(clusterIP: None)会跳过单个虚拟 IP。DNS 会改为返回各个容器组的 IP,这对于需要直接访问容器组的有状态应用至关重要。
apiVersion: v1
kind: Service
metadata:
name: db
spec:
clusterIP: None
selector:
app: db
ports:
- port: 5432容器组 DNS 记录
使用无头服务时,每个后端容器组还可以获得自己的 DNS 记录。这对于 StatefulSets 很有用,因为其中的容器组具有稳定的身份,例如 db-0 和 db-1。
# stable per-Pod name in a StatefulSet
curl http://db-0.db.default.svc.cluster.local:5432检查容器组的 resolv.conf
Kubernetes 会将 DNS 配置注入每个容器组。搜索域可以让简短名称正确解析。
kubectl exec -it mypod -- cat /etc/resolv.conf
# nameserver 10.96.0.10
# search default.svc.cluster.local svc.cluster.local cluster.local环境变量与 DNS 的比较
Kubernetes 也会将服务连接信息注入环境变量,但只会注入容器组启动时已经存在的服务的信息。首选 DNS,是因为它始终反映当前状态。
常见 DNS 陷阱
- 跨命名空间调用时忘记指定命名空间
- 对于没有匹配容器组的服务(没有端点),却期待它能通过 DNS 解析
- 在应用中缓存过时的 IP,而不是重新解析名称
快速检查
选择正确的 DNS 名称格式。
回顾
您已经了解到,Kubernetes 使用 CoreDNS 为服务提供遵循 service.namespace.svc.cluster.local 格式的稳定 DNS 名称。在同一命名空间内可以使用简短名称,无头服务会公开各个容器组的 IP,而 DNS 始终反映当前的集群状态。
常见问题解答
「DNS 与服务发现」课时是免费的吗?
是的 — 「DNS 与服务发现」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kubernetes Basics 课程的其余内容,请升级到 CoddyKit PRO。 Kubernetes Basics 课程共包含 4 节课。
「DNS 与服务发现」这节课中我会学到什么?
了解 Pod 如何使用 Kubernetes 内置 DNS 互相查找,以及服务发现的底层工作原理 你通过在浏览器中直接运行的动手代码来练习 Kubernetes Basics,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kubernetes Basics 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kubernetes Basics 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「DNS 与服务发现」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kubernetes Basics 课中编写并运行代码吗?
能。每节 Kubernetes Basics 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。