一、前言

kubernetes CoreDNS 是 kube-system 命令空间里面的一个Pod,用于域名解析。

kubernetes自带三个命名空间(用kubeadm安装的Kubernetes集群):
default kube-public kube-system
前两个不重要,kube-system命名空间很重要,静态Pod都在这个命名空间里面。

kube-system中,与网络相关的三个Pod
kube-proxy:解决service负载均衡到具体的哪个Pod
calico:解决的是node1与node2之间(不同节点之间)网络通不通的问题。
验证1:kubectl get pod -n kube-system 查看calico是否正常运行Running(如果不是Running,要么是calico绑定错误本地网卡(那个机器错误就到哪个机器上修改),要么是云服务没有打开对应的入规则和出规则);
验证2:在node1 ping 另一个节点node2 上 serviceName.namespace ,验证通不通。
CoreDNS:解决的是 ping 内网ip 可以通,ping serviceName.namespace 不通,报错为 name server unknown;ping 外网ip 可以通,ping 外网域名 不通的问题,报错为 name server unknown。解决的是将 域名解析为ip 的问题。

二、调用流程

pod - service - deployment - replicaset - 两个pod - configmap - linux



kubectl get deployment coredns -o yaml -n kube-system

小结:调用流程

pod - service - deployment - replicaset - 两个pod - configmap - linux

所有命令:
kubectl get pod -n kube-system -o wide
kubectl exec -it nginx bash
cat /etc/resolv.conf
kubectl get all -o wide -A | grep 10.96.0.10
kubectl get all -o wide -A | grep kube-dns
kubectl get all -o wide -A | grep coredns
kubectl get deployment coredns -o yaml -n kube-system
kubectl get configmap coredns -o yaml -n kube-system

三、CoreDNS

3.1 dnsPolicy的四个属性

Kubernetes 中 Pod 的 DNS 策略有四种类型,yaml 文件中通过 dnsPolicy 和 dnsConfig 两个属性来指定 Pod 的dns方式。

1.Default:Pod 继承所在主机上的 DNS 配置;

2.ClusterFirst:K8s 的默认设置;先在 K8s 集群配置的 coreDNS 中查询,查不到的再去继承自主机的上游 nameserver 中查询(就是通过 configmap 里面的 forward 属性来指定上游服务器);

3.ClusterFirstWithHostNet:对于网络配置为 hostNetwork 的 Pod 而言,其 DNS 配置规则与 ClusterFirst 一致;

4.None:忽略 K8s 环境的 DNS 配置,只认 Pod 的 dnsConfig 设置。(当 dnsPolicy 指定为 none,dnsConfig 属性必须配置)

默认是 ClusterFirst ,表示 ping serviceName.namespace 可以,ping 外网域名 报错 name server unknown。

设置为 Default 表示 继承所在主机上的 DNS 配置,但是 ping serviceName.namespace 报错 name server unknown。

3.2 Corefile 各自字段什么意思

53 表示的 kube-dns Service 服务的端口,其他的如下:

apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}

Corefile 配置包括以下 CoreDNS 插件:

errors:错误记录到标准输出。

health:在 http://localhost:8080/health 处提供 CoreDNS 的健康报告。

ready:在端口 8181 上提供的一个 HTTP 末端,当所有能够 表达自身就绪的插件都已就绪时,在此末端返回 200 OK。

kubernetes:CoreDNS 将基于 Kubernetes 的服务和 Pod 的 IP 答复 DNS 查询。你可以在 CoreDNS 网站阅读更多细节。 你可以使用 ttl 来定制响应的 TTL。默认值是 5 秒钟。TTL 的最小值可以是 0 秒钟, 最大值为 3600 秒。将 TTL 设置为 0 可以禁止对 DNS 记录进行缓存。

pods insecure 选项是为了与 kube-dns 向后兼容。你可以使用 pods verified 选项,该选项使得 仅在相同名称空间中存在具有匹配 IP 的 Pod 时才返回 A 记录。如果你不使用 Pod 记录,则可以使用 pods disabled 选项。

prometheus:CoreDNS 的度量指标值以 Prometheus 格式在 http://localhost:9153/metrics 上提供。

forward: 不在 Kubernetes 集群域内的任何查询都将转发到 预定义的解析器 (/etc/resolv.conf).

cache:启用前端缓存。

loop:检测到简单的转发环,如果发现死循环,则中止 CoreDNS 进程。

reload:允许自动重新加载已更改的 Corefile。 编辑 ConfigMap 配置后,请等待两分钟,以使更改生效。

loadbalance:这是一个轮转式 DNS 负载均衡器, 它在应答中随机分配 A、AAAA 和 MX 记录的顺序。

参考资料(Corefile 各自字段什么意思):https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/dns-custom-nameservers/

3.3 让container同时内网和外网(通过 forward 属性配置上游域名解析服务器来实现)

让container同时内网和外网,通过 forward 属性配置上游域名解析服务器来实现

[root@w1 ~]# kubectl get configmap coredns -o yaml -n kube-system
apiVersion: v1
data:
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
# 这里表示将使用本机linux的域名解析,可以配置为ip,表示其他的机器
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
kind: ConfigMap
metadata:
creationTimestamp: "2022-07-28T16:05:03Z"
name: coredns
namespace: kube-system
resourceVersion: "200"
selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
uid: 0a6711df-0e8f-11ed-a989-000c291867b4

