简介:本文介绍 Kubernetes 集群中 DNS 服务发现原理。

本文介绍 Kubernetes 集群中 DNS 服务发现原理。

前提需要

  1. 拥有一个 Kubernetes 集群(可以通过 ACK 创建一个 Kubernetes 集群)
  2. 能通过 kubectl 连接 Kubernetes 集群

集群 DNS 服务

Kubernetes 集群中部署了一套 DNS 服务,通过 kube-dns 的服务名暴露 DNS 服务。您可执行以下命令查看 kube-dns 的服务详情。

kubectl get svc kube-dns -n kube-system

输出:

NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   172.24.0.10   <none>        53/UDP,53/TCP,9153/TCP   27d

服务后端是两个名为 coredns(下文会介绍 CoreDNS 解析原理) 的 Pod。您可执行以下命令查看 coredns 的 Pod 详情。

kubectl get deployment coredns -n kube-system

输出:

NAME      READY   UP-TO-DATE   AVAILABLE   AGE
coredns   2/2     2            2           27d

集群内域名解析原理

Kubernetes 集群节点上 kubelet 有--cluster-dns=${dns-service-ip} 和 --cluster-domain=${default-local-domain} 两个 dns 相关参数,分别被用来设置集群DNS服务器的IP地址和主域名后缀。

查看集群 default 命名空间下 dnsPolicy:ClusterFirst (下文会介绍 dnsPolicy)模式的 Pod 内的 DNS 域名解析配置文件 /etc/resolv.conf 内容:

nameserver 172.24.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

各参数描述如下:

  1. nameserver: 定义 DNS 服务器的 IP 地址。
  2. search: 设置域名的查找后缀规则,查找配置越多,说明域名解析查找匹配次数越多。集群匹配有 default.svc.cluster.local、svc.cluster.local、cluster.local 3个后缀,最多进行8次查询 (IPV4和IPV6查询各四次) 才能得到正确解析结果。
  3. option: 定义域名解析配置文件选项,支持多个KV值。例如该参数设置成ndots:5,说明如果访问的域名字符串内的点字符数量超过ndots值,则认为是完整域名,并被直接解析;如果不足ndots值,则追加search段后缀再进行查询。

根据上述文件配置,在 Pod 内尝试解析:

  1. 同命名空间下服务,如 kubernetes:添加一次 search 域,发送kubernetes.default.svc.cluster.local. 一次 ipv4 域名解析请求到 172.24.0.10 进行解析即可。
  2. 跨命名空间下的服务,如 kube-dns.kue-system:添加两次 search 域,发送 kube-dns.kue-system.default.svc.cluster.local. 和 kube-dns.kue-system.svc.cluster.local. 两次 ipv4 域名解析请求到 172.24.0.10 才能解析出正确结果。
  3. 集群外服务,如 aliyun.com:添加三次 search 域,发送 aliyun.com.default.svc.cluster.local.、aliyun.com.svc.cluster.local.、aliyun.com.cluster.local. 和 aliyun.com 四次 ipv4 域名解析请求到 172.24.0.10 才能解析出正确结果。

Pod dnsPolicy

Kubernetes 集群中支持通过 dnsPolicy 字段为每个 Pod 配置不同的 DNS 策略。目前支持四种策略:

ClusterFirst:通过集群 DNS 服务来做域名解析,Pod 内 /etc/resolv.conf 配置的 DNS 服务地址是集群 DNS 服务的 kube-dns 地址。该策略是集群工作负载的默认策略。
None:忽略集群 DNS 策略,需要您提供 dnsConfig 字段来指定 DNS 配置信息。
Default:Pod 直接继承集群节点的域名解析配置。即在集群直接使用节点的 /etc/resolv.conf 文件。
ClusterFirstWithHostNetwork:强制在 hostNetWork 网络模式下使用 ClusterFirst 策略(默认使用 Default 策略)。

CoreDNS

CoreDNS 目前是 Kubernetes 标准的服务发现组件,dnsPolicy: ClusterFirst 模式的 Pod 会使用 CoreDNS 来解析集群内外部域名。

在命名空间 kube-system 下,集群有一个名为 coredns 的 configmap。其 Corefile 字段的文件配置内容如下(CoreDNS 功能都是通过 Corefile 内的插件提供)。

  Corefile: |.:53 {errorshealth {lameduck 5s}readykubernetes cluster.local in-addr.arpa ip6.arpa {pods insecureupstreamfallthrough in-addr.arpa ip6.arpattl 30}prometheus :9153forward . /etc/resolv.confcache 30loopreloadloadbalance}

其中,各插件说明:

  1. errors:错误信息到标准输出。
  2. health:CoreDNS自身健康状态报告,默认监听端口8080,一般用来做健康检查。您可以通过http://localhost:8080/health获取健康状态。
  3. ready:CoreDNS插件状态报告,默认监听端口8181,一般用来做可读性检查。可以通过http://localhost:8181/ready获取可读状态。当所有插件都运行后,ready状态为200。
  4. kubernetes:CoreDNS kubernetes插件,提供集群内服务解析能力。
  5. prometheus:CoreDNS自身metrics数据接口。可以通过http://localhost:9153/metrics获取prometheus格式的监控数据。
  6. forward(或proxy):将域名查询请求转到预定义的DNS服务器。默认配置中,当域名不在kubernetes域时,将请求转发到预定义的解析器(/etc/resolv.conf)中。默认使用宿主机的/etc/resolv.conf配置。
  7. cache:DNS缓存。
  8. loop:环路检测,如果检测到环路,则停止CoreDNS。
  9. reload:允许自动重新加载已更改的Corefile。编辑ConfigMap配置后,请等待两分钟以使更改生效。
  10. loadbalance:循环DNS负载均衡器,可以在答案中随机A、AAAA、MX记录的顺序。

