реализовать логики обнаружения одноранговых узлов c через DNS в Golang с использованием записей SRV в кластере Kubernetes k8s - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь реализовать логи обнаружения одноранговых узлов c через DNS в go с использованием записей SRV в кластере. У меня есть готовые модули безголового сервиса и statefulset, и я могу перечислить все записи 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."

}

вывод ошибок:

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) { ...

Ответы [ 2 ]

0 голосов
/ 13 мая 2020

Спасибо, Шубхам! Я прочитал средний пост и обнаружил, что использование grp c для подключения к SRV должно просматривать все IP-адреса как RR. Но я все еще ищу все 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 *** не может предоставить параметр сервера?

0 голосов
/ 05 мая 2020

Похоже, вы ищете безголовый сервис.

Найдите пример реализации: https://medium.com/google-cloud/loadbalancing-grpc-for-kubernetes-cluster-services-3ba9a8d8fc03

Документация Kubernetes: https://kubernetes.io/docs/concepts/services-networking/service/#headless -services для справки.

Чтобы объяснить это: Kubernetes имеет несколько реализаций для сервисов, в основном сервис на основе конечных точек и сервис без головы. Сервисы на основе конечных точек могут быть как с селекторами, так и без них. LoadBalancers обычно предоставляются облачными провайдерами.

Безголовый сервис предназначен для реализации балансировки нагрузки на стороне клиента. Похоже, вы пытаетесь реализовать собственный балансировщик нагрузки на стороне клиента, управляемый DNS.

...