Kubernetes 集群 DNS 服务发现原理
简介:本文介绍 Kubernetes 集群中 DNS 服务发现原理。
本文介绍 Kubernetes 集群中 DNS 服务发现原理。
前提需要
- 拥有一个 Kubernetes 集群(可以通过 ACK 创建一个 Kubernetes 集群)
- 能通过 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
各参数描述如下:
- nameserver: 定义 DNS 服务器的 IP 地址。
- search: 设置域名的查找后缀规则,查找配置越多,说明域名解析查找匹配次数越多。集群匹配有 default.svc.cluster.local、svc.cluster.local、cluster.local 3个后缀,最多进行8次查询 (IPV4和IPV6查询各四次) 才能得到正确解析结果。
- option: 定义域名解析配置文件选项,支持多个KV值。例如该参数设置成ndots:5,说明如果访问的域名字符串内的点字符数量超过ndots值,则认为是完整域名,并被直接解析;如果不足ndots值,则追加search段后缀再进行查询。
根据上述文件配置,在 Pod 内尝试解析:
- 同命名空间下服务,如 kubernetes:添加一次 search 域,发送kubernetes.default.svc.cluster.local. 一次 ipv4 域名解析请求到 172.24.0.10 进行解析即可。
- 跨命名空间下的服务,如 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 才能解析出正确结果。
- 集群外服务,如 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}
其中,各插件说明:
- errors:错误信息到标准输出。
- health:CoreDNS自身健康状态报告,默认监听端口8080,一般用来做健康检查。您可以通过http://localhost:8080/health获取健康状态。
- ready:CoreDNS插件状态报告,默认监听端口8181,一般用来做可读性检查。可以通过http://localhost:8181/ready获取可读状态。当所有插件都运行后,ready状态为200。
- kubernetes:CoreDNS kubernetes插件,提供集群内服务解析能力。
- prometheus:CoreDNS自身metrics数据接口。可以通过http://localhost:9153/metrics获取prometheus格式的监控数据。
- forward(或proxy):将域名查询请求转到预定义的DNS服务器。默认配置中,当域名不在kubernetes域时,将请求转发到预定义的解析器(/etc/resolv.conf)中。默认使用宿主机的/etc/resolv.conf配置。
- cache:DNS缓存。
- loop:环路检测,如果检测到环路,则停止CoreDNS。
- reload:允许自动重新加载已更改的Corefile。编辑ConfigMap配置后,请等待两分钟以使更改生效。
- loadbalance:循环DNS负载均衡器,可以在答案中随机A、AAAA、MX记录的顺序。
原文链接:https://developer.aliyun.com/article/779121?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
Kubernetes 集群 DNS 服务发现原理相关推荐
- 从头开始搭建kubernetes集群+istio服务网格(3)—— 搭建istio
(win10 + virtualbox6.0 + centos7.6.1810 + docker18.09.8 + kubernetes1.15.1 + istio1.2.3) 本文参考网址: htt ...
- Kubernetes 集群DNS选择:CoreDNS vs Kube-DNS
在二进制部署 Kubernetes 集群时,最后一步是部署 DNS,有两个选项:CoreDNS 和 Kube-DNS,二者主要有什么区别,如何选择呢? CoreDNS 和 Kube-DNS 作为 Ku ...
- Prometheus-使用Prometheus监控Kubernetes集群
Prometheus是一个集数据收集存储.数据查询和数据图表显示于一身的开源监控组件.本文主要讲解如何搭建Prometheus,并使用它监控Kubernetes集群. 准备工作 Kubernete ...
- 龙芯电脑平台kubernetes集群编译及部署方案
http://ask.loongnix.org/?/article/105 一.环境 操作系统: loongnix 内核: 3.10.84 go版本: go1.9.2 linux/mips64le ...
- vivo AI计算平台 Kubernetes集群Ingress网关实践
1.背景 vivo 人工智能计算平台小组从 2018 年底开始建设 AI 计算平台至今,已经在 kubernetes 集群.以及离线的深度学习模型训练等方面,积累了众多宝贵的开发.运维经验,并逐步打造 ...
- 剖析 kubernetes 集群内部 DNS 解析原理
作者 | 江小南 来源 | 江小南和他的小伙伴们 引言 说到DNS域名解析,大家想到最多的可能就是/etc/hosts文件,并没有什么错,但是/etc/hosts只能做到本机域名解析,如果跨机器的解析 ...
- kubernetes集群配置dns服务
本文将在前文的基础上介绍在kubernetes集群环境中配置dns服务,在k8s集群中,pod的生命周期是短暂的,pod重启后ip地址会产生变化,对于应用程序来说这是不可接受的,为解决这个问题,K8S ...
- kubernetes集群内部DNS解析原理
kubernetes集群内部DNS解析原理 当kubernetes初始化完成后,在kube-system名称空间下会出现kube-dns的service服务与coredns的pod $ kubectl ...
- Kubernetes集群服务发现Service资源LoadBalancer类型详解(二十九)
Kubernetes集群服务发现Service资源LoadBalancer类型详解 1.LoadBalancer类型的service资源概念 LoadBalancer和Nodeport非常相似,目的都 ...
最新文章
- 【Unity】使用Resources类管理资源
- 简单介绍oracle重置序列的方法
- python使用numpy生成指定步长的浮点数序列
- 第8章 基本UDP套接口编程
- OpenCV 3.0又一个革命性版本,它会带来哪些改变
- 没有足够的值_孙悟空唯一一次没有搬救兵,玉帝如来却主动出手是什么时候?...
- SpringMVC 学习系列 (4) 之 数据绑定 -1
- 向量除法——标量乘法的逆运算
- C++控制向文件中写入浮点数的格式
- 遵循五大设计理念 打造出色设计师
- VS Code编译Python
- 【安利UI设计师】电商购物移动应用程序界面设计UI套件包,轻松完成项目需求。
- Linux日志管理五大命令详解
- 数据结构笔记(二十)--二叉树的存储
- BZOJ1022 [SHOI2008]小约翰的游戏John (博弈论)
- boost::unorder_map如何插入元素_「leetcode」701. 二叉搜索树中的插入操作:【递归法】【迭代法】详解...
- 玩转Kinetis之教你将K60主频超到200MHz以上
- 孪生网络图像相似度_CVPR-2019 更深更宽的孪生网络实时追踪
- 调试stvd遇到的问题
- 术语FXO和FXS的含义是什么?
热门文章
- B 站 CEO 的身份证被上传到 GitHub 了?
- 对比Excel,学习pandas数据透视表
- 手把手带你爬虫 | 爬取语录大全
- 肝!2500字 字符串专题总结
- 微软太良心,这么强大的软件竟然完全免费!
- 深度学习模型大合集:GitHub 趋势榜第一,已斩获 8000+ 星
- android工程创建,3.2.1 创建Android 项目(2)
- java bean工厂_java-将Service用作“工厂”以返回不同的Bean...
- python 字符串 数组 判断,Python的字符串的数组指数
- AC66U-B1) 刷梅林固件教程