为什么不直接用kube-dns?

为什么不直接用kube-dns?

为什么不直接用kube-dns?

感谢各位前辈的专研,在下午有限的时间里把Openshift DNS的机制理了一下。更详细的材料大家可以参考

https://blog.cloudtechgroup.cn/Blog/2018/07/23/ocp-2018-07-23/

https://www.redhat.com/en/blog/red-hat-openshift-container-platform-dns-deep-dive-dns-changes-red-hat-openshift-container-platform-36

https://www.cnblogs.com/sammyliu/p/10056035.html

本篇主要是基于3.11版本

1.DNS架构

也就是说所有容器的dns寻址都是通过外部的dnsmasq以及SkyDNS来进行的,不是走容器内部网络去找kube-dns或者类似的Pod

可以通过命令查看一下

  • 在master节点
[root@master dnsmasq.d]# netstat -tunlp|grep
tcp 0.0.0.0: 0.0.0.0:* LISTEN /openshift
tcp 127.0.0.1: 0.0.0.0:* LISTEN /openshift
tcp 10.128.0.1: 0.0.0.0:* LISTEN /dnsmasq
tcp 172.17.0.1: 0.0.0.0:* LISTEN /dnsmasq
tcp 192.168.56.113: 0.0.0.0:* LISTEN /dnsmasq

查看具体的进程,注意进程号

# ps -ef|grep openshift

root           : ?        :: openshift start network --config=/etc/origin/node/node-config.yaml --kubeconfig=/tmp/kubeconfig --loglevel=
root : ? :: openshift start master api --config=/etc/origin/master/master-config.yaml --loglevel=
root : ? :: openshift start master controllers --config=/etc/origin/master/master-config.yaml --listen=https://0.0.0.0:8444 --loglevel=2

查看路由信息

[root@master dnsmasq.d]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.56.1 0.0.0.0 UG enp0s3
10.128.0.0 0.0.0.0 255.252.0.0 U tun0
172.17.0.0 0.0.0.0 255.255.0.0 U docker0
172.30.0.0 0.0.0.0 255.255.0.0 U tun0
192.168.56.0 0.0.0.0 255.255.255.0 U enp0s3

可以看到10.128.0.0是pod网段,172.17.0.0是SVC网段,192.169.56.0是宿主机网段,每个网段都启动了一个dnsmasq,监听在53端口

  • 在node节点
[root@node1 node]# netstat -tunlp|grep
tcp 127.0.0.1: 0.0.0.0:* LISTEN /openshift
tcp 10.131.0.1: 0.0.0.0:* LISTEN /dnsmasq
tcp 172.17.0.1: 0.0.0.0:* LISTEN /dnsmasq
tcp 192.168.56.104: 0.0.0.0:* LISTEN /dnsmasq
ps -ef|grep openshift

root           : ?        :: openshift start network --config=/etc/origin/node/node-config.yaml --kubeconfig=/tmp/kubeconfig --loglevel=

2.DNS的配置信息

Pod中的dns配置会指向Pod所在宿主机IP,配置为

$ cat /etc/resolv.conf
nameserver 192.168.56.105
search myproject.svc.cluster.local svc.cluster.local cluster.local redhat.com example.com
options ndots:

192.168.56.105是pod所在的宿主机

宿主机的resolv.conf文件

[root@node1 node]# cat /etc/resolv.conf
# nameserver updated by /etc/NetworkManager/dispatcher.d/99-origin-dns.sh
# Generated by NetworkManager
search cluster.local cluster.local example.com
nameserver 192.168.56.104

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

  • 创建 dnsmasq 配置文件 :

    • node-dnsmasq.conf (没有)
    • origin-dns.conf
    • origin-upstream-dns.conf(没有)
  • 当 NetworkManager 服务启动时启动 dnsmasq 服务
  • 设置宿主机的所有默认路由 IP 为 Dnsmasq 的侦听IP
  • 修改 /etc/resolv.conf,设置搜索域,以及将宿主机的默认 IP 作为 nameserver
  • 创建 /etc/origin/node/resolv.conf

