Kubernetes(k8s)如何使用kube-dns实现服务发现

追踪 Kubernetes 中的 DNS 查询 在过去的文章中,我们曾 追踪过 Kubernetes 中的网络数据包[1],这篇文章将追踪 Kubernetes 中的 DNS 查询。让我们以在 Pod 中解析 Service 完全限定域名(FQDN)为例。在开始之前,先回顾下 DNS 的解析流程。 阅读详情
  • Kubernetes中如何发现服务

  • 如何发现Pod提供的服务
  • 如何使用Service发现服务
  • 如何使用kube-dns发现服务
  • kube-dns原理

  • 组成
  • 域名格式
  • 配置

注:本次分享内容基于Kubernetes 1.2版本!

下面从一个简单的例子开始讲解。

1、Kubernetes中如何发现服务

◆   发现Pod提供的服务

首先使用nginx-deployment.yaml文件创建一个Nginx Deployment,文件内容如图所示:

首先创建两个运行Nginx服务的Pod:

20161014201039

使用kubectl create -f nginx-deployment.yaml指令创建,这样便可以得到两个运行nginx服务的Pod。待Pod运行之后查看一下它们的IP,并在k8s集群内通过podIP和containerPort来访问Nginx服务:

获取Pod IP:

20161014201048

在集群内访问Nginx服务:

20161014201057

看到这里相信很多人会有以下疑问:

  1. 每次收到获取podIP太扯了,总不能每次都要手动改程序或者配置才能访问服务吧,要怎么提前知道podIP呢?
  2. Pod在运行中可能会重建,IP变了怎么解?
  3. 如何在多个Pod中实现负载均衡嘞?

这些问题使用k8s Service就可以解决。

◆   使用Service发现服务

下面为两个Nginx Pod创建一个Service。使用nginx-service.yaml文件进行创建,文件内容如下:

20161014201106

创建之后,仍需要获取Service的Cluster-IP,再结合Port访问Nginx服务。

Service可以将pod  IP封装起来,即使Pod发生重建,依然可以通过Service来访问Pod提供的服务。此外,Service还解决了负载均衡的问题,大家可以多访问几次Service,然后通过kubectl logs <Pod Name>来查看两个Nginx Pod的访问日志来确认。

获取IP:

20161014201113

在集群内访问Service:

20161014201119

虽然Service解决了Pod的服务发现和负载均衡问题,但存在着类似的问题:不提前知道Service的IP,还是需要改程序或配置啊。看到这里有没有感觉身体被掏空?

接下来聊聊kube-dns是如何解决上面这个问题的。

◆   使用kube-dns发现服务

kube-dns可以解决Service的发现问题,k8s将Service的名称当做域名注册到kube-dns中,通过Service的名称就可以访问其提供的服务。

可能有人会问如果集群中没有部署kube-dns怎么办?没关系,实际上kube-dns插件只是运行在kube-system命名空间下的Pod,完全可以手动创建它。可以在k8s源码(v1.2)的cluster/addons/dns目录下找到两个模板(skydns-rc.yaml.in和skydns-svc.yaml.in)来创建,为大家准备的完整示例文件会在分享结束后提供获取方式,PPT中只截取了部分内容。

通过skydns-rc.yaml文件创建kube-dns Pod,其中包含了四个containers,这里开始简单过一下文件的主要部分,稍后做详细介绍。

第一部分可以看到kube-dns使用了RC来管理Pod,可以提供最基本的故障重启功能。

创建kube-dns Pod,其中包含了4个containers

20161014201128

接下来是第一个容器  etcd  ,它的用途是保存DNS规则。

20161014201134

第二个容器  kube2sky ,作用是写入DNS规则。

20161014201141

第三个容器是  skydns ,提供DNS解析服务。

20161014201148

最后一个容器是  healthz ,提供健康检查功能。

20161014201154

有了Pod之后,还需要创建一个Service以便集群中的其他Pod访问DNS查询服务。通过skydns-svc.yaml创建Service,内容如下:

20161014201201

注:dns service 这里是需要强行指定service IP,如上的10.0.0.10(它会被插入到 pod对应的docker 容器中的/etc/resolv.conf中),作为k8s 内部的dns服务器。

创建完kube-dns Pod和Service,并且Pod运行后,便可以访问kube-dns服务。

下面创建一个Pod,并在该Pod中访问Nginx服务:

创建之后等待kube-dns处于运行状态

20161014201212

再新建一个Pod,通过其访问Nginx服务

20161014201220

在curl-util Pod中通过Service名称访问my-nginx Service:

20161014201227

只要知道需要的服务名称就可以访问,使用kube-dns发现服务就是那么简单。

虽然领略了使用kube-dns发现服务的便利性,但相信有很多人也是一头雾水:kube-dns到底怎么工作的?

在集群中启用了kube-dns插件,怎么就能通过名称访问Service了呢?

2、kube-dns原理

◆   Kube-dns组成

之前已经了解到kube-dns是由四个容器组成的,它们扮演的角色可以通过下面这张图来理解。(不同的kube-dns版本其内部架构实现还不一样,下图只是作为一个参考而已)。

20161014201235

其中:

  • SkyDNS是用于服务发现的开源框架,构建于etcd之上。作用是为kubernetes集群中的Pod提供DNS查询接口。项目托管于https://github.com/skynetservices/skydns
  • etcd是一种开源的分布式key-value存储,其功能与ZooKeeper类似。在kube-dns中的作用为存储SkyDNS需要的各种数据,写入方为kube2sky,读取方为SkyDNS。项目托管于https://github.com/coreos/etcd。
  • kube2sky是k8s实现的一个适配程序,它通过名为kubernetes的Service(通过kubectl get svc可以查看到该Service,由集群自动创建)调用k8s的list和watch API来监听k8s Service资源的变更,从而修改etcd中的SkyDNS记录。代码可以在k8s源码(v1.2)的cluster/addons/dns/kube2sky/目录中找到。
  • exec-healthz是k8s提供的一种辅助容器,多用于side car模式中。它的原理是定期执行指定的Linux指令,从而判断当前Pod中关键容器的健康状态。在kube-dns中的作用就是通过nslookup指令检查DNS查询服务的健康状态,k8s livenessProbe通过访问exec-healthz提供的Http API了解健康状态,并在出现故障时重启容器。其源码位于https://github.com/kubernetes/contrib/tree/master/exec-healthz。
  • 从图中可以发现,Pod查询DNS是通过ServiceName.Namespace子域名来查询的,但在之前的示例中只用了Service名称,什么原理呢?其实当我们只使用Service名称时会默认Namespace为default,而上面示例中的my-nginx Service就是在default Namespace中,因此是可以正常运行的。关于这一点,后续再深入介绍。
  • skydns-rc.yaml中可以发现livenessProbe是设置在kube2sky容器中的,其意图应该是希望通过重启kube2sky来重新写入DNS规则。

◆   域名格式

接下来了解一下kube-dns支持的域名格式,具体为:<service_name>.<namespace>.svc.<cluster_domain>。

其中cluster_domain可以使用kubelet的–cluster-domain=SomeDomain参数进行设置,同时也要保证kube2sky容器的启动参数中–domain参数设置了相同的值。通常设置为cluster.local。那么之前示例中的my-nginx Service对应的完整域名就是my-nginx.default.svc.cluster.local。看到这里,相信很多人会有疑问,既然完整域名是这样的,那为什么在Pod中只通过Service名称和Namespace就能访问Service呢?下面来解释其中原因。

3、配置

◆   域名解析配置

为了在Pod中调用其他Service,kubelet会自动在容器中创建域名解析配置(/etc/resolv.conf),内容为:

20161014201244

感兴趣的可以在网上查找一些resolv.conf的资料来了解具体的含义。之所以能够通过Service名称和Namespace就能访问Service,就是因为search配置的规则。在解析域名时会自动拼接成完整域名去查询DNS。

