什么是服务发现
容器可以对其它容器提供服务,如mysql(数据库服务)、nginx、mangodb等等。这些服务都可以通过IP+Port方式访问。由于容器会经常重建迁移,所以IP会发生变化,如果调用服务的程序使用IP访问就会很不方便,为此可以使用DNS、zookeeper、etcd等技术实现服务访问与IP的解耦。这种解耦方式叫做服务发现。
版本
- Kubernetes v1.4.0
- kube-dns 1.9(image tag)
Kubernetes服务发现概述
- Kube-dns 以容器的形式为K8s集群提供DNS服务
- Etcd用于存储K8s中的服务、容器等信息,Kube-dns的数据也是从Etcd中获取的
- healthz 监控DNS Pod中的Kube-dns、dnsmasq容器
- dnsmasq以代理形式将外部访问转发给Kube-dns容器,走10053端口
Kube-dns
- miekg监听10053端口,接收dnsmasq转发过来的DNS请求
- KubeDNS中的Cache模块从Etcd中获取Service和Namespace信息,用户完成Service域名到Service地址的映射
- SkyDNS Server 完成DNS协议交互逻辑
该模块在KubeDNS启动时将自身注册到miekg中;并实现接口ServeDNS,当miekg收到DNS请求后,将调用该接口进行处理。 - KubeDNS中模块实现了backend接口
在ServeDNS处理DNS请求时,需要调用backend接口的Records和ReverseRecord method,backend接口会比对Cache中的内容,然后返回结果。