origin-dns.conf的配置目录在/etc/dnsmasq.d/,内容如下

[root@node1 dnsmasq.d]# cat origin-dns.conf
no-resolv
domain-needed
no-negcache
max-cache-ttl=
enable-dbus
dns-forward-max=
cache-size=
bind-dynamic
min-port=
except-interface=lo
# End of config

如果有文件origin-upstream-dns.conf ,中定义了上游(upstream) DNS 名字服务器,如果没有可以手工创建.

[root@node2 dnsmasq.d]# cat origin-upstream-dns.conf
server=10.72.17.5
server=10.68.5.26
server=202.96.134.33
server=202.96.128.86

如果需要解析外部域名,是需要在pod运行的宿主机节点上进行创建的。

node-dnsmasq.conf的内容是

server=/in-addr.arpa/127.0.0.1
server=/cluster.local/127.0.0.1

根据前辈SammyTalksAboutCloud的研究,这个已经写到程序里面去了。

可以通过journalctl -u dnsmasq去查看日志

[root@node2 dnsmasq.d]# journalctl -u dnsmasq
-- Logs begin at Fri -- :: CST, end at Thu -- :: CST. --
Dec :: node2.example.com systemd[]: Started DNS caching server..
Dec :: node2.example.com dnsmasq[]: started, version 2.76 cachesize
Dec :: node2.example.com dnsmasq[]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth no-D
Dec :: node2.example.com dnsmasq[]: DBus support enabled: connected to system bus
Dec :: node2.example.com dnsmasq[]: warning: no upstream servers configured
Dec :: node2.example.com dnsmasq[]: read /etc/hosts - addresses
Dec :: node2.example.com dnsmasq[]: setting upstream servers from DBus
Dec :: node2.example.com dnsmasq[]: using nameserver 127.0.0.1# for domain in-addr.arpa
Dec :: node2.example.com dnsmasq[]: using nameserver 127.0.0.1# for domain cluster.local

根据日志信息,知道dnsmasq实际把请求转发给了监听在127.0.0.1:53上的skyDNS

skyDNS并不是作为一个单独的进程启动,而是在启动网络

openshift start network --config=/etc/origin/node/node-config.yaml --kubeconfig=/tmp/kubeconfig --loglevel=2

中启动,SkyDNS 调用 OpenShift API 服务来获取主机名、IP地址等信息,然后封装成标准 DNS 记录并返回给查询客户端。

3.DNS在openshift中的配置

  • master
cat /etc/origin/master/master-config.yaml
dnsConfig:
bindAddress: 0.0.0.0:
bindNetwork: tcp4

bind在每个ip的8053端口

  • node
cat /etc/origin/node/node-config.yaml
dnsBindAddress: 127.0.0.1:
dnsDomain: cluster.local
dnsIP: 0.0.0.0
dnsNameservers: null
dnsRecursiveResolvConf: /etc/origin/node/resolv.conf

根据这种机制,service在宿主机范围内(不仅只是在容器中)能够解析

[root@node2 dnsmasq.d]# dig tomcat.myproject.svc.cluster.local

; <<>> DiG 9.9.-RedHat-9.9.-.el7 <<>> tomcat.myproject.svc.cluster.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id:
;; flags: qr aa rd ra; QUERY: , ANSWER: , AUTHORITY: , ADDITIONAL: ;; QUESTION SECTION:
;tomcat.myproject.svc.cluster.local. IN A ;; ANSWER SECTION:
tomcat.myproject.svc.cluster.local. IN A 172.30.16.194 ;; Query time: msec
;; SERVER: 10.0.3.15#(10.0.3.15)
;; WHEN: Thu Jan :: CST
;; MSG SIZE rcvd:

能够访问

[root@node2 dnsmasq.d]# curl  tomcat.myproject.svc:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/8.5.</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head> <body>

4.查询流程图

查看dnsmasq更详细日志

vi /etc/dnsmasq.conf 

