前几天,我想在resolv.conf中调整超时,但是在Docker和Kubernetes这样的时代。即使仅使用Linux,解析器也不一定是glibc。因此,我研究了glibc,musl libc(高山)和go resolver之间的区别。
环境
我为每个容器使用了docker容器,并使用tcpdump检查了查询的状态。
1 2 | macOS Catalina (10.15.7) docker desktop 3.0.3 (51017) |
容器图像为
1 2 | alpine:3.12.3 / musl-1.1.24-r10 debian:buster-20201209 (10.7) / glibc 2.28-10 |
Go在Mac上使用1.15.6,交叉编译后在上面的高山上运行。
由于它是交叉编译的,因此默认情况下应为
支持状态,例如resolv.conf中的选项
resolv.conf的示例
1 2 3 4 | nameserver 8.8.8.8 nameserver 8.8.4.4 search default.svc.cluster.local svc.cluster.local cluster.local asia-northeast1-b.c.project-id.internal c.project-id.internal google.internal options ndots:5 timeout:5 attempts:2 |
resolve.conf中有各种选项,但是这三个解析器这次都支持
。
-
ndots -
timeout -
attempts
这是
的三个。
它支持
较早的musl libc不支持
可以多次指定
让我们看看函数
的区别
圆点
首先,
您指定要查询的域中的点数(
例如
点数为n点以上时为
如果
点的数量大于或等于
很久以前,musl最初并不支持域补全,因此从那时起一直在使用它的人们将始终通过FQDN指定它,因此这不是问题,但是如果您不这样做,知道,减少
,如果点数少于ndots
如果
点的数量少于
顺便说一句,如果在末尾添加
名称服务器
glibc和musl之间指定多个服务器时的处理方式非常不同,因此我将首先对其进行说明。
glibc和Go查询第一个服务器,如果它们等待超时秒数并且没有响应,则查询下一个服务器。
musl libc同时将请求发送到多个名称服务器,并使用返回的第一个响应。如果指定了三个名称服务器,则将进行三倍的查询。
超时和尝试
如果有一个域名服务器
glibc和Go将引发查询并等待
musl libc等待每个查询
如果有两个名称服务器
glibc和Go查询第一个
如
musl libc同时查询多个
如果有3个域名服务器
当有三个
对于
Go总是等待
musl libc与以前相同。
超时时域完成
无论您查询多少次都超时,这并不重要,因为它不再有用,但我会写它,因为操作有所不同。
是否要使用
超时完成第二个及后续搜索域,glibc不会完成第二个及后续搜索域,但将查询未完成。 Go将尽职尽责地尝试所有域的完成情况,并且还会进行没有完成情况的查询。 musl libc查询第一个完成,仅此而已。没有完成就没有查询。
用于检查Go操作的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package main import ( "context" "net" "os" "log" ) func main() { ctx := context.Background() resolver := &net.Resolver{} for _, v := range os.Args[1:] { log.Printf("Resolving %s\n", v) names, err := resolver.LookupHost(ctx, v) if err != nil { log.Fatal(err) } for _, name := range names { log.Printf("%s\n", name) } } } |
可视化ndots的残暴程度:5
即使您用
句子编写它也很难理解,所以让我们看看当您尝试在GKE环境中访问
令人震惊的是,每次您尝试访问Cloud Storage API时都会发生这种数量的查询。如果您不使用微服务进行Keep-Alive等操作,即使内部通信量很大,也可能会发生这种情况。如果您可以像JVM一样缓存DNS,那就太好了。
我想知道是否可以用FQDN完全指定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 14:53:34.706909 ?? A? storage.googleapis.com.default.svc.cluster.local. (66) 14:53:34.707130 ?? AAAA? storage.googleapis.com.default.svc.cluster.local. (66) 14:53:34.708881 ? NXDomain 0/1/0 (159) 14:53:34.708940 ? NXDomain 0/1/0 (159) 14:53:34.709051 ?? A? storage.googleapis.com.svc.cluster.local. (58) 14:53:34.709133 ?? AAAA? storage.googleapis.com.svc.cluster.local. (58) 14:53:34.709615 ? NXDomain 0/1/0 (151) 14:53:34.709689 ? NXDomain 0/1/0 (151) 14:53:34.709771 ?? A? storage.googleapis.com.cluster.local. (54) 14:53:34.709816 ?? AAAA? storage.googleapis.com.cluster.local. (54) 14:53:34.712211 ? NXDomain 0/1/0 (147) 14:53:34.712280 ? NXDomain 0/1/0 (147) 14:53:34.712387 ?? A? storage.googleapis.com.asia-northeast1-b.c.my-project-id.internal. (83) 14:53:34.712479 ?? AAAA? storage.googleapis.com.asia-northeast1-b.c.my-project-id.internal. (83) 14:53:34.716561 ? NXDomain 0/1/0 (189) 14:53:34.716623 ? NXDomain 0/1/0 (189) 14:53:34.716718 ?? A? storage.googleapis.com.c.my-project-id.internal. (65) 14:53:34.716760 ?? AAAA? storage.googleapis.com.c.my-project-id.internal. (65) 14:53:34.719891 ? NXDomain 0/1/0 (162) 14:53:34.720191 ? NXDomain 0/1/0 (162) 14:53:34.720304 ?? A? storage.googleapis.com.google.internal. (56) 14:53:34.720390 ?? AAAA? storage.googleapis.com.google.internal. (56) 14:53:34.724145 ? NXDomain 0/1/0 (145) 14:53:34.724352 ? NXDomain 0/1/0 (145) 14:53:34.724458 ?? A? storage.googleapis.com. (40) 14:53:34.724500 ?? AAAA? storage.googleapis.com. (40) 14:53:34.726930 ? 4/0/0 AAAA 2404:6800:4004:813::2010, AAAA 2404:6800:4004:81c::2010, AAAA 2404:6800:4004:81d::2010, AAAA 2404:6800:4004:81e::2010 (152) 14:53:34.726957 ? 16/0/0 A 172.217.161.80, A 172.217.175.16, A 172.217.175.48, A 172.217.175.80, A 172.217.175.112, A 216.58.197.144, A 172.217.25.208, A 172.217.25.240, A 172.217.26.48, A 172.217.31.176, A 172.217.161.48, A 172.217.174.112, A 172.217.175.240, A 216.58.220.112, A 216.58.197.208, A 216.58.197.240 (296) |