深入分析 OpenShift 内部 DNS

news2024/11/28 20:59:00

深入分析 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/597678.html

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

相关文章

Linux服务器禁止密码登录,设置秘钥登录

生成SSH密钥 (客户机端) 执行ssh-keygen -t rsa命令创建RSA密钥对&#xff0c;执行结果如下(键入3次回车)&#xff1a; [rootnode01 .ssh]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): [回车] En…

【十五】设计模式~~~行为型模式~~~状态模式(Java)

【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★★☆☆】 4.1. 模式动机 在很多情况下&#xff0c;一个对象的行为取决于一个或多个动态变化的属性&#xff0c;这样的属性叫做状态&#xff0c;这样的对象叫做有状态的(stateful)对象&#xff0c;这样的…

向后切片,正向切片和其他形式的切片

向后切片,正向切片和其他形式的切片 向后切片Backward Slices 假设我们希望确定哪些语句影响节点 n。 这是由 n 和在 n 处引用的变量。 我们只是&#xff1a; 从 n 回溯控制和流依赖边。 我们保留由此到达的节点。 一般后向切片 通常&#xff0c;我们的切片标准是一个节点和一…

【CMake 入门与进阶(1)】一个例子搞懂什么是CMakeLists——从“Hello World”开始(附代码)

在前面两篇内容中&#xff0c;我们编写了很多示例程序&#xff0c;但这些示例程序都只有一个.c 源文件&#xff0c;非常简单。因此&#xff0c;编译这些示例代码其实都非常简单&#xff0c;直接使用 GCC 编译器编译即可&#xff0c;连 Makefile 都不需要。但是&#xff0c;在实…

中国人民大学与加拿大女王大学金融硕士项目——在职攻读金融硕士,努力迈进高阶人生

学历重要吗&#xff1f;入职门槛、晋升、考公等多方面都考核学历。学历代表的并不只是学习经历&#xff0c;也是学习能力的体现。在快速发展的社会&#xff0c;学历越高&#xff0c;学习能力越强&#xff0c;机会就越多。金融行业在职的你&#xff0c;有计划在职攻读硕士学位吗…

如何在 K3s 中使用网络策略

本文将介绍如何在示例项目中使用网络策略&#xff0c;并解释它在 K3s 中的工作原理&#xff0c;从而帮助用户提高部署的安全性。 关于 K3s 对网络策略的支持存在一个普遍的误解&#xff0c;因为 K3s 默认使用 Flannel CNI&#xff0c;而 Flannel CNI 不支持网络策略。其实&…

Docker+Jenkins+Gitee+Pipeline部署项目

1.前言 Hello&#xff0c;各位小伙伴大家好。&#x1f604; 在上一篇文章【DockerJenkinsGitee自动化部署maven项目】中&#xff0c;咱们详细介绍了如何自动化部署maven项目&#xff0c;如果说你的项目仅仅为maven项目&#xff0c;那么这种部署方式是很契合的&#xff0c;如果…

超全,Selenium4自动化测试并行测试详解,进阶之路看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Selenium4 自动化测…

万字解析PELT算法!

Linux是一个通用操作系统的内核&#xff0c;她的目标是星辰大海&#xff0c;上到网络服务器&#xff0c;下至嵌入式设备都能运行良好。做一款好的linux进程调度器是一项非常具有挑战性的任务&#xff0c;因为设计约束太多了&#xff1a; 它必须是公平的快速响应系统的throughp…

如何学习R-Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合?

专题一&#xff1a;Meta分析的选题与文献计量分析CiteSpace应用 1、Meta分析的选题与文献检索 1) 什么是Meta分析 2) Meta分析的选题策略 3) 文献检索数据库 4) 精确检索策略&#xff0c;如何检索全、检索准 5) 文献的管理与清洗&#xff0c;如何制定文献纳入排除标准 6…

第一行代码 第十四章 开发酷欧天气