# For debugging purposes, log each DNS query as it passes through
# dnsmasq.
log-queries
systemctl restart dnsmasq
[root@node2 dnsmasq.d]# journalctl -f -u dnsmasq
-- Logs begin at Fri -- :: CST. --
Jan :: node2.example.com dnsmasq[]: using nameserver 10.72.17.5#
Jan :: node2.example.com dnsmasq[]: using nameserver 127.0.0.1# for domain in-addr.arpa
Jan :: node2.example.com dnsmasq[]: using nameserver 127.0.0.1# for domain cluster.local
Jan :: node2.example.com dnsmasq[]: setting upstream servers from DBus
Jan :: node2.example.com dnsmasq[]: using nameserver 202.96.128.86#
Jan :: node2.example.com dnsmasq[]: using nameserver 202.96.134.33#
Jan :: node2.example.com dnsmasq[]: using nameserver 10.68.5.26#
Jan :: node2.example.com dnsmasq[]: using nameserver 10.72.17.5#
Jan :: node2.example.com dnsmasq[]: using nameserver 127.0.0.1# for domain in-addr.arpa
Jan :: node2.example.com dnsmasq[]: using nameserver 127.0.0.1# for domain cluster.local
Jan :: node2.example.com dnsmasq[]: query[A] www.baidu.com from 10.0.3.15
Jan :: node2.example.com dnsmasq[]: forwarded www.baidu.com to 202.96.128.86
Jan :: node2.example.com dnsmasq[]: forwarded www.baidu.com to 202.96.134.33
Jan :: node2.example.com dnsmasq[]: forwarded www.baidu.com to 10.68.5.26
Jan :: node2.example.com dnsmasq[]: forwarded www.baidu.com to 10.72.17.5
Jan :: node2.example.com dnsmasq[]: query[AAAA] www.baidu.com from 10.0.3.15
Jan :: node2.example.com dnsmasq[]: forwarded www.baidu.com to 202.96.128.86
Jan :: node2.example.com dnsmasq[]: forwarded www.baidu.com to 202.96.134.33
Jan :: node2.example.com dnsmasq[]: forwarded www.baidu.com to 10.68.5.26
Jan :: node2.example.com dnsmasq[]: forwarded www.baidu.com to 10.72.17.5
Jan :: node2.example.com dnsmasq[]: reply www.baidu.com is <CNAME>
Jan :: node2.example.com dnsmasq[]: reply www.a.shifen.com is 14.215.177.38
Jan :: node2.example.com dnsmasq[]: reply www.a.shifen.com is 14.215.177.39
Jan :: node2.example.com dnsmasq[]: reply www.baidu.com is <CNAME>

