剖析 OpenShift 中的 DNS

news2025/1/12 6:07:32

深入分析 OpenShift 内部 DNS

    • OpenShift 中的DNS 相关组件及其配置
      • 1.1 Pod 中的 DNS 配置
      • 1.2 Pod 所在宿主机上的 DNS 配置及服务
        • 1.2.1 resolv.conf 文件
    • DNS 配置
      • DNS 查询流程
      • 为什么需要内部 DNS?

在这里插入图片描述

本文基于 OpenShift 3.11,Kubernetes 1.11 进行测试

OpenShift 集群中,至少有三个地方需要用到 DNS:

  • 一是Pod 中的应用通过域名访问外网的时候,需要DNS来解析外网的域名
  • 二是在集群内部(pod 中或者宿主机上)通过服务的域名来访问集群内服务的时候,这也是通常所说的服务发现功能,需要通过服务域名来先发现(获取其IP地址)再使用该服务
  • 三是从集群外部通过域名访问部署在OpenShift pod 中的服务的时候,需要DNS来解析服务的外网域名

OpenShift 中的DNS 相关组件及其配置

在这里插入图片描述

1.1 Pod 中的 DNS 配置

在Linux 系统上,当一个应用通过域名连接远端主机时,DNS 解析会通过系统调用来进行,比如 getaddrinfo()。和任何Linux 操作系统一样,Pod 的 DNS 定义在 resolv.conf 文件中,其示例如下:

sh-4.2$ cat /etc/resolv.conf 
nameserver 172.16.60.83
search dev.svc.cluster.local svc.cluster.local cluster.local exampleos.com
options ndots:5

其中,

  • nameserver 字段是 pod 所在的宿主机的主网卡的IP 地址。也就是说 pod 中发起的所有DNS 查询请求都会被转发到运行在宿主机的 53 端口上的DNS服务器上。
  • search 字段指定当解析一个非FQDN域名时被附加的搜索域(search domain)列表。其解释如下:

域名(Domain Name)分为两种,一种是绝对域名(Absolute Domain Name,也称为 Fully-Qualified Domain Name,简称 FQDN),另一种是相对域名(Relative Domain Name,也称为 Partially Qualified Domain Name,简称PQDN)。FQDN 是完整域名,它能够唯一地在DNS名字空间中确定一个记录。比如最高级别的域名A包括子域名B它又包括子域名C,那么FQDN 是 C.B.A.,比如cs.widgetopia.edu.。 有时候我们也会使用PQDN,它是不完全的、模糊的。

FQDN 能被直接到 DNS 名字服务器中查询;而 PQDN 需要先转化为FQDN 再进行查询。其做法是将 PQDN 附加一个搜索域名(search domain)来生成一个 FQDN。在域名系统中,域名结尾是否是『.』被用来区分 FQDN 和 PQDN。比如 apple.com. 表示一个Apple公司的 FQDN,而 apple 则表示一个 PQDN,它的FQDN 可能是 apple.cs.widgetopia.edu.;apple.com 仍然是一个 PQDN,它的FQDN 可能是 apple.com.cs.widgetopia.edu.。

  • options ndots:5

默认地,许多DNS 解析器如果发现被解析的域名中有任何的点(.)就把它当做一个 FQDN 来解析;如果域名中没有任何点,就把它当做 PQDN 来处理,并且会加上系统的默认domain name 和最后的点,来组成 FQDN。如果没有指定默认的 domain name (通过 domain 字段)或查询失败,则会将 search 字段的第一个值当做默认domain name,如果解析不成功,则依次往下试,直到有一个成功或者全部失败为止。

这个行为是通过 options ndots 来指定的,其默认值为1,这意味着只要被解析域名中有任何一个点(.),那么它就会被当做 FQDN,而不会附加任何 search domain,直接用来查询。OpenShift 环境中,这个值被设置为 5。这意味着,只要被解析域名中包含不超过五个点,该域名就会被当做PQDN,然后挨个使用 search domain,来组装成 FQDN 来做DNS查询。如果全部不成功过,则会尝试将它直接作为 FQDN 来解析。

因此,这某些场景中,pod 中的DNS 查询速度会降低应用的性能。解决方法主要有两种,要么直接使用 FQDN,要么减小 ndots 的值,具体请查看 Kubernetes 和 DNS 的有关文档。

1.2 Pod 所在宿主机上的 DNS 配置及服务

1.2.1 resolv.conf 文件

[root@node2 cloud-user]# cat /etc/resolv.conf
# nameserver updated by /etc/NetworkManager/dispatcher.d/99-origin-dns.sh
# Generated by NetworkManager
search cluster.local exampleos.com
nameserver 172.16.60.83

