《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记录。

  1. 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记录的映射关系是:

  1. SRV记录

SRV记录是通过描述某些服务协议和地址促进服务发现的。SRV记录通常定义一个符号名称和作为域名一部分的传输协议(如TCP),并定义给定服务的优先级、权重、端口和目标:

优先级和权重通常用于建议指定使用某些服务器。记录中的最后两个值定义了要连接的端口和主机名,以便与服务通信。

Kubernetes DNS的SRV记录是按照一个约定俗成的规定实现了对服务端口的查询:

  1. 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。

  1. 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网络技巧

《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN

《Kubernetes网络权威指南》读书笔记 | 主角登场:Linux容器