Hariharan Sivakumar
Hariharan Sivakumar

Reputation: 89

Kubernetes internal hostname is resolved to localhost

I'm trying to use internal service DNS for service-to-service HTTP communication.

If I try to curl a pod from another deployment pod it is working but unable to use it in golang net/http service

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

hydra-admin.microservices.svc.cluster.local is resolved to localhost when the API call is made

but curl works as you see below

/ # 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"}

What am I missing here?

Upvotes: 1

Views: 233

Answers (1)

colm.anseo
colm.anseo

Reputation: 22147

Per my comment, depending on how you are building your go executable will have an effect on how it behaves within a k8s environment. Are you using a scratch image or a CGO_ENABLED=1 image?

From the dns package docs there's a caveat on DNS behavior

By default the pure Go resolver is used, because a blocked DNS request consumes only a goroutine, while a blocked C call consumes an operating system thread. When cgo is available, the cgo-based resolver is used instead under a variety of conditions:

... when /etc/resolv.conf or /etc/nsswitch.conf specify the use of features that the Go resolver does not implement, and when the name being looked up ends in .local or is an mDNS name.

So I would suggest - to maximized your success rate for both external & internal DNS requests - building your go executable for k8s like so:

CGO_ENABLED=1 go build -tags netgo

Upvotes: 1

Related Questions