Go语言 Kubernetes内部主机名解析为localhost

v1l68za4  于 2023-02-01  发布在  Go
关注(0)|答案(1)|浏览(189)

我正在尝试使用内部服务DNS进行服务到服务的HTTP通信。
如果我尝试从另一个部署pod curl 一个pod,它可以工作,但无法在golang net/http服务中使用它

2023/01/27 15:48:37 oauth2.go:90: oauth2 url  http://hydra-admin.microservices.svc.cluster.local:4445/oauth2/auth/requests/login/accept
2023/01/27 15:48:37 oauth2.go:101: Unable to make http request  Put "http://localhost:4445/admin/oauth2/auth/requests/login/accept?login_challenge=b569006c8b834a298cf1cd72e2424953": dial tcp [::1]:4445: connect: connection refused

在进行API调用时,hydra-admin.microservices.svc.cluster.local被解析为本地主机
但curl的工作原理如下所示

/ # curl -X PUT http://hydra-admin:4445/admin/oauth2/auth/requests/login/accept?login_challenge=6f51146e49c54b739de8a37b25a72349
{"error":"invalid_request","error_description":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Unable to decode body because: EOF"}

我错过了什么?

bvn4nwqk

bvn4nwqk1#

根据我的评论,取决于你是如何构建你的go可执行文件将影响它在k8s环境中的行为。你使用的是scratch映像还是CGO_ENABLED=1映像?
dns软件包文档中可以看到有关DNS行为的警告
默认情况下使用的是纯Go解析器,因为一个被阻塞的DNS请求只会消耗一个goroutine,而一个被阻塞的C调用则会消耗一个操作系统线程,当cgo可用时,基于cgo的解析器会在不同的情况下使用:
...当/etc/resolv.conf或/etc/nsswitch.conf指定使用Go解析器没有实现的特性时,***以及当被查找的名称以.local***结尾或者是一个mDNS名称时。
因此,我建议-为了最大限度地提高外部和内部DNS请求的成功率-构建k8sgo可执行文件,如下所示:

CGO_ENABLED=1 go build -tags netgo

相关问题