第14章 开发酷欧天气 在本章将编写一个功能较为完整的天气预报程序。 功能需求及技术可行性分析 在开始编码之前&#xff0c;需要先对程序进行需求分析&#xff0c;想一想酷欧天气中应该具备哪些功能。将这些功能全部整理出来&#xff1a; 可以罗列出全国所有的省、市、县&…

英飞凌 AURIX-TC3XX:QSPI通信实验

目录 AURIX-TC3XX-QSPI通信实验1.QSP简介1.1、AURIX TC3XX QSPI个数1.2、QSPI功能特点1.2.1、QSPI外设的新特性1.2.2、一些独特的特性1.2.3、支持传统的SPI特性1.2.4、四种可供用户选择的传输模式 2、具体实验操作2.1、新建工程2.2、实验一 3、域控制器中常见的SPI通信方式3.1、…

ble常见概念

0. 蓝牙一些常见概念 参考&#xff1a;https://www.bilibili.com/video/BV1ad4y1d7AM 基于ESP32来了解蓝牙协议的一些东西 蓝牙广播 包组成结构 低功耗蓝牙一共有40个信道&#xff0c;频段范围从2402Mhz-2480Mhz&#xff0c;每2Mhz一个信道&#xff0c;37 38 39 是广播信道…

基于linux的程序库文件打包和调用的实现(一)——静态库文件打包和调用

随着技术的发展&#xff0c;基于linux项目的软件代码越发复杂&#xff0c;原来一个人可以完成的软件项目&#xff0c;现在可能需要多个人合作、多个部门合作、多个企业合作&#xff0c;每个人、每个部门、每个企业可能负责部分软件模块的开发。各个软件模块在调试过程由于涉及企…

DeFi 发展沃土,Uniswap 成功“登陆” Moonbeam

作者&#xff1a;OneBlock 去年 3 月底&#xff0c;Uniswap 社区发布一项全新治理提案&#xff0c;旨在通过社区授权于 Polkadot 生态智能合约平台 Moonbeam 上部署 Uniswap V3&#xff0c;将 Uniswap 扩展至 Polkadot 生态。在这项提案中&#xff0c;Uniswap 计划除了提供流动…

极兔抢滩IPO,李杰不止缺一个丰网

&#xff08;图片来源于网络&#xff0c;侵删&#xff09; 来源 | 螳螂观察 文 | 叶小安 物流业打响了上市“抢滩战”。 5月&#xff0c;顺丰控股传出2023年在香港二次上市消息&#xff1b;紧接着极兔也传出将于下半年赴港上市消息&#xff1b;另一边&#xff0c;阿里主席张…

最新自助建站系统源码 一键建站系统源码 含700+精美网站模板和搭建教程

分享一款最新自助建站系统源码&#xff0c;一键建站系统源码&#xff0c;傻瓜式一键建站含700精美网站模板&#xff0c;网站全是自适应响应式&#xff0c;含完整代码程序包和详细搭建教程。 系统模板页面图&#xff1a; 系统功能特色一览&#xff1a; 1、一次性打包&#xff0…

chatgpt接口返回参数分析

接口请求使用二进制请求&#xff0c;数据流式返回&#xff0c;即分块&#xff08;分批次&#xff09;返回。 问题&#xff1a;一周有几天 请求头 参数详解 参数名称 说明 role 消息发送者的角色&#xff0c;这里为 "assistant"。 id 消息的唯一标识符。 pare…

图的基本概念和存储

基本概念 基本概念 图的定义&#xff1a;图&#xff08;Graph&#xff09;一般由两个集合共同构成&#xff0c;一个是非空但是有限的顶点集合V&#xff08;Vertex&#xff09;&#xff0c;另一个是描述顶点之间连接关系的边集合E&#xff08;Edge)&#xff0c;边集合可以为…

4.信息安全之数据恢复

1.数据容灾数据备份 RPO(recovery point object)数据恢复点目标 数据丢掉多少可接受 RTO(recovery time object)数据恢复时间目标 恢复数据需要多少时间 2.系统灾难原因 1.硬件 2.人为 3.软件 4.病毒 5.自然灾害 3.容灾级别 数据级别(数据出错)<应用(某个功能不能使用)<业…