在部署环境时,会在每个节点上部署 /etc/NetworkManager/dispatcher.d/99-origin-dns.sh 文件。每当节点上的 NetworkManager 服务启动时,该文件会被运行。它的任务包括:

  • 创建 dnsmasq 配置文件 :

    • node-dnsmasq.conf (在我的 3.11 版本环境上没有创建该文件,见下文分析)
    • origin-dns.conf
    • origin-upstream-dns.conf
  • 当 NetworkManager 服务启动时启动 dnsmasq 服务

  • 设置宿主机的所有默认路由 IP 为 Dnsmasq 的侦听IP

  • 修改 /etc/resolv.conf,设置搜索域,以及将宿主机的默认 IP 作为 nameserver

  • 创建 /etc/origin/node/resolv.conf

也就是说,宿主机上的 DNS 请求也会转到本机上的 53 端口。


DNS 配置

在部署 OpenShift 时我们会为所有的节点上都安装好 Dnsmasq(监听53端口)。

$ cat /etc/resolv.conf
# nameserver updated by /etc/NetworkManager/dispatcher.d/99-origin-dns.sh
search cluster.local paas.99cloud.home
nameserver 172.16.60.83

主机的 DNS 指向了本机上运行的 Dnsmasq。

$ cat /etc/dnsmasq.d/origin-upstream-dns.conf
server=172.16.60.90

Dnsmasq 的上游服务器指向了外部的 DNS 服务器(DNS 服务商或使用 CoreDNS 为集群提供域名解析服务)。

$ cat /etc/origin/node/resolv.conf
nameserver 172.16.60.90

而内部的 SkyDNS 也指向了外部的 DNS 服务器作为默认 DNS 域名服务器。

DNS 查询流程

OpenShift 内部使用 SkyDNS,数据存储在 etcd 中。

我们先看下主节点上所有监听了53端口的进程:

$ netstat -tunlp | grep 53
tcp        0      0 172.16.60.83:53         0.0.0.0:*               LISTEN      33210/dnsmasq
tcp        0      0 172.17.0.1:53           0.0.0.0:*               LISTEN      33210/dnsmasq
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      12277/openshift
tcp        0      0 10.128.0.1:53           0.0.0.0:*               LISTEN      62167/dnsmasq
tcp        0      0 0.0.0.0:8053            0.0.0.0:*               LISTEN      6392/openshift

127.0.0.1:53 就是真正的 OpenShift 内部 DNS。

Kubernetes 集群内部发布的 Service 对应的域名可以按照 service_name.name_space.svc 这个规则拼接起来。

$ curl -k https://apiserver.kube-service-catalog.svc/healthz
ok

$ oc get svc -n kube-service-catalog
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
apiserver            ClusterIP   172.30.36.133   <none>        443/TCP   7h
controller-manager   ClusterIP   172.30.189.41   <none>        443/TCP   7h

$ nslookup apiserver.kube-service-catalog.svc
Server:		172.16.60.83
Address:	172.16.60.83#53

Name:	apiserver.kube-service-catalog.svc.cluster.local
Address: 172.30.36.133

$ nslookup apiserver.kube-service-catalog.svc 172.16.60.83
Server:		172.16.60.83
Address:	172.16.60.83#53

Name:	apiserver.kube-service-catalog.svc.cluster.local
Address: 172.30.36.133

$ nslookup apiserver.kube-service-catalog.svc 127.0.0.1
Server:		127.0.0.1
Address:	127.0.0.1#53

Name:	apiserver.kube-service-catalog.svc.cluster.local
Address: 172.30.36.133

对照着流程图,我们可以还原一个完整的 DNS 解析过程:

  1. 当访问 api server 服务健康状态的 API 时首先会查询 apiserver.kube-service-catalog.svc 这个(内部)域名对应的 IP 地址
  2. DNS 查询请求先来到主机已经配置好的 DNS 服务器,也就是 Dnsmasq
  3. Dnsmasq 随后会将查询请求向上递交给 SkyDNS,也就是集群内部的 DNS 服务器,这里能查到正确的 IP 地址

我们在管理 OpenShift 网络的 Pod 内部来查询一下 apiserver.kube-service-catalog.svc.cluster.local

$ oc get pods -n openshift-sdn
NAME        READY     STATUS    RESTARTS   AGE
ovs-7kpnv   1/1       Running   0          11h
ovs-7p75w   1/1       Running   0          11h
ovs-m6clw   1/1       Running   0          11h
sdn-7fz45   1/1       Running   0          11h
sdn-l9cq7   1/1       Running   0          11h
sdn-rmqvd   1/1       Running   0          11h