yaml里面的指定 dnsPolicy 为 ClusterFirst 或者不指定,因为默认就是 ClusterFirst,只需要修改 configmap 里面的 forward . /etc/resolv.conf 配置上上游的域名解析服务器为本地。

查看本机使用的域名解析服务器

cat /etc/resolv.conf
nameserver 表示域名解析器

3.4 CoreDNS 配置等同于 kube-dns

在 Kubernetes 1.21 版本中,kubeadm 移除了对将 kube-dns 作为 DNS 应用的支持。 对于 kubeadm v1.24,所支持的唯一的集群 DNS 应用是 CoreDNS。

参考资料:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/coredns/

四、尾声

最好的关于kubernetes的dns方案是:使用默认的 ClusterFirst 可以 ping serviceName.namespace ,然后加上 forward . /etc/resolv.conf 就可以 ping 外网域名。

kubernetes CoreDNS全解析,完成了。

kubernetes_CoreDNS全解析的更多相关文章

  1. Google Maps地图投影全解析(3):WKT形式表示

    update20090601:EPSG对该投影的编号设定为EPSG:3857,对应的WKT也发生了变化,下文不再修改,相对来说格式都是那样,可以到http://www.epsg-registry.or ...

  2. C#系统缓存全解析(转载)

    C#系统缓存全解析 对各种缓存的应用场景和方法做了很详尽的解读,这里推荐一下 转载地址:http://blog.csdn.net/wyxhd2008/article/details/8076105

  3. 【凯子哥带你学Framework】Activity界面显示全解析

    前几天凯子哥写的Framework层的解析文章<Activity启动过程全解析>,反响还不错,这说明“写让大家都能看懂的Framework解析文章”的思想是基本正确的. 我个人觉得,深入分 ...

  4. iOS Storyboard全解析

    来源:http://iaiai.iteye.com/blog/1493956 Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果, ...

  5. 【转载】Fragment 全解析(1):那些年踩过的坑

    http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使 ...

  6. (转)ASP.NET缓存全解析6:数据库缓存依赖

    ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...

  7. jQuery&nbsp;Ajax&nbsp;实例&nbsp;全解析

    jQuery Ajax 实例 全解析 jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我 ...

  8. ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57

    转自: ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57 前不久ARM正式宣布推出新款ARMv8架构的Cortex-A50处理器系列 ...

  9. jQuery Ajax 全解析

    转自:http://www.cnblogs.com/qleelulu/archive/2008/04/21/1163021.html 本文地址: jQuery Ajax 全解析 本文作者:QLeelu ...

  10. Oracle AWR报告指标全解析-11011552

    1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...

随机推荐

  1. KingbaseES V8R3 集群专用机网关失败分析案例

    ​ KingbaseES R3集群网关检测工作机制: 1.Cluster下watchdog进程在固定间隔时间,通过ping 网关地址监控链路的连通性,如果连通网关地址失败,则修改cluster sta ...

  2. 璞华HawkEye平台助力乳品行业巨头在数字化转型中领“鲜”一步!

    中国乳制品的市场规模接近4,000亿.在今天,产业数字化正在帮助这个传统产业实现更高质量的发展. 乳品行业现状 随着乳品行业规模扩大,各工厂引进大量的专用设备,设备故障也随之增多.设备的突发故障极易造 ...

  3. 【学习笔记】注意力机制(Attention)

    前言 这一章看啥视频都不好使,啃书就完事儿了,当然了我也没有感觉自己学的特别扎实,不过好歹是有一定的了解了 注意力机制 由于之前的卷积之类的神经网络,选取卷积中最大的那个数,实际上这种行为是没有目的的 ...

  4. Redisson多策略注解限流

    限流:使用Redisson的RRateLimiter进行限流 多策略:map+函数式接口优化if判断 自定义注解 /** * aop限流注解 */ @Target({ElementType.METHO ...

  5. MySQL读写分离之——ProxySQL

    文章转载自:https://blog.csdn.net/u012280685/article/details/113520692?spm=1001.2014.3001.5501 实现一个简单的读写分离 ...

  6. 俄罗斯的 HTTPS 证书问题

    文章转载自:https://mp.weixin.qq.com/s/8EikwCvZgKt2TFsld-nKSA

  7. Elasticsearch之集群角色类型

    角色划分 在Elasticsearch中,有很多角色,常用的角色有如下: Master Node:主节点 Master eligible nodes:合格节点 Data Node:数据节点 Coord ...

  8. Elasticsearch部署清单---前期准备工作

    1.了解ES集群拓扑结构 当我们启动Elasticsearch的实例,就会启动至少一个节点.相同集群名的多个节点的连接组成一个集群, 在默认情况下,集群中的每个节点都可以处理Http请求和集群节点的数 ...

  9. Docker安装部署Rancher

    # 一.Rancher简介 [Rancher](https://www.cnrancher.com/rancher/)是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开 ...

  10. Vue实现拖拽穿梭框功能四种方式

    一.使用原生js实现拖拽 点击打开视频讲解更加详细 <html lang="en"> <head> <meta charset="UTF-8 ...