前言

在k8s中,我们可以使用..svc.cluster.local的方式对服务直接访问,该原理是在集群中部署一个kubeDNS,然后修改为默认的DNS服务器!
而kubeDNS的原理就是获取所有的svc然后构建DNS表(这里应该有一些优化比如使用散列表而不是顺序表等等),当发起一个服务请求时,首选进行域名解析,然后使用KubeDNS将解析后的ip地址进行访问,这里扩展一下,在对ip进行访问时只是访问的svc的ip并不是endpoint的ip,而svcip -> endpointip这一步是集群帮我们完成的,其原理是 安装kube-proxy,kube-proxy使用iptabels将svc-ip与endpoint-ip创建映射关系,这样我们在访问svc-ip时,就会自动转发到endpoint-ip上(采用轮询方式)。

Istio的DNS

为什么

现在我们思考一个场景,一个集群外部应用(与k8s内部网络必须在同一个网段)想要通过kubeDNS的形式访问内部服务,一般我们的操作就是将kubeDNS使用nodeport(或者通过网关)暴露出去,这种方式虽然可行,但是也增加了一些安全隐患。
istio分为内部应用于外部应用,外部应用无法直接访问内部应用(默认情况下,如果访问一个未知的服务istio代理是使用的透传的方式进行处理,但是为了安全起见,一般将其设置为拦截,也就是访问一个未知的服务istio代理会直接拒绝)。
istio的内部应用限定大于k8s内部应用限定,也就是说属于k8s内的应用一定属于istio内部应用(默认配置情况下),属于istio内部的应用不一定属于k8s应用服务。

内部访问外部

这句话怎么理解那?
我们还是考虑刚才那个场景,我们在集群外面的物理机上部署了一个应用(与k8s内部网络必须在同一个网段),它不属于集群内部应用,然后我们在集群中为其创建serviceentry,那么它就属于istio的内部服务(其他内部服务可以直接进行通讯,因为现在它是一个可知的服务。) 注意: 这个外部服务一定要使用istio-proxy 进程,否则它将不会使用限流,熔断等规则!其实也就是把之前以容器形式部署的应用,扩大到虚拟机或者物理机上部署!

外部访问内部

现在我们在上面那个场景的基础上进行另一步操作,也就是让外面部署的这个应用访问内部应用。
下面会有两种情况,第一种直接通过ip进行访问,第二种通过服务名进行通讯。
直接通过ip进行访问时可以访问成功的,这里不再赘述,其原理与原生k8s请求一致。
下面我们考虑第二种情况,既然通过域名访问,那么首先就需要访问域名解析服务器,但是如果使用上面所说的直接将DNS暴露出来又不安全,那么要怎么办那?下面就引出来本文的重点——istioDNS

怎么做

那么istio是怎么做的,才能让kubeDNS在不暴露的情况下,供外部应用使用的那?
pilot-agent除了提供优雅开关envoy外,还提供了一个DNS服务器的功能,没错istio实现了一个DNS解析服务器,这样既能保证kubeDNS不暴露,也能保证外部应用能够通过域名的形式进行访问!

使用

$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:meshConfig:defaultConfig:proxyMetadata:# 开启智能DNSISTIO_META_DNS_CAPTURE: "true"# 使用自动分配VipISTIO_META_DNS_AUTO_ALLOCATE: "true"
EOF

原理

那么具体原理是什么那?
DNS解析服务器分为两部分首先获取host与ip映射信息,其次创建服务器供应用进行访问,这里我们还需要考虑一点,如何在代码无侵入的情况下完成这一步操作!并且在当前映射表中没有查找到信息后使用原有的DNS解析器进行解析!
让我们一一列出

  1. isito根据service获取endpoint(这里有原生svc资源与istio的资源)构建DNStables然后发送给pilot-agent。pilot-agent获取到信息后更新当前缓存表。
  2. pilot-agent 创建服务器,地址为localhost:15053
  3. iptables可以拦截DNS操作,所以使用iptables拦截所有DNS操作然后转发到 15053端口上。
  4. 读取/etc/resolv.conf 文件,当缓存表没有命中是遍历文件中的ip进行域名解析转发。

优化

