背景
Kubernetes 集群内部的服务发现是微服务架构的核心基础,而 DNS 服务则是实现这一机制的关键组件。
在 Kubernetes 集群中,服务发现允许 Pod 通过服务名(而非硬编码 IP)定位其他服务。
早期的默认 DNS 组件 kube-dns 因架构复杂、性能瓶颈和维护成本高等问题逐渐被弃用。自 Kubernetes 1.11 起,CoreDNS 成为官方推荐的 DNS 解决方案。
什么是Service、服务发现、Endpoint
在 Kubernetes中,Service是用于将一组Pod以稳定的网络接口暴露出来,公开为一个网络服务的抽象,提供稳定的访问入口。虽然 Pod 的 IP 是动态分配的、会频繁变动,但 Service 通过分配一个固定的虚拟 IP(ClusterIP)来解决 Pod 动态变化的问题,并实现负载均衡,确保客户端始终可以通过统一的方式访问服务。
在 Kubernetes 中,Pod的生命周期是短暂的,可能会被终止和重新创建,而 Service 提供了一个持久的访问入口,确保用户或其他服务可以通过固定的 IP 地址或 DNS 名称访问这些 Pod。
Endpoint:
在 Kubernetes 中,Endpoint 是用来连接服务和实际提供服务的 Pod 的资源。Endpoint 对象负责维护一组 IP 地址和端口信息,这些信息指向在集群中运行的实际 Pod,使得客户端可以通过 Service 访问这些 Pod。
Endpoint则是与 Service 相关联的资源,存储了与该服务相关联的实际 Pod 的 IP 地址和端口列表。
- 当一个 Service 被创建时,Kubernetes 控制平面会自动生成与该 Service 对应的 Endpoint,
- 用来维护服务和实际运行的 Pod 之间的映射。
命令操作
查看 Service 相关的 Endpoint:
kubectl get endpoints <service-name>
查看 Endpoint 详细信息:
kubectl describe endpoints <service-name>
服务的 DNS 解析结果通常是其 ClusterIP,但如果你需要查看服务的具体后端 Pod,可以检查其 Endpoints.
kubectl get endpoints my-service -n default
注意,加强对 Services(服务)的理解, 从lens工具菜单,我们可以看到Services(服务)归类到网络。
什么是CoreDNS
官网: https://coredns.io/
CoreDNS 是 Kubernetes 中用于服务发现和内部 DNS 解析的默认 DNS 服务器。
服务发现:在 Kubernetes 集群中,服务(Service)是通过 DNS 名称来访问的。当一个 Pod 需要访问另一个服务时,它会向 CoreDNS 发起一个 DNS 查询请求。
这是最关键的插件,负责处理 Kubernetes 内部服务的 DNS 解析。
CoreDNS 采用单进程模型,直接与 Kubernetes API 交互:
- Kubernetes 插件:实时监听 Service/Endpoint/Pod 变更,生成 DNS 记录。
- 插件链机制:通过组合插件实现 DNS 解析、缓存、转发等功能。
- 无状态设计:无需依赖外部存储(如 etcd),降低运维复杂度。
CoreDNS 的工作原理
CoreDNS 的工作原理
1.当一个 Pod 请求一个服务的 DNS 名称(例如 my-service.my-namespace.svc.cluster.local)时,DNS 请求会被 CoreDNS 处理。
2.CoreDNS 检查 Corefile 中的配置,首先尝试使用 kubernetes 插件来解析请求。
3.如果服务名存在,CoreDNS 将返回服务的 ClusterIP 地址。
4.如果请求无法由 Kubernetes 内部解析,CoreDNS 使用 forward 插件将查询转发到外部 DNS 服务器进行解析。
常用命令
dns__68">coredns 运行状态
- 查看 CoreDNS 的 Pod 状态
首先,确认 CoreDNS 的 Pod 是否正常运行。CoreDNS 通常位于 kube-system 命名空间。
kubectl get pods -n kube-system -l k8s-app=kube-dns
输出示例:
NAME READY STATUS RESTARTS AGE
coredns-7f6cbbb7b8-abcde 1/1 Running 0 10d
coredns-7f6cbbb7b8-fghij 1/1 Running 0 10d
STATUS:确保 Pod 的状态是 Running。
READY:确保 Pod 的容器已经就绪(1/1 表示 1 个容器已就绪)。
- 查看 CoreDNS 的 Service
CoreDNS 通常通过一个 Service 暴露服务。可以查看其 Service 的状态。
kubectl get svc -n kube-system kube-dns
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 10d
CLUSTER-IP:确保 CoreDNS 的 Service 有一个有效的 ClusterIP。
PORT(S):确保端口 53(UDP/TCP)已正确暴露。
- 检查 CoreDNS 的配置
CoreDNS 的配置文件通常以 ConfigMap 的形式存在。可以查看其配置。
kubectl get configmap -n kube-system coredns -o yaml
- 验证 DNS 解析
最后,验证 CoreDNS 是否正常工作。可以在集群中创建一个临时 Pod 并测试 DNS 解析。
kubectl run -it --rm --image=busybox:1.28 --restart=Never -- dns-test -- nslookup kubernetes.default
dns_116">根据服务名,判断某个服务dns解析是否正常
列出命名空间中的服务
kubectl get svc -n your-namespace
Kubernetes 会自动为每个 Service 分配一个 DNS 名称,格式为 <service-name>.<namespace>.svc.cluster.local
假设你找到的服务名是 my-service
,位于 default
命名空间,那么它的 DNS 名称是:my-service.default.svc.cluster.local
如果服务位于其他命名空间(例如 my-namespace
),则 DNS 名称是:my-service.my-namespace.svc.cluster.local
使用 nslookup 查询 DNS 信息
你可以通过创建一个临时 Pod(例如使用 busybox 镜像)来查询服务的 DNS 信息。
kubectl run -it --rm --image=busybox:1.36 --restart=Never dns-test -- nslookup my-service.default.svc.cluster.local