簡體   English   中英

使用 Kubernetes 集群 k8s 中的 SRV 記錄在 Golang 中通過 DNS 實現對等發現邏輯

[英]implement peer discovery logic through DNS in Golang using SRV records in Kubernetes cluster k8s

我正在嘗試使用集群中的 SRV 記錄通過 go 中的 DNS 實現對等發現邏輯。 我已經准備好無頭服務和 statefulset pod,我可以使用列出所有 SRV 記錄

kubectl run -it srvlookup --image=tutum/dnsutils --rm --restart=Never -- dig SRV demoapp.default.svc.cluster.local

但以下代碼在集群中不起作用:

func pingdns() (url string) {
log.Println("start ping demoapp.default.svc.cluster.local.")
_, addrs, err := net.LookupSRV("dns-tcp", "tcp", "demoapp.default.svc.cluster.local")
if err != nil {
    log.Println(err.Error())
    return "dns wrong"
}
fmt.Println(addrs)
return "dns done."

}

錯誤 output:

lookup _dns-tcp._tcp.demoapp.default.svc.cluster.local on 10.96.0.10:53: no such host

我在這本 k8s-in-action 書中找到了示例,但它是用 NodeJS 編寫的。 在 Golang 中如何實現?

const dns = require('dns');
const dataFile = "/var/data/kubia.txt";
const serviceName = "kubia.default.svc.cluster.local";
const port = 8080;
...
var handler = function(request, response) {
  if (request.method == 'POST') {
...
} else {
    response.writeHead(200);
    if (request.url == '/data') {
      var data = fileExists(dataFile)
        ? fs.readFileSync(dataFile, 'utf8')
        : "No data posted yet";
      response.end(data);
    } else {
      response.write("You've hit " + os.hostname() + "\n");
      response.write("Data stored in the cluster:\n");
      dns.resolveSrv(serviceName, function (err, addresses) {
The app performs a DNS lookup to obtain SRV records.
   if (err) {
  response.end("Could not look up DNS SRV records: " + err);
  return;
}
var numResponses = 0;
if (addresses.length == 0) {
  response.end("No peers discovered.");
} else {
addresses.forEach(function (item) { ...

看起來您正在尋找無頭服務。

查找示例實現: https://medium.com/google-cloud/loadbalancing-grpc-for-kubernetes-cluster-services-3ba9a8d8fc03

Kubernetes 文檔: https://kubernetes.io/docs/concepts/services-networking/service/#headless-services供您參考。

為了解釋這一點:Kubernetes 有一些服務實現,基本上是基於端點的服務和無頭服務。 基於端點的服務可以有或沒有選擇器。 LoadBalancer 通常由雲提供商提供。

無頭服務是為客戶端負載平衡實現而設計的。 看起來您正在嘗試實現自己的 DNS 驅動的客戶端負載均衡器。

謝謝舒巴姆。 我閱讀了中篇文章,發現使用 grpc 連接到 SRV 應該以 RR 方式瀏覽所有 IP。 但我仍在尋找獲取所有 IP。

中篇文章: https://medium.com/google-cloud/loadbalancing-grpc-for-kubernetes-cluster-services-3ba9a8d8fc03

Gitrepo: https://github.com/jtattermusch/grpc-loadbalancing-kubernetes-examples#example-1-round-robin-loadbalancing-with-grpcs-built-in-loadbalancing-policy

import (
   "google.golang.org/grpc/balancer/roundrobin"
   "google.golang.org/grpc/credentials"
)

conn, err := grpc.Dial("dns:///be-srv-lb.default.svc.cluster.local", grpc.WithTransportCredentials(ce), grpc.WithBalancerName(roundrobin.Name))
c := echo.NewEchoServerClient(conn)

它逐個調用 IP 列表。 RR

Creating channel with target greeter-server.default.svc.cluster.local:8000
Greeting: Hello you (Backend IP: 10.0.2.95)
Greeting: Hello you (Backend IP: 10.0.0.74)
Greeting: Hello you (Backend IP: 10.0.1.51)

我發現我的主要問題與這個問題有關。

為什么golang Lookup*** function 不能提供服務器參數?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM