首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Kubernetes IP Masquerade Agent 用户指南
Kubernetes云管理控制器
Kubernetes安全地清空一个节点
Kubernetes保护集群
Kubernetes调试DNS问题
Kubernetes改变默认 StorageClass
Kubernetes更改PersistentVolume的回收策略
Kubernetes关键插件Pod的调度保证
Kubernetes静态加密Secret数据
Kubernetes开发云控制器管理器
Kubernetes控制节点上的CPU管理策略
Kubernetes控制节点上的拓扑管理策略
Kubernetes名字空间演练
Kubernetes配置API对象配额
启用/禁用 Kubernetes API
Kubernetes迁移多副本的控制面
Kubernetes升级集群
Kubernetes声明网络策略
Kubernetes使用CoreDNS进行服务发现
Kubernetes使用KMS驱动进行数据加密
使用Kubernetes API访问集群
Kubernetes使用NUMA感知的内存管理器
Kubernetes通过名字空间共享集群
Kubernetes通过配置文件设置Kubelet参数
为Kubernetes运行etcd集群
Kubernetes为节点发布扩展资源
Kubernetes限制存储使用量
Kubernetes验证已签名容器镜像
以非root用户身份运行Kubernetes节点组件
在Kubernetes集群中使用NodeLocal DNSCache
在Kubernetes集群中使用sysctl
Kubernetes在集群中使用级联删除
在运行中的集群上重新配置节点的 kubelet
Kubernetes自定义DNS服务
Kubernetes自动扩缩集群DNS服务
当前位置:
首页>>
技术小册>>
Kubernetes中文教程(五)
小册名称:Kubernetes中文教程(五)
本页概述了 Kubernetes 中的 NodeLocal DNSCache 功能。 ## 引言 NodeLocal DNSCache 通过在集群节点上作为 DaemonSet 运行 DNS 缓存代理来提高集群 DNS 性能。 在当今的体系结构中,运行在 'ClusterFirst' DNS 模式下的 Pod 可以连接到 kube-dns `serviceIP` 进行 DNS 查询。 通过 kube-proxy 添加的 iptables 规则将其转换为 kube-dns/CoreDNS 端点。 借助这种新架构,Pod 将可以访问在同一节点上运行的 DNS 缓存代理,从而避免 iptables DNAT 规则和连接跟踪。 本地缓存代理将查询 kube-dns 服务以获取集群主机名的缓存缺失(默认为 "`cluster.local`" 后缀)。 ## 动机 * 使用当前的 DNS 体系结构,如果没有本地 kube-dns/CoreDNS 实例,则具有最高 DNS QPS 的 Pod 可能必须延伸到另一个节点。 在这种场景下,拥有本地缓存将有助于改善延迟。 * 跳过 iptables DNAT 和连接跟踪将有助于减少 [conntrack 竞争]并避免 UDP DNS 条目填满 conntrack 表。 * 从本地缓存代理到 kube-dns 服务的连接可以升级为 TCP。 TCP conntrack 条目将在连接关闭时被删除,相反 UDP 条目必须超时 ([默认] `nf_conntrack_udp_timeout` 是 30 秒)。 * 将 DNS 查询从 UDP 升级到 TCP 将减少由于被丢弃的 UDP 包和 DNS 超时而带来的尾部等待时间; 这类延时通常长达 30 秒(3 次重试 + 10 秒超时)。 由于 nodelocal 缓存监听 UDP DNS 查询,应用不需要变更。 * 在节点级别对 DNS 请求的度量和可见性。 * 可以重新启用负缓存,从而减少对 kube-dns 服务的查询数量。 ## 架构图 启用 NodeLocal DNSCache 之后,DNS 查询所遵循的路径如下: ## 配置 NodeLocal DNSCache 的本地侦听 IP 地址可以是任何地址,只要该地址不和你的集群里现有的 IP 地址发生冲突。 推荐使用本地范围内的地址,例如,IPv4 链路本地区段 '169.254.0.0/16' 内的地址, 或者 IPv6 唯一本地地址区段 'fd00::/8' 内的地址。 可以使用以下步骤启动此功能: * 根据示例 [`nodelocaldns.yaml`] 准备一个清单,把它保存为 `nodelocaldns.yaml`。 * 如果使用 IPv6,在使用 'IP:Port' 格式的时候需要把 CoreDNS 配置文件里的所有 IPv6 地址用方括号包起来。 如果你使用上述的示例清单, 需要把[配置行 L70] 修改为: "`health [__PILLAR__LOCAL__DNS__]:8080`"。 * 把清单里的变量更改为正确的值: ```shell kubedns=`kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP}` domain=<cluster-domain> localdns=<node-local-address> ``` `<cluster-domain>` 的默认值是 "`cluster.local`"。`<node-local-address>` 是 NodeLocal DNSCache 选择的本地侦听 IP 地址。 * 如果 kube-proxy 运行在 IPTABLES 模式: ``` bash sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/__PILLAR__DNS__SERVER__/$kubedns/g" nodelocaldns.yaml ``` node-local-dns Pod 会设置 `__PILLAR__CLUSTER__DNS__` 和 `__PILLAR__UPSTREAM__SERVERS__`。 在此模式下, node-local-dns Pod 会同时侦听 kube-dns 服务的 IP 地址和 `<node-local-address>` 的地址,以便 Pod 可以使用其中任何一个 IP 地址来查询 DNS 记录。 * 如果 kube-proxy 运行在 IPVS 模式: ``` bash sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/,__PILLAR__DNS__SERVER__//g; s/__PILLAR__CLUSTER__DNS__/$kubedns/g" nodelocaldns.yaml ``` 在此模式下,node-local-dns Pod 只会侦听 `<node-local-address>` 的地址。 node-local-dns 接口不能绑定 kube-dns 的集群 IP 地址,因为 IPVS 负载均衡使用的接口已经占用了该地址。 node-local-dns Pod 会设置 `__PILLAR__UPSTREAM__SERVERS__`。 * 运行 `kubectl create -f nodelocaldns.yaml` * 如果 kube-proxy 运行在 IPVS 模式,需要修改 kubelet 的 `--cluster-dns` 参数 NodeLocal DNSCache 正在侦听的 `<node-local-address>` 地址。 否则,不需要修改 `--cluster-dns` 参数,因为 NodeLocal DNSCache 会同时侦听 kube-dns 服务的 IP 地址和 `<node-local-address>` 的地址。 启用后,`node-local-dns` Pod 将在每个集群节点上的 `kube-system` 名字空间中运行。 此 Pod 在缓存模式下运行 [CoreDNS], 因此每个节点都可以使用不同插件公开的所有 CoreDNS 指标。 如果要禁用该功能,你可以使用 `kubectl delete -f <manifest>` 来删除 DaemonSet。 你还应该回滚你对 kubelet 配置所做的所有改动。 ## StubDomains 和上游服务器配置 `node-local-dns` Pod 能够自动读取 `kube-system` 名字空间中 `kube-dns` ConfigMap 中保存的 StubDomains 和上游服务器信息。ConfigMap 中的内容需要遵从[此示例]中所给的格式。 `node-local-dns` ConfigMap 也可被直接修改,使用 Corefile 格式设置 stubDomain 配置。 某些云厂商可能不允许直接修改 `node-local-dns` ConfigMap 的内容。 在这种情况下,可以更新 `kube-dns` ConfigMap。 ## 设置内存限制 `node-local-dns` Pod 使用内存来保存缓存项并处理查询。 由于它们并不监视 Kubernetes 对象变化,集群规模或者 Service/EndpointSlices 的数量都不会直接影响内存用量。内存用量会受到 DNS 查询模式的影响。 根据 [CoreDNS 文档], > The default cache size is 10000 entries, which uses about 30 MB when completely filled. > (默认的缓存大小是 10000 个表项,当完全填充时会使用约 30 MB 内存) 这一数值是(缓存完全被填充时)每个服务器块的内存用量。 通过设置小一点的缓存大小可以降低内存用量。 并发查询的数量会影响内存需求,因为用来处理查询请求而创建的 Go 协程都需要一定量的内存。 你可以在 forward 插件中使用 `max_concurrent` 选项设置并发查询数量上限。 如果一个 `node-local-dns` Pod 尝试使用的内存超出可提供的内存量 (因为系统资源总量的,或者所配置的[资源约束])的原因, 操作系统可能会关闭这一 Pod 的容器。 发生这种情况时,被终止的("OOMKilled")容器不会清理其启动期间所添加的定制包过滤规则。 该 `node-local-dns` 容器应该会被重启(因其作为 DaemonSet 的一部分被管理), 但因上述原因可能每次容器失败时都会导致 DNS 有一小段时间不可用: the packet filtering rules direct DNS queries to a local Pod that is unhealthy (包过滤器规则将 DNS 查询转发到本地某个不健康的 Pod)。 通过不带限制地运行 `node-local-dns` Pod 并度量其内存用量峰值,你可以为其确定一个合适的内存限制值。 你也可以安装并使用一个运行在 “Recommender Mode(建议者模式)” 的 [VerticalPodAutoscaler], 并查看该组件输出的建议信息。
上一篇:
以非root用户身份运行Kubernetes节点组件
下一篇:
在Kubernetes集群中使用sysctl
该分类下的相关小册推荐:
Kubernets合辑4-kubernetes入门
Kubernets合辑14-日志收集
Kubernets合辑5-Pod控制器
Kubernetes中文教程(四)
Kubernets合辑10-网络
Kubernets合辑6-服务发现
Kubernets合辑8-权限控制
Kubernets合辑3-kubernetes介绍
Kubernets合辑15-持续部署
云原生-K8S入门实战
Kubernetes中文教程(三)
Kubernets合辑13-集群监控