【K8S系列】深入解析DNS

news2024/12/30 1:15:25

 序言

世界上最幸福的事之一,莫过于经过一番努力后,所有东西正慢慢变成你想要的样子。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

Kubernetes (k8s) 是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下DNS。

希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流

 专栏介绍

这是这篇文章所在的专栏,欢迎订阅:【深入解析k8s】专栏

简单介绍一下这个专栏要做的事:

主要是深入解析每个知识点,帮助大家完全掌握k8s,以下是已更新的章节

序号文章
第一讲深入解析 k8s:入门指南(一)
第二讲深入解析 k8s:入门指南(二)
第三讲深入解析Pod对象(一)
第四讲深入解析Pod对象(二)
第五讲深入解析无状态服务
第六讲深入解析有状态服务
第七讲深入解析控制器

第八讲

深入解析 ReplicaSet
第九讲深入解析滚动升级
第十讲深入解析StatefulSet(一)
第十一讲深入解析StatefulSet(二)
第十二讲深入解析DaemonSet
第十三讲深入解析Job
第十四讲深入解析etcd

1 基础介绍

1.1 概念介绍

什么是DNS

我们先来了解一下什么是DNS:

DNS(Domain Name System)是互联网上用于域名解析的分布式数据库系统

它将域名和 IP 地址之间建立了一种映射关系,使得用户可以使用易于记忆的域名来访问互联网上的各种资源,而不必记住它们的 IP 地址。

DNS工作原理

DNS(Domain Name System)的工作原理可以分为以下几个步骤:

  1. 域名解析请求:当用户在浏览器中输入一个域名时,浏览器会向本地 DNS 服务器发送一个域名解析请求。

  2. 本地 DNS 服务器查询:本地 DNS 服务器会首先查询自己的缓存,如果缓存中存在该域名的 IP 地址,则直接返回给浏览器。如果缓存中不存在,则本地 DNS 服务器会向根域名服务器发送一个查询请求。

  3. 根域名服务器响应:根域名服务器会返回给本地 DNS 服务器一个下一级域名服务器的 IP 地址。根域名服务器只负责返回下一级域名服务器的 IP 地址,不负责具体的域名解析工作。

  4. 顶级域名服务器查询:本地 DNS 服务器收到根域名服务器的响应后,会向下一级域名服务器发送一个查询请求,查询顶级域名服务器的 IP 地址。

  5. 顶级域名服务器响应:顶级域名服务器会返回给本地 DNS 服务器一个权威域名服务器的 IP 地址。

  6. 权威域名服务器查询:本地 DNS 服务器收到顶级域名服务器的响应后,会向权威域名服务器发送一个查询请求,查询该域名对应的 IP 地址。

  7. 权威域名服务器响应:权威域名服务器会返回给本地 DNS 服务器该域名对应的 IP 地址。

  8. 本地 DNS 服务器缓存:本地 DNS 服务器将该域名和 IP 地址的映射关系存储在缓存中,以便下一次查询时可以直接返回给浏览器。

  9. 浏览器访问:本地 DNS 服务器将该域名对应的 IP 地址返回给浏览器,浏览器通过该 IP 地址访问该域名对应的服务器。

DNS 的工作原理是一个分布式的系统,它可以支持海量的域名解析请求,并且具有高可用性和可靠性。在实际应用中,DNS 的性能和可靠性对于互联网服务的稳定运行具有非常重要的作用。

example.com域名解析示例:  

其他DNS的信息,专门还有一篇文章讲解,这里就不展开了,下面我们来看下k8s中,dns的k8s类型

2 k8s中的DNS

2.1 类型

在 Kubernetes 中,有两种常见的 DNS 服务器:

  • kube-dns  也是(Cluster DNS)
  • CoreDNS

这两个都是 Kubernetes 集群中的默认 DNS 服务器,用于为 Pod 和 Service 提供域名解析服务。

2.2 kube-dns 

