在Kubernetes集群上没有CGO的Golang DNS

我用Golang写了一个api,并部署在一个Kubernetes集群中。 这意味着它运行在一个docker容器与临时图像。 要编译成像scratch / alpine这样的光图像,我需要closurescgo。 但是,如果没有cgo,networking包将无法正常工作。 我知道networking包有一个问题,因为它本身使用cgo。

我需要为这个应用程序使用的所有服务都在另一个Kubernetes命名空间,所以唯一的办法就是使用DNS。 我在这里的一个angular落。

我用这样的东西来构build二进制文件

GOOS='linux' CGO_ENABLED=0 GODEBUG=netdns=go+1 go build -a -installsuffix cgo -ldflags -s -o ./dist/prod/api ./src/backend/api.go 

这本身并不能解决问题,但正如布拉德•菲茨帕特里克 ( Brad Fitzpatrick) 在这里所说的那样,这是一个谜团。 我终于得到了它的工作

 //Connect is a function that connects to MOngoDB func Connect() (*mgo.Session, error) { var host string if os.Getenv("KUBERNETES") == "true" { cmd := exec.Command("ping", "-c", "1", viper.GetString("MONGO-HOST")) var out bytes.Buffer cmd.Stdout = &out _ = cmd.Run() match := regexp.MustCompile(`\(([^\)]+)\)`).FindStringSubmatch(out.String()) host = match[1] } else { host = viper.GetString("MONGO-HOST") } inf := &mgo.DialInfo{ Addrs: []string{host + ":" + viper.GetString("MONGO-PORT")}, Timeout: 5 * time.Second, Database: "admin", Username: viper.GetString("MONGO-USER"), Password: viper.GetString("MONGO-PASS"), } return mgo.DialWithInfo(inf) } 

它只是削减一个ping命令的输出,并使用parsing的ip而不是主机名来避免dns的问题。 但它增加了一个额外的复杂性,我的应用程序不应该处理。 我怎样才能做得更好?