LabHub
学习 学习路径 课程

Kubernetes 网络 — 在真集群上

短名字不是免费的

在 LabHub 中继续学习

一句话总结

短名字越方便,费用就越高,在寻找外面的名字时会收取费用。因为小于5个点的名字都会先搜索。

在容器管理中web只要这样写,也可以找到相同名称空间的服务。很方便。但是这种便利是有代价的,这个代价在寻找****离开的名称时**被收取。

流程图: 寻找 · 离开 · 点数少于5个的名称可能还不是一切都完成的名字,请先尝试搜索 · 一次请求可以往返四次,其中三次会被丢弃。

search 和 ndots

帕德的/etc/resolv.conf是这样的。

search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.43.0.10
options ndots:5

search是短名字后面依次贴上的标签,ndots:5意思是点数少于5个的名称可能还不是一切都完成的名字,请先尝试搜索

web因为银点是0个,所以当然要写search。问题是example.com因为只有一个点,所以这个也低于5,所以按照这个顺序问。

example.com.default.svc.cluster.local   → NXDOMAIN
example.com.svc.cluster.local           → NXDOMAIN
example.com.cluster.local               → NXDOMAIN
example.com.                            → 드디어 응답

一次请求可以往返四次,其中三次会被丢弃。

为什么不被指标抓到呢?

DNS查询不是在应用程序代码上,而是在下面库中发生的。所以应用程序跟踪中经常无法捕捉到段落,对用户来说只看起来像“有点慢的请求”。只有CoreDNS的负载悄悄上升,有一天,分片数增加后达到极限。

虽然可以修好,但不是免费的。

每个paddnsConfigndots可以降低。但是那个派对现在用短名字找不到群集服务。所以只有向出去请求多的派对给予才对。给群集内通信多的派对反而会造成损失。

为什么往返是四次?

帕德的/etc/resolv.conf是这样的。

search labhub-prod.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5

ndots:5认为点少于5个的名称不是完整的名称,请先搜索。 意思是试着贴上api.example.com因为有2个银点,所以挂在这里。

1. api.example.com.labhub-prod.svc.cluster.local  → NXDOMAIN
2. api.example.com.svc.cluster.local              → NXDOMAIN
3. api.example.com.cluster.local                  → NXDOMAIN
4. api.example.com                                → 응답    ← 네 번째에 성공

如果启用了IPv6,每个问题都会同时询问A和AAAA,所以实际问题有8个 是。在经常调用外部API的服务中,CoreDNS负载的大部分是这个。

三个对应和各自的值

方法 效果 代价
名字末尾的点(example.com.) 完全跳过search 需要修改代码
在平板电脑上ndots: 1 适用于该帕德的所有名称 不能是短名称
NodeLocal DNSCache 在节点上缓存,CoreDNS负载急剧下降 安装·运营负担

第一排最便宜、最安全。ndots不将降低到全军的理由kubectl可以通过以下方式确认——所有以短名称呼叫服务的代码 会碎掉。

# 파드 단위로만, 그 파드가 짧은 이름을 안 쓴다는 것을 확인하고
spec:
  dnsConfig:
    options:
      - name: ndots
        value: "1"

诊断DNS问题的命令

# 파드 안에서 — 어느 단계에서 실패하는지 본다
nslookup api.example.com
nslookup api.example.com.        # 끝점을 찍으면 되는가?

# search 가 실제로 어떻게 붙는지
dig +search +short api.example.com

# CoreDNS 가 무엇을 받고 있나
kubectl -n kube-system logs -l k8s-app=kube-dns --tail=50 | grep NXDOMAIN

CoreDNS日志为空的话Corefilelog没有插件。调查一下 只打开和关闭——打开的话日志量会很大。

按症状来看是这样的。间歇性失败通常是conntrack或UDP数据包丢失, 全部失败是CoreDNS或网络政策,只是慢的是上述search 是往返的。

在实际工作中真正重要的东西

经常呼叫外部域名的地方请打上终端。example.com.如加上句号,则被视为完成的名字,整个搜索都跳过。一个代码字符的往返四次变成一次,ndots因为不触及,所以短名字也照样使用。

信号在CoreDNS的查询次数中找到。 垃圾查询也是正常响应(NXDOMAIN),所以错误率不会上升。如果查询次数是服务呼叫次数的几倍,那就是在支付这个费用。

**ndots绝对不会降低到全域。**用短名称呼叫群集内的服务的代码都会崩溃。要更改的话,必须按板块进行,并确认该板块没有使用短名称。

了解交易所就是这个主题的全部。在下次练习中亲自数一下问题数,这个故事就会用数字抓住了。