原文链接:https://developer.aliyun.com/article/779121?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

Kubernetes 集群 DNS 服务发现原理相关推荐

  1. 从头开始搭建kubernetes集群+istio服务网格(3)—— 搭建istio

    (win10 + virtualbox6.0 + centos7.6.1810 + docker18.09.8 + kubernetes1.15.1 + istio1.2.3) 本文参考网址: htt ...

  2. Kubernetes 集群DNS选择:CoreDNS vs Kube-DNS

    在二进制部署 Kubernetes 集群时,最后一步是部署 DNS,有两个选项:CoreDNS 和 Kube-DNS,二者主要有什么区别,如何选择呢? CoreDNS 和 Kube-DNS 作为 Ku ...

  3. Prometheus-使用Prometheus监控Kubernetes集群

      Prometheus是一个集数据收集存储.数据查询和数据图表显示于一身的开源监控组件.本文主要讲解如何搭建Prometheus,并使用它监控Kubernetes集群. 准备工作 Kubernete ...

  4. 龙芯电脑平台kubernetes集群编译及部署方案

    http://ask.loongnix.org/?/article/105  一.环境 操作系统: loongnix 内核: 3.10.84 go版本: go1.9.2 linux/mips64le ...

  5. vivo AI计算平台 Kubernetes集群Ingress网关实践

    1.背景 vivo 人工智能计算平台小组从 2018 年底开始建设 AI 计算平台至今,已经在 kubernetes 集群.以及离线的深度学习模型训练等方面,积累了众多宝贵的开发.运维经验,并逐步打造 ...

  6. 剖析 kubernetes 集群内部 DNS 解析原理

    作者 | 江小南 来源 | 江小南和他的小伙伴们 引言 说到DNS域名解析,大家想到最多的可能就是/etc/hosts文件,并没有什么错,但是/etc/hosts只能做到本机域名解析,如果跨机器的解析 ...

  7. kubernetes集群配置dns服务

    本文将在前文的基础上介绍在kubernetes集群环境中配置dns服务,在k8s集群中,pod的生命周期是短暂的,pod重启后ip地址会产生变化,对于应用程序来说这是不可接受的,为解决这个问题,K8S ...

  8. kubernetes集群内部DNS解析原理

    kubernetes集群内部DNS解析原理 当kubernetes初始化完成后,在kube-system名称空间下会出现kube-dns的service服务与coredns的pod $ kubectl ...

  9. Kubernetes集群服务发现Service资源LoadBalancer类型详解(二十九)

    Kubernetes集群服务发现Service资源LoadBalancer类型详解 1.LoadBalancer类型的service资源概念 LoadBalancer和Nodeport非常相似,目的都 ...

最新文章

  1. 【Unity】使用Resources类管理资源
  2. 简单介绍oracle重置序列的方法
  3. python使用numpy生成指定步长的浮点数序列
  4. 第8章 基本UDP套接口编程
  5. OpenCV 3.0又一个革命性版本,它会带来哪些改变
  6. 没有足够的值_孙悟空唯一一次没有搬救兵,玉帝如来却主动出手是什么时候?...
  7. SpringMVC 学习系列 (4) 之 数据绑定 -1
  8. 向量除法——标量乘法的逆运算
  9. C++控制向文件中写入浮点数的格式
  10. 遵循五大设计理念 打造出色设计师
  11. VS Code编译Python
  12. 【安利UI设计师】电商购物移动应用程序界面设计UI套件包,轻松完成项目需求。
  13. Linux日志管理五大命令详解
  14. 数据结构笔记(二十)--二叉树的存储
  15. BZOJ1022 [SHOI2008]小约翰的游戏John (博弈论)
  16. boost::unorder_map如何插入元素_「leetcode」701. 二叉搜索树中的插入操作:【递归法】【迭代法】详解...
  17. 玩转Kinetis之教你将K60主频超到200MHz以上
  18. 孪生网络图像相似度_CVPR-2019 更深更宽的孪生网络实时追踪
  19. 调试stvd遇到的问题
  20. 术语FXO和FXS的含义是什么?

热门文章

  1. B 站 CEO 的身份证被上传到 GitHub 了?
  2. 对比Excel,学习pandas数据透视表
  3. 手把手带你爬虫 | 爬取语录大全
  4. 肝!2500字 字符串专题总结
  5. 微软太良心,这么强大的软件竟然完全免费!
  6. 深度学习模型大合集:GitHub 趋势榜第一,已斩获 8000+ 星
  7. android工程创建,3.2.1 创建Android 项目(2)
  8. java bean工厂_java-将Service用作“工厂”以返回不同的Bean...
  9. python 字符串 数组 判断,Python的字符串的数组指数
  10. AC66U-B1) 刷梅林固件教程