我在Golang中编写了一个api,并部署在Kubernetes集群中。 这意味着它在具有临时图像的docker容器内运行。 要编译成像刮刮/高山的光图像,我需要关闭cgo。 但是没有cgo,网络包不能很好地运行。我知道net package存在问题,因为它本身使用cgo。
我需要为此应用程序使用的所有服务都在另一个Kubernetes名称空间中,因此唯一的方法是使用DNS。我在这里的一个角落。
我使用类似的东西构建二进制文件
GOOS='linux' CGO_ENABLED=0 GODEBUG=netdns=go+1 go build -a -installsuffix cgo -ldflags -s -o ./dist/prod/api ./src/backend/api.go
这本身并不能解决问题,但正如来自团队的here所述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命令的输出并使用已解析的ip而不是主机名来避免dns的问题。但它增加了我的应用程序不应该处理的额外复杂性。我怎样才能做得更好?