你的集群的 Kubernetes DNS 服务器的负载急剧下降,因为几乎所有的 DNS 查询都是由 Istio 在 pod 内解决的。集群上 mesh 的管理的范围越大,你的 DNS 服务器的负载就越小。在 Istio 代理中实现我们自己的 DNS 代理,使我们能够实现诸如 CoreDNS auto-path 等很酷的优化,而不会出现 CoreDNS 目前面临的正确性问题。
为了理解这种优化的影响,让我们以一个简单的 DNS 查找场景为例,在一个标准的 Kubernetes 集群中,没有对 pod 进行任何自定义 DNS 设置 —— 即在 /etc/resolv.conf 中默认设置为 ndots:5。当你的应用程序开始对 productpage.ns1.svc.cluster.local 进行 DNS 查询时,它会将 /etc/resolv.conf 中的 DNS 搜索 namespace(例如,ns1.svc.cluster.local)作为 DNS 查询的一部分,然后再按原样查询主机。因此,实际发出的第一个 DNS 查询将看起来像 productpage.ns1.svc.cluster.local.ns1.svc.cluster.local,当 Istio 不参与时,这将不可避免地导致 DNS 解析失败。如果你的 /etc/resolv.conf 有 5 个搜索 namespace,应用程序将为每个搜索 namespace 发送两个 DNS 查询,一个是 IPv4 A 记录,另一个是 IPv6 AAAA 记录,然后再发送最后一对查询,查询内容是代码中使用的准确主机名。在建立连接之前,应用程序要为每个主机执行 12 次 DNS 查找查询!通过 Istio 实现的 CoreDNS 风格的 auto-path 技术,sidecar 代理将在第一次查询中检测到被查询的真实主机名,并返回一个 cname 记录给 productpage.ns1.svc.cluster.local 作为这个 DNS 响应的一部分,以及 productpage.ns1.svc.cluster.local 的 A/AAAA 记录。接收到这个响应的应用程序现在可以立即提取 IP 地址,并继续建立到该 IP 的 TCP 连接。Istio 代理中的智能 DNS 代理大大减少了 DNS 查询的次数,从 12 次减少到只有 2 次!

nameserver 10.1.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
ndots:5:如果查询的域名包含的点 “.” 不到 5 个,那么进行 DNS 查找,将使用非完全限定名称(或者叫绝对域名),如果你查询的域名包含点数大于等于 5,那么 DNS 查询,默认会使用绝对域名进行查询。

这里注意search 它并不是根据你输入的host进行匹配然后访问nameserver,它是你输入host后要添加的后缀名称,这也是为什么我们只输入服务名与命名空间就可以访问的原因

扩展

自动分配的VIP

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: db1namespace: ns1
spec:hosts:- mysql–instance1.us-east-1.rds.amazonaws.comports:- name: mysqlnumber: 3306protocol: TCPresolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: db2namespace: ns1
spec:hosts:- mysql–instance2.us-east-1.rds.amazonaws.comports:- name: mysqlnumber: 3306protocol: TCPresolution: DNS

在上面的示例中,对于发送请求的服务,您有一个预定义的IP地址。但是常规情况下,服务访问外部服务时一般没有一个相对固定的地址,因此需要通过 DNS 代理去访问外部服务。如果 DNS 代理没有足够的信息去返回一个响应的情况下,将需要向上游转发 DNS 请求。
这在 TCP 通讯中是一个很严重的问题。它不像 HTTP 请求,基于 Host 头部去路由。TCP 携带的信息更少,只能在目标 IP 和端口号上路由。由于后端没有稳定的 IP,所以也不能基于其他信息进行路由,只剩下端口号,但是这会导致多个 ServiceEntry 使用 TCP 服务会共享同一端口而产生冲突。
为了解决这些问题,DNS 代理还支持为没有明确定义的 ServiceEntry 自动分配地址。这是通过 ISTIO_META_DNS_AUTO_ALLOCATE 选项配置的。
启用此特性后,DNS 响应将为每个 ServiceEntry 自动分配一个不同的独立地址。然后代理能匹配请求与 IP 地址,并将请求转发到相应的 ServiceEntry。

参考

https://cloudnative.to/blog/istio-dns-proxy/#%E5%A4%9A%E9%9B%86%E7%BE%A4-dns-%E6%9F%A5%E8%AF%A2
https://istio.io/latest/zh/docs/ops/configuration/traffic-management/dns-proxy/#address-auto-allocation