$ oc exec -it sdn-7fz45 -n openshift-sdn /bin/bash
[root@ocp-infra-1 origin]# dig apiserver.kube-service-catalog.svc.cluster.local

; <<>> DiG 9.9.4-RedHat-9.9.4-74.el7_6.1 <<>> apiserver.kube-service-catalog.svc.cluster.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39256
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;apiserver.kube-service-catalog.svc.cluster.local. IN A

;; ANSWER SECTION:
apiserver.kube-service-catalog.svc.cluster.local. 30 IN	A 172.30.36.133

;; Query time: 1 msec
;; SERVER: 172.16.60.83#53(172.16.60.83)
;; WHEN: Wed Jul 03 16:17:59 UTC 2019
;; MSG SIZE  rcvd: 82

为什么需要内部 DNS?

以往虚拟机中的应用程序之间通讯所使用的宿主机 IP 通常不会轻易变化。但是在容器环境中,容器启动时会被分配新的 IP 地址。编排容器的 Kubernetes 需要静态 IP,提供服务 IP 的 Service 对象就是为了实现这个目的而创建的。Service 对象的域名是不会变化的(拼接规则),借助这个内部的域名,可以实现服务之间的稳定通讯而不用管背后 Pod 本身的 IP 是否被改变。

由于 Pod 的 IP 会变化,如果我们在应用程序或者配置中指定了 IP 地址,Pod 被重新创建时应用程序并不会被主动通知 IP 已经改变。出于这些原因,我们通常使用域名来避免在应用程序中写死 IP 地址。OpenShift 的内部 DNS 使用动态 DNS,无论何时 Pod 被重建,DNS 都将使用新纪录进行更新。

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

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

相关文章

2023/6/4周报

目录 摘要 论文阅读 1、标题和现存问题 2、使用GNN进行文本分类 3、INDUCT-GCN 4、实验准备 5、实验结果 深度学习 1、时空图的种类 2、图在环境中的应用 3、STGNN 总结 摘要 本周在论文阅读上&#xff0c;阅读了一篇InducT-GCN:归纳图卷积文本分类网络的论文。基…

python-pandas按各种时间统计和案例

使用到的库 pandas、matplotlib、numpy 使用到的函数 df.resample(“H”).sum() 参数 B business day frequency C custom business day frequency (experimental) D calendar day frequency W weekly frequency M month end frequency BM business month end frequency CBM…

【奶奶看了都会】云服务器ChatGLM模型fine-tuning微调,让你拥有自己的知识库

1.背景 大家好啊&#xff0c;上次给大家写了ChatGLM-6B的部署使用教程&#xff0c;【奶奶看了都会】云服务器部署开源ChatGLM-6B&#xff0c;让你拥有自己的ChatGPT 但是因为模型比较小的问题&#xff0c;所以日常工作中可能用不上。而且大家更希望的是模型能训练自己的数据&…

【Python Bokeh】零基础也能轻松掌握的学习路线与参考资料

Python Bokeh是一款为开发者提供数据可视化的Python库。它可以帮助开发者轻松地创建交互式网页应用程序&#xff0c;而无需编写大量的JavaScript代码。Bokeh支持各种绘图类型和工具&#xff0c;包括线图、散点图、条形图等。Python Bokeh非常适合在大数据分析、商业智能和数据科…

chatgpt赋能python:Python去除重复元素的几种方法

Python去除重复元素的几种方法 在Python编程中&#xff0c;去除列表、集合、字典等数据结构中的重复元素是一个常见的操作。本文将介绍Python中去除重复元素的几种方法&#xff0c;并分析它们的优缺点。 方法一&#xff1a;使用set去重 Set是Python中的一种集合类数据结构&a…

17_Linux根文件简介与Busybox构建文件系统

目录 根文件系统简介 文件目录简介 BusyBox简介 编译BusyBox构建根文件系统 修改Makefile添加编译器 busybox中文字符支持 配置 busybox 编译busybox 向根文件系统添加lib库 向rootfs的“usr/lib”目录添加库文件 创建其他文件夹 根文件系统初步测试 根文件系统简介…

Unity制作二次元卡通渲染角色材质——3、高光反射与ILM贴图

Unity制作二次元材质角色 回到目录 大家好&#xff0c;我是阿赵。 这里继续来讲二次元角色的材质。上次讲了光影的色阶化问题&#xff0c;这次继续讲光照模型效果的问题。 之前我们说过&#xff0c;光照模型的最后效果是&#xff1a; 环境色漫反射高光反射。 这里我们可以先忽略…

【嵌入式系统】思考题复习