刚才提到的kubelet –cluster-domain参数与search的具体配置是相对应的。而kube2sky容器的–domain参数影响的是写入到etcd中的域名,kube2sky会获取Service的名称和Namespace,并使用–domain参数拼接完整域名。这也就是让两个参数保持一致的原因。

◆   NS相关配置

kube-dns可以让Pod发现其他Service,那Pod又是如何自动发现kube-dns的呢?在上一节中的/etc/resolv.conf中可以看到nameserver,这个配置就会告诉Pod去哪访问域名解析服务器。

20161014201251

相应的,可以在之前提到的skydns-svc.yaml中看到spec.clusterIP配置了相同的值。通常来说创建一个Service并不需要指定clusterIP,k8s会自动为其分配,但kube-dns比较特殊,需要指定clusterIP使其与/etc/resolv.conf中的nameserver保持一致。

修改nameserver配置同样需要修改两个地方,一个是kubelet的–cluster-dns参数,另一个就是kube-dns Service的clusterIP。

4、总结

接下来重新梳理一下本文的主要内容:

  • 在k8s集群中,服务是运行在Pod中的,Pod的发现和副本间负载均衡是我们面临的问题。
  • 通过Service可以解决这两个问题,但访问Service也需要对应的IP,因此又引入了Service发现的问题。
  • 得益于kube-dns插件,我们可以通过域名来访问集群内的Service,解决了Service发现的问题。
  • 为了让Pod中的容器可以使用kube-dns来解析域名,k8s会修改容器的/etc/resolv.conf配置。

 有了以上机制的保证,就可以在Pod中通过Service名称和namespace非常方便地访问对应的服务了.

另外一篇不错的k8s dns安装与配置文档在这里: k8s入门系列之扩展组件(一)DNS安装篇


[Kubernetes]如何通过服务名发现服务? kube-proxy 和 kube-dns 原理解密 前言 在这里,你将了解 Kubernetes 集群如何实现通过服务名,进行服务发现,负载均衡,调用后端服务。 这里,我们以服务名为ticknet为例,假设我们要访问内部服务ticknet的某个http接口,则,我们的请求链接格式可以是:http://ticknet/get/user/10000 目录 kube-dns服务发现原理 kube-proxy实现负载均衡 总结 参考 1. kube-... 阅读详情

相关推荐

Kubernetes DNS服务原理与CoreDNS实战指南

Kubernetes DNS是集群服务发现的核心基础设施,其本质是为Service提供基于域名的自动解析能力。它依托CoreDNS这一模块化、可插拔的权威DNS服务器,通过监听API Server中的Service和Endpoints变更,动态生成并维护`<service>.<namespace>.svc.cluster.local`等内部域名记录。技术价值在于解耦服务调用与IP地址,支撑Service Mesh、Ingress、Metrics等上层组件稳定运行;典型应用场景包括跨Pod服务调用、微服务间通

leonard61306500的专栏 393

Kubernetes如何使用kube-dns实现服务发现

大纲: •       Kubernetes中如何发现服务 •       如何发现Pod提供的服务 •       如何使用Service发现服务 •       如何使用kube-dns发现服务 •       kube-dns原理 •       组成 •       域名格式 •       配置 注:本次分享内容基于Kubernetes 1.2版本! 下面从一个简单的例子开始讲解。 ...

weixin_34409822的博客 672

深入解析SerDes系统中的时钟数据恢复电路(CDR)——基于Cadence的PLL/Bang-Bang/PS-PI架构实现与仿真

本文深入解析SerDes系统中的时钟数据恢复电路(CDR),重点探讨基于Cadence平台的PLL、Bang-Bang和PS-PI三种架构的实现与仿真。通过详细的技术对比和工程实践案例,揭示CDR在高速串行通信中的关键作用,并提供TSMC 28nm工艺下的优化策略与故障排查经验,助力工程师应对10Gbps以上SerDes设计挑战。

