Kubernetes Service服务发现dns之CoreDNS

文章目录

背景

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:

bash 复制代码
kubectl get endpoints <service-name>

查看 Endpoint 详细信息:

bash 复制代码
kubectl describe endpoints <service-name>

服务的 DNS 解析结果通常是其 ClusterIP,但如果你需要查看服务的具体后端 Pod,可以检查其 Endpoints.

bash 复制代码
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 服务器进行解析。

常用命令

coredns 运行状态

  1. 查看 CoreDNS 的 Pod 状态

首先,确认 CoreDNS 的 Pod 是否正常运行。CoreDNS 通常位于 kube-system 命名空间。

bash 复制代码
kubectl get pods -n kube-system -l k8s-app=kube-dns

输出示例:

bash 复制代码
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 个容器已就绪)。

  1. 查看 CoreDNS 的 Service

CoreDNS 通常通过一个 Service 暴露服务。可以查看其 Service 的状态。

bash 复制代码
kubectl get svc -n kube-system kube-dns

输出示例:

bash 复制代码
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)已正确暴露。

  1. 检查 CoreDNS 的配置
    CoreDNS 的配置文件通常以 ConfigMap 的形式存在。可以查看其配置。
bash 复制代码
kubectl get configmap -n kube-system coredns -o yaml
  1. 验证 DNS 解析

最后,验证 CoreDNS 是否正常工作。可以在集群中创建一个临时 Pod 并测试 DNS 解析。

bash 复制代码
kubectl run -it --rm --image=busybox:1.28 --restart=Never -- dns-test -- nslookup kubernetes.default

根据服务名,判断某个服务dns解析是否正常

列出命名空间中的服务

bash 复制代码
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 信息。

bash 复制代码
kubectl run -it --rm --image=busybox:1.36 --restart=Never dns-test -- nslookup my-service.default.svc.cluster.local
相关推荐
Austindatabases3 小时前
云原生 DB 技术将取代K8S为基础云数据库服务-- 2025年云数据库专栏(一)
数据库·云原生·容器·kubernetes
xiaogg36787 小时前
kubectl 运行脚本 kubernetes 部署springcloud微服务 yaml + Dockerfile+shell 脚本
spring cloud·微服务·kubernetes
a_j5814 小时前
k8s面试题总结(九)
java·docker·kubernetes
m0_5485030314 小时前
使用Kubernetes部署Spring Boot项目
spring boot·容器·kubernetes
云上艺旅15 小时前
K8S学习之基础十一:容器钩子
学习·云原生·容器·kubernetes
ThisIsClark20 小时前
如何将ConfigMap中的内容挂载为容器内的文件
容器·rpc·kubernetes
tingting011920 小时前
anolis8.9-k8s1.32-master集群-二进制部署
云原生·容器·kubernetes
tingting011920 小时前
anolis8.9-k8s1.32-系统基本配置
云原生·容器·kubernetes
LCY13320 小时前
AI生成的web框架 包含前后端 k8s管理等
前端·人工智能·kubernetes
云上艺旅20 小时前
K8S学习之基础八:pod的状态和重启策略
java·学习·kubernetes