我有以下问题:我在k8s的服务器上运行了kafka代理示例。我已将此代理的端口转发到localhost kubectl port forward kafka-broker-0 9104。
我确信它是有效的,因为我在我的python应用程序中尝试过它,但如果我在go from internet中尝试这个例子
package main
import (
"fmt"
"os"
"os/signal"
kingpin "gopkg.in/alecthomas/kingpin.v2"
"github.com/Shopify/sarama"
)
var (
brokerList = kingpin.Flag("brokerList", "List of brokers to connect").Default("localhost:9104").Strings()
topic = kingpin.Flag("topic", "Topic name").Default("important").String()
partition = kingpin.Flag("partition", "Partition number").Default("0").String()
offsetType = kingpin.Flag("offsetType", "Offset Type (OffsetNewest | OffsetOldest)").Default("-1").Int()
messageCountStart = kingpin.Flag("messageCountStart", "Message counter start from:").Int()
)
func main() {
kingpin.Parse()
config := sarama.NewConfig()
config.Consumer.Return.Errors = true
brokers := *brokerList
master, err := sarama.NewConsumer(brokers, config)
if err != nil {
panic(err)
}
defer func() {
if err := master.Close(); err != nil {
panic(err)
}
}()
consumer, err := master.ConsumePartition(*topic, 0, sarama.OffsetOldest)
if err != nil {
panic(err)
}
signals := make(chan os.Signal, 1)
signal.Notify(signals, os.Interrupt)
doneCh := make(chan struct{})
go func() {
for {
select {
case err := <-consumer.Errors():
fmt.Println(err)
case msg := <-consumer.Messages():
*messageCountStart++
fmt.Println("Received messages", string(msg.Key), string(msg.Value))
case <-signals:
fmt.Println("Interrupt is detected")
doneCh <- struct{}{}
}
}
}()
<-doneCh
fmt.Println("Processed", *messageCountStart, "messages")
}
我有个错误
panic: dial tcp: lookup host.docker.internal: no such host
goroutine 1 [running]:
main.main()
/Users/anonymous/go/src/pr1/kafka-consumer.go:37 +0x33b
exit status 2
请问哪里有问题?
1条答案
按热度按时间qojgxg4l1#
很简单,您的进程无法解析主机名
host.docker.internal
.在k8s上的pod中运行go程序
假设您的go程序在kubernetes集群上的容器中运行,您需要采取以下详细措施。
如果您使用kubernetes,应该有一个服务将kubernetes导出到集群的其余部分,通常在集群ip和主机名下
<servicename>.<namespace>.<clusterdomain>
.下面您可以看到如何实现这一点:
如您所见,我运行了一个cockroachdb,它的公共grpc端口通过10.110.105.151:26257可用,而它的http端口通过10.110.105.151:8080可用。
现在,我们如何找到我们的dns名称?
我们在同一个名称空间中部署了一个小助手。
首先,我们创建一个yaml文件bb.yaml
然后,我们将其应用于与要获取dns名称的服务相同的命名空间:
现在,我们可以通过以下方式找到您服务的dns全名:
(请注意,ip地址和dns名称在您的安装中显然可能不同)。
因此,我们应该能够通过“centraldb-cockroachdb-public.mynamespace.svc.cluster”访问蟑螂数据库。local:8080“从集群内部。
go程序在k8s外运行
在这里做什么在很大程度上取决于您的安装。如果您正在使用docker for desktop,我认为,最简单的方法是公开所讨论的部署:
这将使服务“centraldb cockroachdb public”的http端口通过localhost:9000:
现在,我们打开另一个外壳http://localhost:9000:
要使其永久化,您需要将服务类型更改为nodeport,或者使用kubernetes所称的“负载平衡器”。