Dns
DNS 是任何网络的关键基础设施。在 Kubernetes 中,情况也是一样,因此需要进行简要概述。在接下来的“服务”部分中,我们将看到它们在多大程度上依赖于 DNS,以及为什么 不提供遵循规范的 DNS 服务不能声称是符合标准的 Kubernetes 发行版。但首先,让我们回顾一下 Kubernetes 内部的 DNS 工作方式。
在早期的 Kubernetes 版本中使用了 KubeDNS。KubeDNS 在一个 pod 中包含了多个容器:kube-dns、dnsmasq 和 sidecar。kube-dns 容器监视 Kubernetes API 并根据 Kubernetes DNS 规范提供 DNS 记录,dnsmasq 提供缓存和子域支持,sidecar 提供指标和健康检查。从 1.13 版本之后的 Kubernetes 使用了独立组件 CoreDNS。CoreDNS 与 KubeDNS 之间存在几个差异:
为了简化,CoreDNS 作为单个容器运行。CoreDNS 是一个 Go 进程,它复制并增强了 Kube-DNS 的功能。
CoreDNS 被设计为一个通用的 DNS 服务器,与 Kubernetes 兼容,并且其可扩展的插件可以执行 Kubernetes DNS 规范提供的功能之外的更多操作。
图 4-10 展示了 CoreDNS 的组成部分。它运行了一个部署,其中默认副本数量为 2。为了运行,CoreDNS 需要访问 API 服务器,一个 ConfigMap 来存储其 Corefile,一个服务使 DNS 对集群可用,以及一个部署来启动和管理其 Pod。所有这些也都在 kube-system 命名空间中运行,与其他集群中的关键组件一起运行。
图 4-10. CoreDNS 组件
像大多数配置选项一样,容器如何进行 DNS 查询是在容器规格的 dnsPolicy 属性中设置的。如示例 4-12 所示,容器规格中设置的 dnsPolicy 为 ClusterFirstWithHostNet。
示例 4-12. Pod 规格与 DNS 配置
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox:1.28
command: ["sleep", "3600"]
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
DNS 策略有四种选项,这四种选项显著影响容器内部的 DNS 解析工作:
Default
容器从运行容器的节点继承名称解析配置。
ClusterFirst
任何不匹配集群域名后缀(如 www.kubernetes.io)的 DNS 查询将被发送到从节点继承的上游名称服务器。
ClusterFirstWithHostNet
对于使用 hostNetwork 运行的容器,管理员应将 DNS 策略设置为 ClusterFirstWithHostNet。
None
所有 DNS 设置使用 pod 规范中的 dnsConfig 字段。
如果为空,开发人员将在 pod 规格中指定名称服务器。nameservers:是一个将被 pod 使用的 DNS 服务器的 IP 地址列表。最多可以指定三个 IP 地址。searches:是一个 DNS 搜索域列表,用于 pod 中的主机名查找。Kubernetes 最多允许六个搜索域。以下是一个这样的示例规格:
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: busybox
spec:
containers:
- image: busybox:1.28
command: ["sleep", "3600"]
imagePullPolicy: IfNotPresent
name: busybox
dnsPolicy: "None"
dnsConfig:
nameservers:
- 1.1.1.1
searches:
- ns1.svc.cluster-domain.example
- my.dns.search.suffix
其他选项在选项字段中,这是一个对象列表,其中每个对象可能具有名称属性和值属性(可选)。
所有生成的属性与 DNS 策略中的 resolv.conf 合并。常规查询选项使 CoreDNS 通过以下搜索路径进行处理:
<service>.default.svc.cluster.local
↓
svc.cluster.local
↓
cluster.local
↓
The host search path
主机搜索路径来自 pod DNS 策略或 CoreDNS 策略。在 Kubernetes 中查询 DNS 记录可能会导致许多请求,并增加等待 DNS 请求响应的应用程序的延迟。CoreDNS 为此提供了解决方案,称为 Autopath。Autopath 允许在服务器端完成搜索路径的填充。它通过剥离集群搜索域并在 CoreDNS 服务器上执行查找来绕过客户端的搜索路径解析;当它找到答案时,将结果存储为 CNAME,并返回一个查询而不是五个。
使用 Autopath 确实会增加 CoreDNS 的内存使用量。确保根据集群的大小调整 CoreDNS 副本的内存。确保为 CoreDNS 容器组设置适当的内存和 CPU 请求。要监控 CoreDNS,它导出了一些它暴露的指标,如下所示:
coredns build info
CoreDNS 本身的资讯
dns request count total
总查询次数
dns request duration seconds
处理每个查询的时长
dns request size bytes
请求的字节数
coredns plugin enabled
指示是否在每个服务器和区域级别启用了插件
通过结合 pod 指标和 CoreDNS 指标,插件管理员将确保 CoreDNS 在您的集群内部保持健康并运行。
这只是一个可用指标的简要概述。完整列表是可用的。
Autopath 和其他指标通过插件启用。这使得 CoreDNS 专注于其一项任务,DNS,但仍然可以通过插件框架进行扩展,类似于 CNI 模式。在表 4-5 中,我们看到了当前可用插件的列表。作为一个开源项目,任何人都可以贡献插件。其中有一些针对特定云服务的插件,如 router53,它能够从 AWS 的 route53 服务提供区域数据。
表 4-5. CoreDNS 插件
名称 | 描述 |
---|---|
auto | 启用从磁盘自动获取的 RFC 1035 风格的主文件中提供区域数据。 |
autopath | 允许服务器端搜索路径补全。autopath [ZONE…] RESOLV-CONF. |
bind | 覆盖服务器应该绑定的主机。 |
cache | 启用前端缓存。cache [TTL] [ZONES…]。 |
chaos | 允许对 CH 类的 TXT 查询做出响应。 |
debug | 禁用崩溃时的自动恢复,以便您能得到一个漂亮的堆栈跟踪。text2pcap。 |
dnssec | 启用对提供数据的即时 DNSSEC 签名。 |
dnstap | 启用 dnstap 日志记录。更多信息可以在 dnstap 找到。在 golang 中的使用示例:go get -u -v github.com/dnstap/golang-dnstap/dnstap 。 |
erratic | 一个对测试客户端行为有用的插件。 |
errors | 启用错误日志记录。 |
etcd | 启用从 etcd 版本 3 实例读取区域数据。 |
federation | 启用通过 kubernetes 插件解析的联合查询。 |
file | 启用从 RFC 1035 风格的主文件中提供区域数据。 |
forward | 促进将 DNS 消息代理到上游解析器。 |
health | 启用健康检查端点。 |
host | 启用从 /etc/hosts 风格的文件中提供区域数据。 |
kubernetes | 启用从 Kubernetes 集群读取区域数据。 |
loadbalancer | 随机化 A, AAAA 和 MX 记录的顺序。 |
log | 启用将查询日志记录到标准输出。 |
loop detect | 检测简单的转发循环并停止服务器。 |
metadata | 启用元数据收集器。 |
metrics | 启用 Prometheus 指标。 |
nsid | 在每个回复中添加此服务器的标识符。RFC 5001。 |
pprof | 在 /debug/pprof 下的端点发布运行时分析数据。 |
proxy | 促进基本反向代理和强大的负载均衡器。 |
reload | 允许自动重新加载更改的 Corefile。优雅重新加载。 |
rewrite | 执行内部消息重写。rewrite name foo.example.com foo.default.svc.cluster.local. |
root | 简单地指定查找区域文件的根目录。 |
router53 | 启用从 AWS route53 提供区域数据。 |
secondary | 启用从主服务器检索的区域提供服务。 |
template | 根据传入的查询提供动态响应。 |
tls | 为 TLS 和 gRPC 服务器配置服务器证书。 |
trace | 启用基于 OpenTracing 的 DNS 请求跟踪。 |
whoami | 返回解析器的本地 IP 地址、端口和传输方式。 |
CoreDNS 非常可配置且与 Kubernetes 模型兼容。我们只是触及了 CoreDNS 能力的表面;如果您想了解更多关于 CoreDNS 的信息,我们强烈
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...