OpenShift DNS的机制的更多相关文章

  1. DNS 缓存机制原理

    DNS 缓存机制原理 简单来说,一条域名的DNS记录会在本地有两种缓存:浏览器缓存和操作系统(OS)缓存.在浏览器中访问的时候,会优先访问浏览器缓存, 如果未命中则访问OS缓存,最后再访问DNS服务器 ...

  2. DNS笔记 DNS区域集成到 Active Directory

    可以将 DNS 区域集成到 Active Directory 中以提供增强的容错功能和安全性.OpenDNS   Google Public DNS往返时间 (RTT) 远程访问服务 (RAS)域名与 ...

  3. Linux内网环境DNS修改域名指向,JAVA应用程序能否实时切换的问题总结

    公司内网环境中许多调用资源(数据库.web接口等)都是通过内网DNS服务来进行域名-IP的映射. 但经常出现DNS映射修改完毕后,应用中连接的资源迟迟没有变更. 以前一直笼统的认为是linux的dns ...

  4. 浏览器的DNS缓存

    通过设置hosts文件可以强制指定域名对应的IP,当修改hosts文件,想要浏览器生效,最直接的方法关闭浏览器后重新开启:如果不想重启浏览器,只需要清空浏览器的DNS缓存即可.清空DNS缓存在chro ...

  5. <转>详解DNS的常用记录(上):DNS系列之二

    详解DNS的常用记录(上) 在上篇博文中,我们介绍了DNS服务器的体系结构,从中我们了解到如果我们希望注册一个域名,那么必须经过顶级域名服务器或其下级的域名服务器为我们申请的域名进行委派,把解析权委派 ...

  6. 我眼中的 Nginx(六):深入 Nginx/Openresty 服务里的 DNS 解析

    张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...

  7. DNS Tunnel隧道隐蔽通信实验 && 尝试复现特征向量化思维方式检测

    1. DNS隧道简介 DNS隧道技术是指利用 DNS协议建立隐蔽信 道,实现隐蔽数据传输.最早是在2004年 DanKaminsky 在 Defcon大会上发布的基于 NSTX 的 DNS隐蔽 隧道工 ...

  8. 由Nginx的DNS缓存导致的访问404

    现象 访问某个URL出现404,而且全站都是404.通过日志查看Nginx的规则也正确,请求被代理到指定位置. 排查 最近针对这个站点没有修改过Nginx配置也没有站点升级.所以应该是其他原因.首先P ...

  9. DNS预解析dns-prefetch提升页面载入速度优化前端性能

    当浏览器请求一个URL的时候,通过firebug我们可以发现大概有以下几个过程:阻挡.域名解析.建立连接.发送请求.等待响应.接收数据.后面四个跟用户的网络情况和你的服务器处理速度有关,本文重点说说前 ...

随机推荐

  1. 语言模型srilm基本用法

    目录: 一基本训练 二语言模型打分 三语言模型剪枝 四语言模型合并 五语言模型使用词典限制 一.基本训练 #功能 读取分词后的text文件或者count文件,然后用来输出最后汇总的count文件或者语 ...

  2. centos7 修改时区

    Linux 系统(我特指发行版, 没说内核) 下大部分软件的风格就是不会仔细去考虑向后 的兼容性, 比如你上个版本能用这种程序配置, 没准到了下一个版本, 该程序已经不见了. 比如 sysvinit ...

  3. PHP学习笔记(一)数组

    初始化数组的方法:统一初始化或逐项初始化. 遍历数组的方法: 1.FOR循环 2.DO...WHILE语句 3.WHILE语句 4.foreach foreach($arr as $key=>$ ...

  4. jquery.autocomplete修改 实现键盘上下键 自动填充

    根据需求要实现通过键盘上下移动,获得联想菜单中的值,如同google baidu的查询功能. 在网上找了很久没有找到可以实现该功能的插件,无奈只能自己动手改代码.找到js中的KEY.DOWN 和 KE ...

  5. BZOJ4653 [NOI2016]区间 [线段树,离散化]

    题目传送门 区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就 ...

  6. Python类总结-多态及鸭子类型

    Python天生支持多态. 什么是多态: 一类事务的多种形态. 多态的一个例子 class Alipay(): def pay(self,money): print('用支付宝支付了%s元' % mo ...

  7. 创建操作表(UIActionSheet)

    UIActionSheet用来创建一个操作表,它的初始化代码如下: - (IBAction)testActionSheet:(id)sender { UIActionSheet *actionShee ...

  8. HDU 5692 Snacks

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=5692] 题意:一棵树,每个节点有权值,有两种操作:1.修改某个点的权值,2.求以x根的子树中的节点到根 ...

  9. 【随机化】【并查集】Gym - 100851J - Jump

    题意:交互题,有一个长度为n(偶数)的二进制串,你需要猜不超过n+500次猜到它.如果你猜的串与原串相同的位数为n,那么会返回n,如果为n/2,那么会返回n/2,否则都会返回零. 先random,直到 ...

  10. java23种设计模式之一: 单例模式(Singleton Pattern)

    单例模式(Singleton Pattern)是设计模式中比较常用的一种,下面来总结单例模式的知识,包括: 1.理解什么是单例模式.单例模式有什么优点/缺点.单例模式的应用场景: 2.再来看看Java ...