k8s 服务发现 kubeDNS

一、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地址
    <service>.<ns>.svc.<zone>. <ttl> IN A <cluster-ip>
    <service>.<ns>.svc.<zone>. <ttl> IN AAAA <cluster-ip>
    例:demoapp.default.svc.cluster.local.
  1. (SVR记录)为每个定义了名称的端口生成一个SRV记录,未命名的端口号则不具有该记录;这个可以解析出端口
    <port>.<proto>.<service>.<ns>.svc.<zone>. <ttl> IN SRV <weight> <priority> <port-number> <service>.<ns>.svc.<zone>.

3.(PTR记录。解析service_ip->service_name) 对于每个给定的A记录(例如a.b.c.d)或AAAA记录(例如a1a2a3a4:b1b2b3b4:c1c2c3c4:d1d2d3d4:e1e2e3e4:f1f2f3f4:g1g2g3g4:h1h2h3h4)都要生成PTR记录,它们各自的格式如下所示:
<d>.<c>.<b>.<a>.in-addr.arpa. <ttl> IN PTR <service>.<ns>.svc.<zone>.
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 <ttl> IN PTR <service>.<ns>.svc.<zone>.
例如,前面在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各搜索域,是以次序指定的几个域名后缀,它们各自的如下所示。
<ns>.svc.<zone>:附带有特定名称空间的域名,例如default.svc.cluster.local;
svc. <zone>:附带了Kubernetes标识Service专用子域svc的域名,例如svc.cluster.local;
<zone>:集群本地域名,例如cluster.local。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值