我正在尝试使用群集中的SRV记录通过DNS实现对等发现逻辑。我已经准备好了无头服务和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行动书籍中找到了示例,但它是用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) { ...
答案 0 :(得分:0)
您似乎正在寻找无头的服务。
寻找示例实现: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驱动的客户端负载平衡器。
答案 1 :(得分:0)
感谢Shubham!我阅读了中篇文章,发现使用grpc建立与SRV的连接应以RR方式浏览所有IP。但是我仍在寻找获得所有IP的机会。
中篇文章: https://medium.com/google-cloud/loadbalancing-grpc-for-kubernetes-cluster-services-3ba9a8d8fc03
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)
我发现我的主要问题与此问题有关。
Why golang Lookup*** function can't provide a server parameter?