前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊k8s和dns

聊聊k8s和dns

作者头像
机械视角
发布2021-10-28 10:56:38
1.2K0
发布2021-10-28 10:56:38
举报
文章被收录于专栏:TensorbytesTensorbytes

从 DNS 说起

DNS 解析是一种按照层级的树形结构,从左到右,DNS trace 记录来看 DNS 解析过程,以shikanon.com域名为例。

域名本质是个树形结构,最顶层是根域名,一般使用 . 来表示,通常在写域名的时候省略,比如shikanon.com,其全称域名是shikanon.com.

通过dig trace可以看到,首先去找根域名.,根域名返回的是全球十三个根服务器 xxx.root-servers.net.,我们从8.8.8.8#53得到根服务器地址, 然后从根服务器199.9.14.201#53(b.root-servers.net)地址解析出次级域名服务器的NS和A地址:

通过迭代查询,最终找到目标域名IP地址。

CoreDNS:云原生动态命名服务器

CoreDNS 是一个用 Go 语言 Caddy 框架编写的 HTTP/2 Web 服务器。

本地搭建一个CoreDNS服务。 创建一个Corefile配置文件,

CoreDNS 支持链式插件,CoreDNS的插件可以在官方文档下 pulgin 找到。这里配置了一个根域名. 监听 5351 端口,根域名服务下启用了三个插件,errors,hosts, log。 errors插件表示开启错误日志; hosts插件支持/etc/hosts文件,shikanon.local域名解析到192.168.22.63log插件可以开启所有DNS查询日志。

运行CoreDNS容器:

本地测试:

CoreDNS 支持链式插件

k8s做DNS

pod DNS 策略配置

k8s 提供了 pod 级别的DNS策略,dnsPolicy主要影响pod中的/etc/resolv.confdnsPolicy总提供了四种 DNS 配置方式:

  • ClusterFirst模式,使用集群的dns配置,k8s的默认设置,ClusterFirst会用k8s集群提供的dns服务器来解析,由 kubelet 的 –cluster-dns 参数提供集群中 dns 服务器的ip地址,然后安装用这个 ip 安装 coredns 或 kube-dns,从而提供 dns 服务。
  • Default模式,直接从节点挂载/etc/resolv.conf到pod容器,从而继承节点命名解析服务。
  • ClusterFirstWithHostNet模式,是使用 hostNetwork 模型下启用集群dns服务,需配合hostNetwork: true使用
  • None模式,不加载k8s的dns配置,一般None模式会配合dnsConfig一起使用,用作自定义dns服务。

注:kubelet 提供了--cluster-dns参数,这个参数用来填写集群默认dns服务器地址,作用于Pod 中设置了 “dnsPolicy=ClusterFirst” 的容器。--cluster-dns后面跟的DNS服务器可以是多个,以 , 分割,所有 DNS 服务器必须包含相同的记录组。

使用dnsConfig自定义 dns 解析

dnsConfig 本质会映射到pod的/etc/resolv.conf文件中,因此其和/etc/resolv.conf文件是一样的,包括nameservers,searchesoptions三部分。

  • nameservers:将用作于 Pod 的 DNS 服务器的 IP 地址列表。 最多可以指定 3 个 IP 地址。当 Pod 的 dnsPolicy 设置为 “None” 时, 列表必须至少包含一个 IP 地址,否则此属性是可选的。 所列出的服务器将合并到从指定的 DNS 策略生成的基本名称服务器,并删除重复的地址。
  • searches:用于在 Pod 中查找主机名的 DNS 搜索域的列表。此属性是可选的。 指定此属性时,所提供的列表将合并到根据所选 DNS 策略生成的基本搜索域名中。 重复的域名将被删除。Kubernetes 最多允许 6 个搜索域。
  • options:可选的对象列表,其中每个对象可能具有 name 属性(必需)和 value 属性(可选)。 此属性中的内容将合并到从指定的 DNS 策略生成的选项。 重复的条目将被删除。

在k8s集群中构建一个专属特定业务的DNS服务

这里介绍一个自建的 coredns 服务,用来用来解析shikanon.local相关的域名服务,服务上游是集群的coredns地址,也就是不匹配shikano.local域名的交给集群coredns解析。

首先我们构建 coredns 的配置:

对配置介绍下,通过 template 插件匹配了所有*.shikanon.local的服务,并答复其A地址为192.168.1.1,template插件没匹配的,用 forward插件将所有域名.查询上游10.247.3.10,这个IP是集群的coredns的ip地址。.:5353表示其监听的是5353端口。

部署一个 coredns 的 deployment 和 service:

这里主要包括两部分,一个是deployment,用于运行 coredns 的pod,他挂载了coredns的配置文件,监听的5353端口,协议是UDP(coredns也支持TCP协议),service 的 clusterIP 是固定下来的,因为这个 DNS 要给其他 pod 使用,所以需要设置一个固定的 IP。

部署好后,我们部署一个设置自建 coredns 作为DNS服务器的 demo 容器:

设置dnsPolicy: None,然后启用自己的 DNS 服务设置dnsConfig,这里其实是将 k8s 的默认配置抄了过来,将 nameservers 改为我们自建的dns服务器地址。

进入容器中可以看到/etc/resolv.conf已经更改:

测试域名:

返回了我们设置的IP地址,这样就实现了一个兼容集群解析的自定义的DNS服务器做泛域名解析。

这里给大家留个小问题,采用组件子DNS服务器和直接配置集群DNS服务器的方式这两种有何异同,分别适用什么样的场景?

参考文献

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 从 DNS 说起
    • CoreDNS:云原生动态命名服务器
    • k8s做DNS
      • pod DNS 策略配置
        • 使用dnsConfig自定义 dns 解析
        • 在k8s集群中构建一个专属特定业务的DNS服务
        • 参考文献
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档