没有这样的主机,我通过端口转发连接到服务器上的kafka broker

qoefvg9y  于 2021-06-05  发布在  Kafka
关注(0)|答案(1)|浏览(418)

我有以下问题:我在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

请问哪里有问题?

qojgxg4l

qojgxg4l1#

很简单,您的进程无法解析主机名 host.docker.internal .

在k8s上的pod中运行go程序

假设您的go程序在kubernetes集群上的容器中运行,您需要采取以下详细措施。
如果您使用kubernetes,应该有一个服务将kubernetes导出到集群的其余部分,通常在集群ip和主机名下 <servicename>.<namespace>.<clusterdomain> .
下面您可以看到如何实现这一点:

$ kubectl --namespace=mynamespace get svc
NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)              AGE
centraldb-cockroachdb          ClusterIP   None             <none>        26257/TCP,8080/TCP   21d
centraldb-cockroachdb-public   ClusterIP   10.110.105.151   <none>        26257/TCP,8080/TCP   21d

$ kubectl get --namespace=mynamespace service centraldb-cockroachdb-public -o json | jq ".spec"
{
  "clusterIP": "10.110.105.151",
  "ports": [
    {
      "name": "grpc",
      "port": 26257,
      "protocol": "TCP",
      "targetPort": "grpc"
    },
    {
      "name": "http",
      "port": 8080,
      "protocol": "TCP",
      "targetPort": "http"
    }
  ],
  "selector": {
    "app.kubernetes.io/component": "cockroachdb",
    "app.kubernetes.io/instance": "centraldb",
    "app.kubernetes.io/name": "cockroachdb"
  },
  "sessionAffinity": "None",
  "type": "ClusterIP"
}

如您所见,我运行了一个cockroachdb,它的公共grpc端口通过10.110.105.151:26257可用,而它的http端口通过10.110.105.151:8080可用。
现在,我们如何找到我们的dns名称?
我们在同一个名称空间中部署了一个小助手。
首先,我们创建一个yaml文件bb.yaml

apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
  - image: busybox:latest
    command:
      - sleep
      - &quot;7200&quot;
    name: busybox
  restartPolicy: Always

然后,我们将其应用于与要获取dns名称的服务相同的命名空间:

$ kubectl --namespace=mynamespace apply -f bb.yaml 
pod/busybox created

现在,我们可以通过以下方式找到您服务的dns全名:

$ kubectl exec --namespace=mynamespace busybox -- nslookup centraldb-cockroachdb-public
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      centraldb-cockroachdb-public
Address 1: 10.110.105.151 centraldb-cockroachdb-public.mynamespace.svc.cluster.local

(请注意,ip地址和dns名称在您的安装中显然可能不同)。
因此,我们应该能够通过“centraldb-cockroachdb-public.mynamespace.svc.cluster”访问蟑螂数据库。local:8080“从集群内部。

go程序在k8s外运行

在这里做什么在很大程度上取决于您的安装。如果您正在使用docker for desktop,我认为,最简单的方法是公开所讨论的部署:

$ kubectl port-forward svc/$yourServiceName $localport:$serviceport

这将使服务“centraldb cockroachdb public”的http端口通过localhost:9000:

$ kubectl port-forward --namespace=mynamespace svc/centraldb-cockroachdb-public 9000:8080
Forwarding from 127.0.0.1:9000 -> 8080
Forwarding from [::1]:9000 -> 8080

现在,我们打开另一个外壳http://localhost:9000:

$ curl -sI  http://localhost:9000
HTTP/1.1 307 Temporary Redirect
Content-Type: text/html; charset=utf-8
Location: https://localhost:9000/
Date: Thu, 05 Mar 2020 12:17:09 GMT

要使其永久化,您需要将服务类型更改为nodeport,或者使用kubernetes所称的“负载平衡器”。

相关问题