K8s服务发现分析

什么是服务发现

容器可以对其它容器提供服务,如mysql(数据库服务)、nginx、mangodb等等。这些服务都可以通过IP+Port方式访问。由于容器会经常重建迁移,所以IP会发生变化,如果调用服务的程序使用IP访问就会很不方便,为此可以使用DNS、zookeeper、etcd等技术实现服务访问与IP的解耦。这种解耦方式叫做服务发现。

版本

  • Kubernetes v1.4.0
  • kube-dns 1.9(image tag)

Kubernetes服务发现概述

k8s-service-discovery.png

  • Kube-dns 以容器的形式为K8s集群提供DNS服务
  • Etcd用于存储K8s中的服务、容器等信息,Kube-dns的数据也是从Etcd中获取的
  • healthz 监控DNS Pod中的Kube-dns、dnsmasq容器
  • dnsmasq以代理形式将外部访问转发给Kube-dns容器,走10053端口

Kube-dns

k8s-kube-dns-analysis.png

  • 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中的内容,然后返回结果。

参考&鸣谢