k8s 服务发现 kubeDNS

k8s 服务发现 kubeDNS

  • 一、k8s 服务发现 kubeDNS
    • 1.1 kubeDNS
    • 1.2 服务发现类型
      • 1.2.1 基于环境变量的服务发现
      • 1.2.2 基于DNS的服务发现

一、k8s 服务发现 kubeDNS

1.1 kubeDNS

将传统的DNS服务直接提供一个云原生解决方案,他支持从apiserver动态加载相关的service及端点信息,并自动生成资源记录。
服务注册和发现的总线:KubeDNS,实现方案上,有三代:SkyDNS、KubeDNS、CoreDNS

1.2 服务发现类型

第一种是基于环境变量的服务发现
第二种是基于DNS的服务发现

1.2.1 基于环境变量的服务发现

  1. Kubernetes Service环境变量
    Kubernetes为每个Service资源生成包括以下形式的环境变量在内的一系列环境变量,在同一名称空间中创建的Pod对象都会自动拥有这些变量:
    {SVCNAME}_SERVICE_HOST
    {SVCNAME}_SERVICE_PORT
    这里的意思是,在同一命名空间下创建一个svc,在这个命名空间的下的和这个svc关联的pod内的容器内的环境变量中都会存在以上的环境变量。
    例:default名称空间:创建的demoapp Service,意味着default名称空间下的每个Pod内部会被自动注入DEMOAPP_SERVICE_HOST:ClusterIP, DEMOAPP_SERVICE_PORT=80。这些变量都在pod内的容器里env命令或printenv命令就可以看到

  2. Docker Link形式的环境变量
    Docker使用–link选项实现容器连接时所设置的环境变量形式,具体使用方式请参考Docker的相关文档。在创建Pod对象时,kubernetes也会把与此形式兼容的一系列环境变量注入到Pod对象中。

1.2.2 基于DNS的服务发现

基于DNS的服务发现,对于每个Service对象,都会在CoreDNS中生成具有以下3个类型的DNS资源记录。

  1. 根据ClusterIP的地址类型,为IPv4生成A记录,为IPv6生成AAAA记录;这个解析的是IP地址
    ..svc.. IN A
    ..svc.. IN AAAA
    例:demoapp.default.svc.cluster.local.
  1. (SVR记录)为每个定义了名称的端口生成一个SRV记录,未命名的端口号则不具有该记录;这个可以解析出端口
    ....svc.. IN SRV ..svc..

3.(PTR记录。解析service_ip->service_name) 对于每个给定的A记录(例如a.b.c.d)或AAAA记录(例如a1a2a3a4:b1b2b3b4:c1c2c3c4:d1d2d3d4:e1e2e3e4:f1f2f3f4:g1g2g3g4:h1h2h3h4)都要生成PTR记录,它们各自的格式如下所示:
....in-addr.arpa. IN PTR ..svc..
h4.h3.h2.h1.g4.g3.g2.g1.f4.f3.f2.f1.e4.e3.e2.e1.d4.d3.d2.d1.c4.c3.c2.c1.b4.b3.b2.b1.a4.a3.a2.a1.ip6.arpa IN PTR ..svc..
例如,前面在default名称空间中创建Service对象demoapp-svc的地址为10.97.72.1,且为TCP协议的80端口取名http,对于默认的cluster.local域名来说,此它会拥有如下3个DNS资源记录。
A记录:demoapp-svc.default.svc.cluster.local. 30 IN A 10.97.72.1;
SRV记录:_http._tcp.demoapp-svc.default.svc.cluster.local. 30 IN SRV 0 100 80 demoapp-svc.default.svc.cluster.local.
PTR记录:1.72.97.10.in-addr.arpa. 30 IN PTR demoapp-svc.default.svc.cluster.local.

Kubelet会为创建的每一个容器于/etc/resolv.conf配置文件中生成DNS查询客户端依赖到的必要配置,相关的配置信息源自于kubelet的配置参数,各容器的DNS服务器由clusterDNS参数的值设定,它的取值为kube-system名称空间中的Service对象kube-dns的ClusterIP,默认为10.96.0.10,而DNS搜索域的值由clusterDomain参数的值设定,若部署Kubernetes集群时未特别指定,其值将为cluster.local、svc.cluster.local和NAMESPACENAME.svc.cluster.local,
下面的示例取自集群上的一个随机选择的Pod中的容器/etc/resolv.conf文件中的内容。
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
上述search参数中指定的DNS各搜索域,是以次序指定的几个域名后缀,它们各自的如下所示。
.svc.:附带有特定名称空间的域名,例如default.svc.cluster.local;
svc. :附带了Kubernetes标识Service专用子域svc的域名,例如svc.cluster.local;
:集群本地域名,例如cluster.local。

你可能感兴趣的:(k8s,kubernetes)