服务发现机制

任何分布式系统都涉及“服务发现”这个基础问题,大部分分布式系统都通过提供特定的API接口来实现服务发现功能,但这样做会导致平台的侵入性比较强,也增加了开发、测试的难度。

Kubernetes通过引入DNS系统,把服务名作为DNS域名,这样程序就可以直接使用服务名来建立通信连接了。

CoreDNS

CoreDNS支持自定义DNS记录及配置upstream DNS Server,可以统一管理Kubernetes基于服务的内部DNS和数据中心的物理DNS。CoreDNS 的 Service 地址一般情况下是固定的,地址是 10.96.0.10,该 IP 被分配后,kubelet 会将信息传递给每个容器。image.png

#指定集群DNS信息
修改每个Node上kubelet的启动参数,可定义DNS信息:

  • —cluster-dns=169.169.0.100 #DNS服务的ClusterIP地址
  • —cluster-domain=cluster.local #在DNS服务中设置的域名

重启kubelet服务,再重启 CoreDNS Pod 使其配置生效。

CoreDns默认配置

  1. $ kubectl get cm coredns -n kube-system -o yaml
  2. apiVersion: v1
  3. data:
  4. Corefile: |
  5. .:53 {
  6. errors # 启用错误记录
  7. health # 启用检查检查端点,8080:health
  8. ready
  9. kubernetes cluster.local in-addr.arpa ip6.arpa { # 处理 k8s 域名解析
  10. pods insecure
  11. fallthrough in-addr.arpa ip6.arpa
  12. ttl 30
  13. }
  14. prometheus :9153 # 启用 prometheus metrics 指标,9153:metrics
  15. forward . /etc/resolv.conf # 通过 resolv.conf 内的 nameservers 解析
  16. cache 30 # 启用缓存,所有内容限制为 30s 的TTL
  17. loop # 检查简单的转发循环并停止服务
  18. reload # 运行自动重新加载 corefile,热更新
  19. loadbalance # 负载均衡,默认 round_robin
  20. }
  21. kind: ConfigMap
  22. metadata:
  23. creationTimestamp: "2021-11-08T11:59:49Z"
  24. name: coredns
  25. namespace: kube-system
  26. resourceVersion: "188"
  27. selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
  28. uid: 21966186-c2d9-467a-b87f-d061c5c9e4d7

说明:

  • 每个 {} 代表一个 zone ,格式 “Zone:port{}” , 其中 “.“ 代表默认 zone
  • {} 内的一个名称代表一个插件,当解析域名时,会先匹配 zone ,然后 zone 内的插件从上到下依次执行(此顺序不是配置文件内的顺序,而是core/dnsserver/zdirectives.go内的顺序)。
$ cat /var/lib/kubelet/config.yaml
......
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
......