Istio-智能DNS相关推荐

  1. 用bind架设自己的智能DNS

    中国的南北网络问题,是许多做网站的人的心病 除了使用双通或者多通机房以外,还可以通过多台镜像服务器的方法来提高用户的访问速度 但是,如果使用的双通机房并不是单IP的,或者使用多台镜像的做法,就会面临多 ...

  2. 才知道百度也提供了智能DNS服务 - 加速乐

    http://jiasule.baidu.com/ 智能DNS 依托百度多年积累的高精度DNS识别库,平均只需5秒全球DNS服务器全部生效,百度蜘蛛1秒生效.抗攻击.无限解析记录,免费支持电信.联通. ...

  3. 实易智能DNS单台设备QPS高达28万

    在国内某电子商务旗舰企业11月智能DNS采购入围测试中,通过专业测试仪,实易智能DNS单台设备QPS峰值高达28w,稳定在24W,遥遥领先国内在测同类产品.测试数据达到国际领先水平,得到了用户的认可. ...

  4. 智能DNS解析+JBOSS集群(一)

    智能DNS+JBOSS集群<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  5. CDN和智能DNS原理和应用 (原)

    CDN是什么? CDN的全称是Content Delivery Network,即内容分发网络. CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调 ...

  6. mysql与dns_借助mysql和DNS view实现智能DNS(centos6.3 x64环境)

    开篇说明 关于智能DNS和CDN的东西可以看我之前的一篇博文 上次的博文简单使用了BIND的视图功能实现了简单的智能dns,此篇博文结合了mysql实现真正意义上的智能DNS系统 需要准备东西 首先y ...

  7. 在Win2003中安装bind【部署智能DNS】

    http://369369.blog.51cto.com/319630/811179 前言:     搞LINUX的朋友都知道,bind是linux下的DNS服务软件,但很多人不清楚,它也可以运行在w ...

  8. 烂泥:智能DNS使用与配置

    公司的业务现在已经扩展到海外,对外提供的统一接口都是通过域名来解析的,但是海外用户访问国内接口的话,你懂的,很慢的.为了提高域名解析的速度,打算使用智能DNS功能,来解决海外用户域名解析慢的问题. P ...

  9. 怎么删除已经安装的mysql_怎么样删除已经安装的mysql | wdlinux致力于Linux服务器架构,性能优化.免费CDN加速系统,免费智能DNS解析,负载均衡,集群分流...

    [root@localhost ~]# rpm -qa|grep mysql php-mysql-5.1.6-27.el5 mysql-5.0.77-4.el5_5.3 perl-DBD-mysql- ...

  10. 智能化服务器怎么调,怎么设置dns 智能dns设置方法 【图文】

    智能 dns 是关于域名频道的一种智能解析服务,它能够根据访问者的 IP 地址,自动判断出对应的地址,使访问者达到相应的服务器.这样解释是不是还是不太了解这个服务,就让小编带你了解一下如何设置智能 D ...

最新文章

  1. 内置哪几种服务容器_ASP.NET CORE 内置的IOC解读及使用
  2. nagios部署安装中篇
  3. Android 将ARGB图片转换为灰度图
  4. matlab2018无法使用qcat,解决Matlab 2018a源代码的中文支持问题
  5. 什么原因导致挖掘机老自动熄火憋车熄火?
  6. HTML——meta标签
  7. Gson读写JSON 数据
  8. kettle系列-6.kettle实现多字段字典快速翻译
  9. [模拟|数位] leetcode 7 整数反转
  10. 微信小程序和百度的语音识别接口详解
  11. Centos安装Kafka集群
  12. paip.asp vbs代码的排版格式化
  13. word三线格模版绘制
  14. matlab的转置和共轭,对Matlab中共轭、转置和共轭装置的区别说明
  15. 网站服务器在本地是指,本地域名是什么意思?本地域名服务器在哪?
  16. 虚拟内存和缺页,为什么使用一键加速会使你的电脑变慢?
  17. 使用CSS绘制一个平行四边形
  18. 痞子衡嵌入式:超级下载算法RT-UFL v1.0发布,附J-Link下安装教程
  19. java和vue募捐网水滴筹项目捐款爱心系统筹款系统
  20. 安卓玩机搞机技巧综合资源-----手机隐藏拍照录像 取证软件 寻找隐藏摄像头 【十六】

热门文章

  1. 判断数组中是否存在某个元素
  2. svn update 时报错 Node remains in conflict 和解决方法
  3. 摄像头poe供电原理_无线监控中poe供电原理图解
  4. 电脑重装系统数据恢复方法教程
  5. 【OpenCV-图像处理】用sift特征点算法和ransac算法进行多幅图像的拼接
  6. 【C语言】简单猜字游戏
  7. 学而思python分几个level_学而思英语怎么样-过来人谈谈我的亲身经历
  8. spring听课一点+组成原理心得
  9. 结合 Whisper + Stable-diffusion 的语音生成图像任务
  10. 西瓜视频官方缩短域名网址接口v.ixigua.com生成原理解析