什么是 DNS SRV 记录?这么多年竟然没见过
什么是DNS SRV
看下面一段 dig 命令的返回, 主要就是多了端口信息
1 | ;; ANSWER SECTION: |
比如上面的信息中, 空格分隔的字段分别是
name: elixir-plug-poc.default.svc.cluster.local.
TTL: 30
class: IN
type: SRV
priority: 0
weight: 50 # priority 相同的情况下才会看 weight
port: 4000
target: elixir-plug-poc-0.elixir-plug-poc.default.svc.cluster.local. # 注意这个不能是CNAME, 即必须是A或AAAA
感觉这个 SRV 记录主要是以前的一些东西(XMPP, SIP之类的)需要用,
比如 _xmpp._tcp.example.com. 86400 IN SRV 10 5 5223 server.example.com.
看起来这个 SRV 就是用来做服务发现和负载均衡
DNS SRV 记录如何帮助 elixir 结点组成集群
kubernetes headless service 会创建 SRV 记录
libcluster(https://github.com/bitwalker/libcluster), 一个 elixir 的库, 使用 DNS SRV 策略来自动创建集群
测试用的 elixir-plug-poc.yaml
1 | apiVersion: v1 |
启动
1 | $ kubectl apply -f elixir-plug-poc.yaml |
进入 container 看一下
1 | kubectl -n default exec -it elixir-plug-poc-0 /bin/bash |
可以看出这两个结点确实组成了集群
1 | iex(elixir_plug_poc@elixir-plug-poc-0.elixir-plug-poc.default.svc.cluster.local)> Node.list |
再来看一下 DNS SRV 记录
1 | bash-5.0# hostname -f |
1 | kubectl exec elixir-plug-poc-0 -- nslookup elixir-plug-poc |
符合预期
参考链接
https://hexdocs.pm/libcluster/Cluster.Strategy.Kubernetes.DNSSRV.html