嵌入式系统思考题 0. 名词解释1. 嵌入式系统概述2. ARM处理器体系结构3. ARM指令集4. S5PV210微处理器与接口5. ARM-Linux内核6. 嵌入式Linux文件系统7. 嵌入式Linux系统移植及调试8. 设备驱动程序设计9. QT图形界面应用程序开发基础10. SQLite数据库11. 嵌入式系统的开发设计案…

Qt6.5.1LTS搭建Android开发环境填坑

Qt6第二个LTS出来了&#xff0c;周日找时间安装并测试了Qt6.5LTS&#xff0c;安装我是按我之前的一个博客记录来做的&#xff0c;用的是国内境像&#xff0c;顺利快速安装完成&#xff0c;下面是设置的过程关键总结。 一、Devices Android设备(Device)选择 二、Kits &#xf…

网络安全-XSS的原理、攻击及防御

简介 跨站脚本攻击(全称Cross Site Scripting,为和CSS&#xff08;层叠样式表&#xff09;区分&#xff0c;简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码&#xff08;也可能包含html代码&#xff09;&#xff0c;当用户浏览网页之时&#xff0c;嵌入其中Web里面…

【C++开发】Qt+Tesseract实现文字识别的各种坑(已解决)

文章目录 Tesseract库下载Qt版本选择安装步骤 VS2017安装MSVC调试器安装构建套件的导入文字识别功能的检测 最近在给之前Qt医疗管理系统项目添加一个文字识别功能&#xff0c;但是在其中遇到非常多坑&#xff0c;花费了我比较多的时间&#xff08;查阅了很多文章&#xff09;&a…

基础学习——关于list、numpy、torch在float和int等数据类型转换方面的总结

系列文章目录 Numpy学习——创建数组及常规操作&#xff08;数组创建、切片、维度变换、索引、筛选、判断、广播&#xff09; Tensor学习——创建张量及常规操作&#xff08;创建、切片、索引、转换、维度变换、拼接&#xff09; 基础学习——numpy与tensor张量的转换 基础学习…

【软件测试】一个完整的项目流程是什么样的?

软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前&#xff0c;要经过一系列的严格测试&#xff0c;才能保证交付质量。 一、引言 1.编写目的 本文档…

2023年度第四届全国大学生算法设计与编程挑战赛(春季赛)

目录 2023年度第四届全国大学生算法设计与编程挑战赛&#xff08;春季赛&#xff09;1、A2、Bx3、Cut4、Diff5、EchoN6、Farmer7、GcdGame8、HouseSub9、IMissYou!10、Jargonless 2023年度第四届全国大学生算法设计与编程挑战赛&#xff08;春季赛&#xff09; 1、A 题目描述…

【C++初阶】C/C++内存管理(没有对象的都进来看看吧~)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

2023 华为 Datacom-HCIE 真题题库 08/12--含解析

单项选择 1.[试题编号&#xff1a;190385] &#xff08;单选题&#xff09;以下关于BGP/MPLSIPVPN路由交互的描述&#xff0c;错误的是哪一项? A、PE与CE之间交互的是IPv4路由信息 B、出口PE可以通过BGP、IGP或静态路由的方式向远端CE发送IPv4路由 C、入口PE将从CE接收到的I…

ODOO随笔(二)—— Odoo16的主题样式变更

1 登陆界面的修改 系统默认的登陆界面&#xff0c;有更改odoo logo和去除“管理数据库”、“由Odoo提供支持”两个需求。 &#xff08;1&#xff09;更改odoo logo 系统管理员登陆后&#xff0c;选择菜单栏&#xff1a;设置——公司——管理公司 点击相机图标&#xff0c;上传…

Round#13 web专项部分wp

flask?jwt? 忘记密码处有secretkey 然后就是伪造session了,这里猜一下要什么 最后应该是_is_admin有用,我没细看,当时平台卡麻了 指正:改_user_id为1 ez_factors 注意到可以拼接命令,但是执行的回显只有数字 那么可以考虑读取后用od命令来转8进制读取 flask?jwt?(hard) …

2023.5.30 深信服 c++ 一面

深信服&#xff0c;c一面小记 导语面试内容重点问题解析弱引用弱在哪里&#xff1f;手撕memcpy水壶倒水问题 导语 最近开始面试&#xff0c;记录一下面试经历。   应该是会给我发感谢信的吧~我也是真的菜。工作的原因其实也没时间准备&#xff0c;最近工作还是挺忙的。另外一…

【云原生docker】

容器化越来越受欢迎&#xff0c;因为容器是&#xff1a; ●灵活&#xff1a;即使是最复杂的应用也可以集装箱化。 ●轻量级&#xff1a;容器利用并共享主机内核。 ●可互换&#xff1a;可以即时部署更新和升级。 ●便携式&#xff1a;可以在本地构建&#xff0c;部署到云&#…