kube-dns 是 Kubernetes 集群中最早的 DNS 解决方案,它由三个组件组成:

  • kube-dns
  • etcd  
  • dnsmasq

kube-dns 组件负责接收 DNS 请求,并将请求转发到 etcd 中存储的 DNS 记录中;

etcd 是一个分布式键值存储系统,用于存储 DNS 记录

dnsmasq 是一个轻量级的 DNS 服务器,用于解析 DNS 请求并返回相应的 IP 地址

kube-dns 的工作原理 

kube-dns 的工作原理如下:

  • 当一个 Pod 或 Service 需要解析一个域名时,它会向 Kubernetes 集群中的 DNS 服务器发送 DNS 请求。

  • kube-dns 组件会接收到这个请求,并根据请求中的域名和命名空间信息来查找相应的 Pod 或 Service,并返回对应的 IP 地址。

kube-dns 的优点在于它已经被广泛使用,并且在一些旧版本的 Kubernetes 中仍然是默认的 DNS 解决方案。

但是 kube-dns 的可扩展性和灵活性比较有限,而且它的性能也不如 CoreDNS

2.3 CoreDNS

CoreDNS 是一个开源的 DNS 服务器,它是 Kubernetes 集群中默认的 DNS 服务器。

与 kube-dns 不同,CoreDNS 可以支持更多的插件,并且具有更好的可扩展性和灵活性

在 Kubernetes 中,CoreDNS 主要用于为 Pod 和 Service 提供域名解析服务

当一个 Pod 或 Service 需要解析一个域名时,它会向 Kubernetes 集群中的 DNS 服务器发送 DNS 请求。

如果 CoreDNS 是 Kubernetes 集群中的默认 DNS 服务器,它就会接收到这个请求,并根据请求中的域名和命名空间信息来查找相应的 Pod 或 Service,并返回对应的 IP 地址。

CoreDNS 的工作原理

CoreDNS 的工作原理可以分为以下几个步骤:

  1. 监听:CoreDNS 监听 Kubernetes 集群中的 DNS 服务 IP 地址和端口,这个地址一般是 10.96.0.10:53。当一个 Pod 或 Service 需要解析一个域名时,它会向这个地址发送 DNS 请求。

  2. 转发:CoreDNS 接收到 DNS 请求后,会检查请求中的域名是否以 .cluster.local 结尾。如果是,则 CoreDNS 会将请求转发给 Kubernetes 集群内部的 Service 或 Pod。

  3. 判断:如果请求中的域名是一个 Service 的 DNS 名称,则 CoreDNS 会查找该 Service 的所有后端 Pod 的 IP 地址,并将其中一个返回给请求的 Pod 或 Service。

  4. pod判断:如果请求中的域名是一个 Pod 的 DNS 名称,则 CoreDNS 会直接返回该 Pod 的 IP 地址。

  5. 上游判断:如果请求的域名不是以 .cluster.local 结尾,则 CoreDNS 会将请求转发给上游 DNS 服务器进行解析。

CoreDNS 在 Kubernetes 中的工作原理与 kube-dns 类似,但它具有更好的可扩展性和灵活性

CoreDNS 可以通过插件进行扩展,例如可以添加文件插件来支持从文件中读取 DNS 记录,也可以添加 forward 插件来支持将 DNS 请求转发给外部 DNS 服务器进行解析。

通过这些插件,CoreDNS 可以满足不同的 DNS 解析需求。

需要注意的是,从 Kubernetes 1.13 版本开始,kube-dns 被 CoreDNS 替代成为了默认的 DNS 解决方案。因此,在新版本的 Kubernetes 中,建议使用 CoreDNS 作为 DNS 解决方案。

配置修改

在 Kubernetes 中,可以通过修改 kubelet 的启动参数来选择使用哪种类型的 DNS 服务。默认情况下,Kubernetes 使用 Cluster DNS。要使用 CoreDNS,需要在 kubelet 的启动参数中设置 --cluster-dns 选项。例如:

ini

Copy

--cluster-dns=10.96.0.10
--cluster-domain=cluster.local

这将使用 IP 地址为 10.96.0.10 的 CoreDNS 服务,并将集群域设置为 cluster.local

3 DNS在k8s中的应用

DNS 在 Kubernetes 中有以下几种应用:

  1. 服务发现:Kubernetes 中的 DNS 服务可以让容器和服务通过域名进行通信,而不用关心容器 IP 地址的变化。每个 Kubernetes Service 都会被分配一个 DNS 名称,可以通过该名称访问该服务中的所有容器。

  2. Pod 间通信:Kubernetes 中的每个 Pod 都会被分配一个唯一的 DNS 名称,可以通过该名称访问同一节点上的其他 Pod。

  3. 横向扩展:当一个 Kubernetes Deployment 水平扩展时,新创建的 Pod 也会被自动注册到 DNS 中,从而使得它们可以被其他 Pod 和服务发现。

  4. 集群内部域名解析:Kubernetes 集群中的 DNS 服务可以解析集群内部的域名,比如 Kubernetes API Server 的域名和 Service 的域名等。

  5. 集群外部域名解析:Kubernetes 集群中的 DNS 服务可以配置为解析集群外部的域名,从而使得容器和服务可以访问外部的服务和资源。

4 应用案例介绍 

1 服务发现

在 Kubernetes 中,每个 Service 都会被分配一个唯一的 DNS 名称。这个 DNS 名称由 Service 名称和所在的命名空间组成。

形式为 servicename.namespace.svc.cluster.local

这个 DNS 名称可以被 Kubernetes 集群中的任何容器和服务使用,通过该名称访问该服务中的所有容器。

这种服务发现机制使得容器和服务可以轻松地进行通信,而不用关心容器 IP 地址的变化。

下面是一个使用 Service 发现机制的示例代码。

假设我们有一个名为 my-service 的 Service,它将流量路由到名为 my-pod 的 Pod。可以在另一个 Pod 中使用 my-service 的 DNS 名称来访问该服务:

import requests

# 使用 Service 的 DNS 名称访问服务
response = requests.get("http://my-service.namespace.svc.cluster.local")

# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

2 Pod 间通信

在 Kubernetes 中,每个 Pod 都会被分配一个唯一的 DNS 名称。这个 DNS 名称由 Pod 名称和所在的命名空间组成。

形式为 podname.namespace.pod.cluster.local。这个 DNS 名称可以被同一节点上的其他 Pod 使用,通过该名称访问同一节点上的其他 Pod。

 

 

下面是一个使用 Pod 间通信的示例代码。假设有两个名为 pod1 和 pod2 的 Pod,它们都运行在同一个节点上。我们可以在 pod1 中使用 pod2 的 DNS 名称来访问 pod2

import requests

# 使用 Pod 的 DNS 名称访问另一个 Pod
response = requests.get("http://pod2.namespace.pod.cluster.local")

# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

3 横向扩展

在 Kubernetes 中,当一个 Deployment 水平扩展时,新创建的 Pod 也会被自动注册到 DNS 中,从而使得它们可以被其他 Pod 和服务发现。

这意味着我们可以轻松地扩展我们的应用程序,并确保所有新创建的 Pod 都可以与其他 Pod 和服务进行通信。

下面是一个使用横向扩展的示例代码。假设有一个名为 my-deployment 的 Deployment,它由一个名为 my-pod 的 Pod 组成。我们可以使用该 Deployment 的名称来访问 my-pod,并且可以轻松地扩展 Deployment,以便添加更多的 Pod:

import requests

# 使用 Deployment 的名称访问 Pod
response = requests.get("http://my-deployment.namespace.svc.cluster.local")

# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

4 集群内部域名解析

在 Kubernetes 中,集群内部的域名可以被自动解析

例如,Kubernetes API Server 的域名为 kubernetes.default.svc.cluster.local可以被 Kubernetes 集群中的任何容器和服务使用

这个域名可以用于访问 Kubernetes API Server,以及其他需要访问 Kubernetes 集群内部资源的情况。

下面是一个使用集群内部域名解析的示例代码。假设我们需要访问 Kubernetes API Server,我们可以使用 kubernetes.default.svc.cluster.local 的 DNS 名称来访问它:

import requests

# 使用 Kubernetes API Server 的 DNS 名称访问它
response= requests.get("https://kubernetes.default.svc.cluster.local/api/v1/namespaces")

# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

5 集群外部域名解析

Kubernetes 集群中的 DNS 服务可以配置为解析集群外部的域名,从而使得容器和服务可以访问外部的服务和资源。

这个功能可以通过在 Kubernetes 中配置外部 DNS 服务器来实现。

下面是一个使用集群外部域名解析的示例代码。假设我们需要访问 Google 的网站,我们可以使用 Google 的域名来访问它:

import requests

# 使用 Google 的域名访问它
response = requests.get("https://www.google.com")

# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

需要注意的是,这个示例代码并没有直接使用 Kubernetes 集群中的 DNS 服务来解析 Google 的域名。

为了使用 Kubernetes 集群中的 DNS 服务解析外部域名,需要在 Kubernetes 中配置外部 DNS 服务器。

5 投票

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据挖掘——KNN算法的实现

👨‍💻作者简介:练习时长两年半的java博主 📖个人主页:君临๑ 🎁 ps:点赞是免费的,却可以让写博客的作者开心好几天😎 文章目录 一、k-最近邻分类算法介绍 二、k-NN的特…

C++ 简介

C 完全支持面向对象的程序设计,包括面向对象开发的四大特性: 封装(Encapsulation):封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活…

soot中存在的主要对象、soot的执行流

soot代码分析框架的基础知识(二)_soot 代码分析_小作坊中搬砖的博客-CSDN博客 Soot中的结构 本篇内容简单概括一下:soot中存在的主要对象、soot的执行流。 Soot中提供了几种对象,分别是:Scene、SootClass、SootMetho…

如何在 Windows WSL 上安装 k3s (Kubernetes / k8s)

WSL,全称Windows Subsystem for Linux,是微软在Windows 10操作系统上开发的一种运行Linux应用程序的子系统。它允许用户在Windows系统中直接运行Linux命令行工具和应用程序,无需双重引导或虚拟机。 相比虚机,WSL提供了更加高效、…

能量密度的必要性:城市比乡村具有更高的能量密度

文章目录 引言I 人口密度1.1 人口密度太低对于经济的发展的不利因素1.2 足够的人口密度带来的好处1.3 乌鲁克城II 农耕文明和商业文明2.1 农耕文明2.2 商业文明III 有效掌握动力的文明处于优势3.1 苏美尔人- 轮子&风能的利用3.2 英国人- 以蒸汽机为代表的工业革命引言 文明…

LeetCode——根据二叉树创建字符串与二叉树的最近公共祖先

606. 根据二叉树创建字符串 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二…

C#医院体检管理系统源码,PEIS源码,C/S结构 oracle数据库

PEIS体检管理系统源码,医院体检系统源码PEIS源码,商业级源码 本套PEIS医院体检管理系统源码采用C/S结构,前台开发工具为Vs2012,后台数据库采用oracle大型数据库。 核心功能有:体检档案的录入、体检报告的输出、体检档…

震惊!ChatGPT可以用来炒股?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 ChatGPT让我们见识了大模型技术的强大潜能,激发了市场的热情。 然而,对于大多数人而言,最关心的问题很可能是——如何用ChatGPT赚钱。谈到赚钱,最直接的就是金融,其…

word插入页码

