k8s 服务发现 kubeDNS

本文详细介绍了Kubernetes中的服务发现机制,重点聚焦于kubeDNS。kubeDNS提供云原生DNS解决方案,支持动态加载Service和Endpoint信息。服务发现主要通过两种方式:基于环境变量和基于DNS。基于环境变量的方式,Kubernetes会为每个Service生成相应的环境变量;基于DNS的方式,kubeDNS会生成A/AAAA/SRV/PTR记录,便于服务查找。每个容器的/etc/resolv.conf配置文件确保了DNS查询功能,允许Pod内部通过DNS查找Service。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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。

Kubernetes中的DNS(Domain Name System)是用于解析服务名称到其对应的网络地址的核心组件。在Kubernetes集群中部署和配置DNS非常简单。 首先,确保Kubernetes集群已经成功部署并且kubectl命令可用。接下来,按照以下步骤进行DNS的配置和部署: 1. 创建kube-dns的YAML文件 通过创建一个名为kube-dns.yaml的YAML文件来定义kube-dns的Deployment和Service。在该文件中,需要指定kube-dns镜像的名称和版本,以及相关的部署和服务配置。示例kube-dns.yaml内容如下: ``` apiVersion: apps/v1 kind: Deployment metadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns spec: selector: matchLabels: k8s-app: kube-dns template: metadata: labels: k8s-app: kube-dns spec: containers: - name: kube-dns image: k8s.gcr.io/k8s-dns-kube-dns:1.15.0 # 更多配置 --- apiVersion: v1 kind: Service metadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns kubernetes.io/cluster-service: "true" kubernetes.io/name: "KubeDNS" spec: selector: k8s-app: kube-dns clusterIP: 10.96.0.10 ports: - name: dns port: 53 protocol: UDP ``` 2. 创建kube-dns对象 运行以下命令来创建kube-dns Deployment和Service: ``` kubectl create -f kube-dns.yaml ``` 3. 验证DNS是否正常工作 运行以下命令来验证DNS是否部署成功: ``` kubectl get pods --all-namespaces -l k8s-app=kube-dns ``` 如果看到kube-dns的Pod以Running状态运行,则表示DNS已经正常部署。 现在,Kubernetes集群中的所有服务都可以通过它们的服务名称进行解析。例如,如果有一个名为my-service的服务,可以使用my-service作为域名来访问它。 这就是在Kubernetes中配置和部署DNS的过程。DNS是Kubernetes中非常重要的一个组件,确保了服务之间的通信和发现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值