weixin_29202687的博客 249

K8S入门学习(五):集群编排工具之 Kuboard V2 版本

一、Kuboard 是什么 Kuboard 是一款类似于Kubernetes Dashboard 的轻量级的图形化管理工具。旨在帮助用户更轻松地管理 Kubernetes 集群。 Kuboard 提供了一个直观、功能丰富的用户界面,使用户可以方便地查看和操作 Kubernetes 集群中的各种资源。 直观的用户界面:直...

qq_35485206的博客 2542

从Pikachu靶场实战解析越权漏洞:原理、攻击与防御

本文通过Pikachu靶场实战详细解析越权漏洞的原理、攻击方式与防御策略。文章深入探讨水平越权和垂直越权的危害,结合代码示例展示漏洞利用过程,并提供代码层和架构层的立体化防御方案,帮助开发者有效防范这一Web安全隐形杀手。

weixin_29325007的博客 357

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

shannanshouyin的博客 1326

k8s系列-kuboard 该操作平台的使用操作

k8s集群kuboard平台创建工作负载方法,这里是内外网的创建方法,涉及到应用路由和地址映射

qq_48975137的博客 4241

UNet改进(23):如何用SLCAM模块提升UNet的分割性能

本文提出一种改进的UNet架构,通过引入轻量化注意力模块(SLCAM)增强医学图像分割性能。SLCAM整合了通道和空间双重注意力机制:通道注意力采用全局池化和共享MLP学习通道权重,空间注意力通过7×7卷积捕捉上下文信息。网络在传统UNet基础上,在每个下采样和上采样块后加入SLCAM模块,并保持跳跃连接结构。实验表明,该方法能自适应聚焦重要特征,在不显著增加计算负担的情况下提升分割精度,特别适用于医学图像等需精确边界的场景。未来可探索三维注意力、动态参数调整等改进方向。

2501_91516851的博客 438

K8S服务发现原理及开发框架的配合

将网络层和服务治理的通用能力(服务发现、负载均衡、路由、熔断、限流)下沉到 Kubernetes 和服务网格,让 Java 应用更专注于业务逻辑。它将服务发现的责任从客户端(如 Spring Cloud 的 Ribbon/LoadBalancer)下沉到了 Kubernetes 平台层,对应用完全透明。:将熔断下沉到 Service Mesh (Envoy),对应用透明,支持多语言,集中管理。:在入口 (Ingress) 或服务间 (Mesh) 进行限流,保护整个服务。spec.replicas 字段。

Arthur Guo 的专栏 1044

基于Scrapy+Playwright的学术会议信息智能爬取系统实战

本文详细介绍如何使用Python构建一个高效的学术会议信息爬取系统,结合Scrapy框架和Playwright无头浏览器技术,实现对全球学术会议数据的自动化采集、清洗和存储。文章包含完整的技术方案设计、代码实现细节以及性能优化策略,可帮助读者快速掌握现代网络爬虫开发的核心技术。关键词:Python爬虫、Scrapy、Playwright、学术会议、数据采集、反爬对抗python复制下载。

2201_76125261的博客 710

14、Java 中 TAF 和 FCF 的使用及 Oracle 数据库升级与迁移指南

本文详细介绍了Java中实现高可用性的TAF(透明应用故障转移)和FCF(快速连接故障转移)技术,以及如何将Oracle 9iR2 RAC环境升级到10gR2 RAC,并将数据从OCFS迁移到ASM。通过示例代码和操作步骤,帮助开发者和数据库管理员更好地应对数据库故障和数据迁移问题,提升系统的可用性和性能。

egg99的博客 108

PX4 自动驾驶仪中的 HEX/ProfiCNC Here2 GPS 模块:规格解析、接线集成与软件配置指南

