内容简介:最近遇到了一个问题。我们的kube-apiserver配置了OIDC认证,OIDC issuer是添加了dns server记录的,但由于某些原因,我需要覆盖掉dns server的解析,改用hostAlias的IP地址,但是实测发现总是走了DNS解析,虽然原因是,kube-apiserver的基础镜像是 busybox ,和 centos 不同,这货没有
最近遇到了一个问题。
我们的kube-apiserver配置了OIDC认证,OIDC issuer是添加了dns server记录的,但由于某些原因,我需要覆盖掉dns server的解析,改用hostAlias的IP地址,但是实测发现总是走了DNS解析,虽然 /etc/hosts
文件已经添加了自定义的hosts记录。而那些没有在dns server注册的域名,还是可以通过 /etc/hosts
解析的。
原因是,kube-apiserver的基础镜像是 busybox ,和 centos 不同,这货没有 /etc/nsswitch.conf
文件,所以总是优先使用DNS解析,忽略了 /etc/hosts
文件。
解决办法很简单,给镜像添加 /etc/nsswitch.conf
文件指定解析顺序即可,内容如下。
hosts: files dns
即,files优先dns。
顺带完整的理一下 linux 系统里golang的域名解析。
golang有两种域名解析方法:内置 Go 解析器;基于cgo的系统解析器。通过环境变量GODEBUG来配置。
export GODEBUG=netdns=go # force pure Go resolver export GODEBUG=netdns=cgo # force cgo resolver
默认采用的是内置Go解析器,因为当DNS解析阻塞时,内置Go解析器只是阻塞了一个goroutine,而cgo的解析器则是阻塞了一个操作系统级别的线程。
func init() { netGo = true }
读取 resolv.conf
失败则强制使用cgo。
confVal.resolv = dnsReadConfig("/etc/resolv.conf")
if confVal.resolv.err != nil && !os.IsNotExist(confVal.resolv.err) &&
!os.IsPermission(confVal.resolv.err) {
// If we can't read the resolv.conf file, assume it
// had something important in it and defer to cgo.
// libc's resolver might then fail too, but at least
// it wasn't our fault.
confVal.forceCgoLookupHost = true
}
当使用内置Go解析器时,根据解析优先级的不同,还会细分为下面四种。
const ( // hostLookupCgo means defer to cgo. hostLookupCgo hostLookupOrder = iota hostLookupFilesDNS // files first hostLookupDNSFiles // dns first hostLookupFiles // only files hostLookupDNS // only DNS )
当 /etc/nsswitch.conf
文件不存在或者文件存在但是没有指定 hosts
字段时,linux下使用的是 hostLookupDNSFiles
,也就是说,dns解析优先hosts解析,所以就会出现开头出现的问题。
nss := c.nss
srcs := nss.sources["hosts"]
// If /etc/nsswitch.conf doesn't exist or doesn't specify any
// sources for "hosts", assume Go's DNS will work fine.
if os.IsNotExist(nss.err) || (nss.err == nil && len(srcs) == 0) {
if c.goos == "linux" {
// glibc says the default is "dns [!UNAVAIL=return] files"
// http://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html.
return hostLookupDNSFiles
}
return hostLookupFilesDNS
}
通过 nsswitch.conf
可以指定解析顺序。代码挺简单的。
var mdnsSource, filesSource, dnsSource bool
var first string
for _, src := range srcs {
if src.source == "files" || src.source == "dns" {
if !src.standardCriteria() {
return fallbackOrder // non-standard; let libc deal with it.
}
if src.source == "files" {
filesSource = true
} else if src.source == "dns" {
dnsSource = true
}
if first == "" {
first = src.source
}
continue
}
// Some source we don't know how to deal with.
return fallbackOrder
}
// Cases where Go can handle it without cgo and C thread
// overhead.
switch {
case filesSource && dnsSource:
if first == "files" {
return hostLookupFilesDNS
} else {
return hostLookupDNSFiles
}
case filesSource:
return hostLookupFiles
case dnsSource:
return hostLookupDNS
}
所以指定 hosts: files dns
,解析策略就是 hostLookupFilesDNS
,即优先使用 /etc/hosts
。
详细的解析顺序请参见 hostLookupOrder 。
以上所述就是小编给大家介绍的《golang如何解析域名》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- kubernetes容器中域名解析优化
- 基于CoreDNS和etcd实现动态域名解析
- 使用C语言获取DNS nameserver并进行域名解析
- 程序架构探讨—004 应用服务器集群的伸缩性之DNS域名解析负载均衡
- 从零搭建nodejs服务器,配置域名解析+https证书 (以阿里云linux服务器为例)
- 【技术分享】劫持一个国家的顶级域名之旅-域名后缀的隐藏威胁(下)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Twenty Lectures on Algorithmic Game Theory
Tim Roughgarden / Cambridge University Press / 2016-8-31 / USD 34.99
Computer science and economics have engaged in a lively interaction over the past fifteen years, resulting in the new field of algorithmic game theory. Many problems that are central to modern compute......一起来看看 《Twenty Lectures on Algorithmic Game Theory》 这本书的介绍吧!