《Kubernetes网络权威指南》读书笔记 | 你的名字:通过域名访问服务
Posted COCOgsta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Kubernetes网络权威指南》读书笔记 | 你的名字:通过域名访问服务相关的知识,希望对你有一定的参考价值。
书籍来源:《Kubernetes网络权威指南:基础、原理与实践》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客
在一个Kubernetes集群中,DNS服务是非必需的,因此无论是Kube-dns还是CoreDNS,通常以插件(add-on)的方式安装,作为运行在集群上的应用。
3.7.1 DNS服务基本框架
Kubernetes DNS是用来解析Kubernetes集群内的Pod和Service域名的,而且一般情况下只供集群内的容器使用,不给外人使用。
Kubernetes的DNS应用部署好后,会对外暴露一个服务,集群内的容器通过访问该服务的Cluster IP+53端口获得域名解析服务,而这个Service的ClusterIP一般情况下都是固定的。
当Kubernetes的DNS服务Cluster IP分配后,系统(一般是指安装程序)会给Kubelet配置--cluster-dns=启动参数,DNS服务的IP地址将在用户容器启动时传递,并写入每个容器的/etc/resolv.conf文件。DNS服务IP即上文提到的DNS Service的Cluster IP。
Kubelet的--cluster_domain=参数支持配置集群域名后缀,默认是cluster.local。
打开Kubelet配置:
3.7.2 域名解析基本原理
对于Service,Kubernetes DNS服务器会生成三类DNS记录,分别是A记录、SRV记录和CNAME记录。
- A记录
A记录(A Record)是用于将域或子域指向某个IP地址的DNS记录的最基本类型。记录包括域名、解析它的IP地址和以秒为单位的TTL。
Kubernetes为“normal”和“headless”服务分配不同的A Record name。“headless”服务与“normal”服务的不同之处在于它们未分配Cluster IP且不执行负载均衡。
A记录与普通Service和headless Service有区别。普通Service的A记录的映射关系是:
headless Service的A记录的映射关系是:
- SRV记录
SRV记录是通过描述某些服务协议和地址促进服务发现的。SRV记录通常定义一个符号名称和作为域名一部分的传输协议(如TCP),并定义给定服务的优先级、权重、端口和目标:
优先级和权重通常用于建议指定使用某些服务器。记录中的最后两个值定义了要连接的端口和主机名,以便与服务通信。
Kubernetes DNS的SRV记录是按照一个约定俗成的规定实现了对服务端口的查询:
- CNAME记录
CNAME记录用于将域或子域指向另一个主机名。为此,CNAME使用现有的A记录作为其值。相反,A记录会解析为指定的IP地址。这是一种跨集群服务发现方法。
3.7.3 DNS使用
下面运行一个带nslookup命令的busybox容器,说明Kubernetes域名解析的使用。
给出带nslookup命令的busybox Pod示例yaml文件:
先来查询Kubernetes默认的API Server服务Kubernetes的IP地址:
如上所示,Kube-dns的IP地址是10.0.0.1,而API Server的Cluster IP地址是10.0.0.10。
在default namespace下又创建了一个名为whoami的服务,并做以下域名解析动作:
如上所示,发起域名解析请求的busybox Pod和whoami服务均在default namespace下,因此以下所有域名都能被正确解析并且返回相同的结果。
查看busybox Pod的DNS配置文件,可以看到如下DNS Server的地址及搜索的domain列表:
其中,DNS Server的IP地址是10.0.0.1。options ndots:5的含义是当查询的域名字符串内的点字符数量超过ndots(5)值时,则认为是完整域名,直接解析,否则Linux系统会自动尝试用default.pod.cluster.local、default.svc.cluster.local或svc.cluster.local补齐域名后缀。
最后,运行DNS Pod可能需要特权,即配置Kubelet的参数:--allow-privileged=true。
- Kubernetes域名解析策略
Kubernetes域名解析策略对应到Pod配置中的dnsPolicy,有4种可选策略,分别是None、ClusterFirstWithHostNet、ClusterFirst和Default,其中:
- None:从Kubernetes 1.9版本起引入的一个新选项值。它允许Pod忽略Kubernetes环境中的DNS设置。应使用dnsConfigPod规范中的字段提供所有DNS设置;
- ClusterFirstWithHostNet:对于使用hostNetwork运行的Pod,用户应该明确设置其DNS策略为ClusterFirstWithHostNet;
- ClusterFirst:任何与配置的群集域后缀(例如cluster.local)不匹配的DNS查询(例如“www.kubernetes.io” )将转发到从宿主机上继承的上游域名服务器。集群管理员可以根据需要配置上游DNS服务器;
- Default:Pod从宿主机上继承名称解析配置。
3.7.4 调试DNS
如果nslookup命令由于某种原因失败,则有几种调试和排除故障的方案。若DNS失败,通常会得到如下响应:
如果出现此错误,则需要做的第一件事是检查DNS配置是否正确。
查看容器中的resolv.conf文件:
验证是否正确设置了搜索路径和名称服务器:
如果/etc/resolve.conf的所有条目都是正确的,则需要检查kube-dns/coredns插件是否已启用,或者检查kubedns/coredns Pod是否正在运行。
如果Pod正在运行,则全局DNS服务可能存在问题。
可能还需要检查后端DNS Endpoint是否准备好:
以上是关于《Kubernetes网络权威指南》读书笔记 | 你的名字:通过域名访问服务的主要内容,如果未能解决你的问题,请参考以下文章
《Kubernetes网络权威指南》读书笔记 | iptables
《Kubernetes网络权威指南》读书笔记 | 打通CNI与Kubernetes:Kubernetes网络驱动
《Kubernetes网络权威指南》读书笔记 | Kubernetes网络策略:为你的应用保驾护航
《Kubernetes网络权威指南》读书笔记 | 最常用的Docker网络技巧