本篇技术指南以 PX4-Autopilot 仓库的官方文档 [gps_hex_here2.md](https://link.gitcode.com/i/6e688846fb9f1490286ba2ed4edbee95) 为骨架,完整介绍 HEX/ProfiCNC Here2 GPS 接收机的硬件规格、与 Pixhawk 系列飞控的接线方式、PX4 中的即插即用配置流程,并结合仓库源码剖析 PX4

gitblog_00053的博客 713

导数与微分在 FPS 射击游戏中的实际应用:把“手感”算出来

摘要:射击游戏开发中,单线程适用于简单小游戏(如单机打靶),所有任务由主线程顺序处理,代码简单但效率较低;多线程则适合复杂场景(如多人在线3D大作),通过渲染、逻辑、网络、音效等线程分工协作,确保画面流畅、响应迅速和实时同步。选择依据取决于游戏复杂度、联网需求和性能要求,小型游戏用单线程,大型高要求项目必须采用多线程架构。(149字)

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 3278

Kubernetes网络之Service网络(2)

Kubernetes网络之Service网络(2)K8S服务网络实现原理Service网络概念模型DNS方案(Not Adopted)Service RegistryK8S服务发现原理服务发现之K8S方案vs Eureka+Ribbon方案 上一篇:Kubernetes网络之Pod网络(1) K8S服务网络实现原理 上一篇讲解了K8S中4层网络中的Pod网络,Pod网络可以让K8S集群中所有Pods在逻辑上都处于一个平面网络内,可以正常的做IP寻址和通信。 但是Pod是K8S集群中的虚拟机抽象,最终我们在

ryanlll3的博客 663

【工具插件类教学】Unity翻书效果插件Book-Page Curl Pro教程

特征: • 从左到右和从右到左翻页 • 与画布缩放器 配合使用 • 可配置的自动翻转脚本 • 支持向页面 添加 UI 元素 • 支持透明页面 • 适用于“世界空间”画布

纯技术流日常开发商业开发记录总结等 3672

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Kubernetes网络三部曲之二~Service网络

在上一篇《Kubernetes网络三部曲~Pod网络》中,波波讲解了K8s的4层网络中的第1层Pod网络。有了Pod网络,K8s集群内的所有Pods在逻辑上都可以看作在一个平面网络内,可以正常IP寻址和互通。

meser88的博客 840

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[转载]Kubernetes网络三部曲之二~Service网络

文章目录前言Service网络概念模型服务发现技术演进K8s的Service网络原理总结原文链接 原文链接:https://blog.youkuaiyun.com/yang75108/article/details/101267444 前言 在上一篇《Kubernetes网络三部曲~Pod网络》中,波波讲解了K8s的4层网络中的第1层Pod网络。有了Pod网络,K8s集群内的所有Pods在逻辑上都可以看作在一个平面网络内,可以正常IP寻址和互通。但是Pod仅仅是K8s云平台中的虚拟机抽象,最终,我们需要在K8s集群中运

开心就好的专栏 690

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[测试环境]K8s使用kube-dns实现服务发现【转载】

原文:http://www.ctoutiao.com/98480.html 大纲: •       Kubernetes中如何发现服务 •       如何发现Pod提供的服务 •       如何使用Service发现服务 •       如何使用kube-dns发现服务 •       kube-dns原理 •       组成

急速虫子 1万+

k8s中的service

在了解了k8s的基本原理以后,还是有一个疑惑一些问题,就是k8s中部署的服务如何对外提供服务,pod与pod是如何通信的,k8s内部的服务又是如何做负载均衡的。一个pod挂了,再重启拉起来一个pod,是如何加入负载均衡中的,为什么它拉起来就能提供服务? 直到我了解了k8s中的service,这一切才得到答案。 service是什么 其实就是k8s中的服务注册与负载均衡。 最终能够实现,提供一个唯一的地址,供我们来访问地址,而不需要具体的去了解,这个服务起的Pod的ip是什么。 ...

Angus 2468
上一篇: Traefik-kubernetes 负责均衡器初试
下一篇: kubectl 命令集合
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值