服务发现机制
任何分布式系统都涉及“服务发现”这个基础问题,大部分分布式系统都通过提供特定的API接口来实现服务发现功能,但这样做会导致平台的侵入性比较强,也增加了开发、测试的难度。
Kubernetes通过引入DNS系统,把服务名作为DNS域名,这样程序就可以直接使用服务名来建立通信连接了。
CoreDNS
CoreDNS支持自定义DNS记录及配置upstream DNS Server,可以统一管理Kubernetes基于服务的内部DNS和数据中心的物理DNS。CoreDNS 的 Service 地址一般情况下是固定的,地址是 10.96.0.10,该 IP 被分配后,kubelet 会将信息传递给每个容器。
#指定集群DNS信息
修改每个Node上kubelet的启动参数,可定义DNS信息:
- —cluster-dns=169.169.0.100 #DNS服务的ClusterIP地址
- —cluster-domain=cluster.local #在DNS服务中设置的域名
重启kubelet服务,再重启 CoreDNS Pod 使其配置生效。
CoreDns默认配置
$ kubectl get cm coredns -n kube-system -o yamlapiVersion: v1data:Corefile: |.:53 {errors # 启用错误记录health # 启用检查检查端点,8080:healthreadykubernetes cluster.local in-addr.arpa ip6.arpa { # 处理 k8s 域名解析pods insecurefallthrough in-addr.arpa ip6.arpattl 30}prometheus :9153 # 启用 prometheus metrics 指标,9153:metricsforward . /etc/resolv.conf # 通过 resolv.conf 内的 nameservers 解析cache 30 # 启用缓存,所有内容限制为 30s 的TTLloop # 检查简单的转发循环并停止服务reload # 运行自动重新加载 corefile,热更新loadbalance # 负载均衡,默认 round_robin}kind: ConfigMapmetadata:creationTimestamp: "2021-11-08T11:59:49Z"name: corednsnamespace: kube-systemresourceVersion: "188"selfLink: /api/v1/namespaces/kube-system/configmaps/corednsuid: 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
......
