Kubernetes Service服务发现dns之CoreDNS

devtools/2025/3/3 15:37:58/

文章目录

    • 背景
    • 什么是Service、服务发现、Endpoint
    • 什么是CoreDNS
      • CoreDNS 的工作原理
    • 常用命令
      • coredns 运行状态
      • 根据服务名,判断某个服务dns解析是否正常

背景

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 运行状态

  1. 查看 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 个容器已就绪)。

  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)已正确暴露。

  1. 检查 CoreDNS 的配置
    CoreDNS 的配置文件通常以 ConfigMap 的形式存在。可以查看其配置。
kubectl get configmap -n kube-system coredns -o yaml
  1. 验证 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

http://www.ppmy.cn/devtools/164219.html

相关文章

【图像亮度、对比度调整,直方图均衡化及图像平滑】

图像增强与基本处理 目录 图像增强与基本处理目标知识点1. 亮度调整2. 对比度调整3. 直方图均衡化4. 图像平滑&#xff08;高斯滤波&#xff09;5. 图像平滑&#xff08;中值滤波&#xff09; 目标 学习图像增强的基本方法&#xff0c;包括亮度调整、对比度调整、直方图均衡化…

SheetDataMerge合并工作表(excel)内多行同类数据的小工具。

SheetDataMerge SheetDataMerge是一款简单易用的工具&#xff0c;能够快速合并工作表中的多行同类数据。虽然Excel自带的数据透视表也能实现类似功能&#xff0c;但它属于进阶操作&#xff0c;需要一定的学习成本。 相比之下&#xff0c;SheetDataMerge的操作非常便捷&#xff…

hook和钩子函数

1.介绍 钩子函数&#xff08;Hook Function&#xff09; 本质上是一种回调callback机制&#xff0c;它允许程序在特定事件发生时执行用户自定义代码。一种实现方式。 ✔ Hook 是一种更广义的概念&#xff0c;指拦截或修改函数行为&#xff0c;而钩子函数是 Hook 的一种具体实…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

Elasticsearch简单学习

1、依赖的导入 <!--ES依赖--> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2、客户端链接 RestHighLevelClient client new RestHigh…

Android Activity启动流程详解

目录 Activity 启动流程详细解析 1. 应用层发起启动请求 1.1 调用 startActivity() 1.2 通过 Instrumentation 转发请求 2. 系统服务处理&#xff08;AMS 阶段&#xff09; 2.1 Binder IPC 通信 2.2 AMS 处理流程 2.3 跨进程回调 ApplicationThread 3. 目标进程初始化…

基于机器学习的结构MRI分析:预测轻度认知障碍向阿尔茨海默病的转化

摘要 阿尔茨海默病是一种致残性神经退行性疾病&#xff0c;目前尚无有效的治疗方法。预测阿尔茨海默病的诊断对患者的预后至关重要&#xff0c;但目前的阿尔茨海默病生物标志物检测方法具有侵入性、耗时且昂贵。因此&#xff0c;开发基于MRI的计算方法用于阿尔茨海默病的早期诊…

RISC-V汇编学习(一)—— 基础认识

最近这三年的工作时间大部分的工作&#xff0c;都是基于riscv的cpu和接口ip开发适配驱动&#xff0c;时不时的就要debug测试代码&#xff0c;面对很多都是汇编&#xff0c;所以也是整理下积累的一点点笔记&#xff0c;系列博客将总结下riscv相关的内容&#xff0c;一是给有需要…