word如何设置域http://zhidao.baidu.com/question/382747671/answer/3053706353 1、首先,我们打开我们电脑上面的word,然后我们点击插入。 2、然后我们点击工具栏中的文档部件,弹出的界面,我们点击域。 3、弹出的界面&#xff0c…

iOS设备和蓝牙模块连接基础知识

iOS设备和蓝牙模块连接基础知识 一:iOS连接外设的几种方式 如图下面几种方式: CoreBluetooth和ExternalAccessory,两个框架,基本上是蓝牙设备与iOS设备连接的方式 有图可知,EAP要MFi认证,要求设备的设计理…

pywebview搭建、运行、打包白屏

1、禁用微软商店引流 点击开始菜单输入管理应用执行别名搜索系统设置,将该列表划到最底部,找到python.exe和python3.exe,将其设置为关闭状态 这是微软搞的狗皮膏药,强制型环境变量 2、配置Python环境 1.考虑版本管理&#xff…

Docker原理与镜像管理

目录 一、虚拟化概述 虚拟架构 1、寄居架构 2、原生架构 两者的区别 虚拟化产品 虚拟化类型 二、Docker概述 Logo含义 Docker的设计宗旨 Docker与虚拟机的区别 Docker核心概念 镜像 容器 仓库 Docker Engine(引擎) Docker运行的原理 d…

组合设计模式解读

目录 问题引进 传统方案解决学校院系展示存在的问题分析 组合模式基本介绍 基本介绍 组合模式原理类图 对原理结构图的说明-即(组合模式的角色及职责) 应用实例 组合模式的注意事项和细节 问题引进 看一个学校院系展示需求 编写程序展示一个学校院系结构:需…

浏览器加 buff 指南-【超实用的浏览器工具】

今天这篇博客,说一说浏览器以及加 buff ,先说浏览器:地址:https://www.xduoyu.com/,里面的工具让你的浏览器变装为技术人员的专属利器。这里还要表扬一下,官网的宣传页做的越来越专业了,还打造了…

好的台灯和差的台灯的区别?盘点高品质的护眼台灯品牌

简单来说,好的台灯使用20分钟不会眼疲劳,可差的台灯使用10分钟就眼干涩、不舒服了。 这些年的LED灯具都做得非常成熟,台灯也是LED灯具,在频闪、蓝光、显色指数、均匀度等各种指标都将眼睛保护的很好,采用特殊的光学技…

Thinkphp+vued大学生租房管理系统mysql校园房屋租赁网站系统

学生租房管理系统是计算机技术和网络迅速发展的一个大学生租房信息应用解决方案。大学生租房平台将Internet网络技术与现代管理观念相融合,针对信息技术的特点对大学生租房平台进行规划和重构,对大学生租房信息流进行优化及合理配置,生成动态…

VNC 远程重装 Centos 系统

一、环境 1、环境准备 两台设备,一台为重装 Centos 机器( IP:192.168.206.30,hostname:centos1) ,确保 centos1本身开启了图形化界面GNOME,不是最小化安装的Linux 。一台为重装时,从获取安装程…

Django REST Framework(DRF)框架之视图集ViewSet与路由Router

DRF框架之视图集ViewSet 视图集ViewSet与路由Router视图集ViewSet路由Router视图集和路由的基本使用 视图集ViewSet的使用ViewSetGenericViewSetModelViewSetReadOnlyModelViewSet视图集添加其他方法视图集对象action属性 路由Router的使用SimpleRouterDefaultRouter基本使用自…

DELL R730 主板坏了,Raid5硬盘移到同型号服务器备忘

1、开机时按ctrlr进入raid设置页面 2、进入raid设置页面后可以看到没有找到虚拟磁盘,我们按F2打开操作菜单 3、选择菜单Foreign Config -> Import ,选择Yes开始导入硬盘中的raid配置 4、导入成功的话就可以看到虚拟盘了 5、按Esc退出 6、按ctrlaltd…

为什么网络安全缺口很大,招聘却很少?

2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&#xff1…