使用CoreDNS实现Kubernetes基于DNS的服务发现

栏目: 编程工具 · 发布时间: 6年前

内容简介:在Kubernetes集群推荐使用Service Name作为服务的访问地址,因此需要一个Kubernetes集群范围的DNS服务实现从Service Name到Cluster Ip的解析,这就是Kubernetes基于DNS的服务发现功能。在从Kubernetes 1.10开始Dynamic Kubelet Configuration特性进入beta阶段,kubelet的大多数命令行参数都改为推荐在其中clusterDNS指定了集群中所有容器将使用的DNS Server,即kubelet会在每个Pod内

1.Kubernetes基于DNS的服务发现

在Kubernetes集群推荐使用Service Name作为服务的访问地址,因此需要一个Kubernetes集群范围的DNS服务实现从Service Name到Cluster Ip的解析,这就是Kubernetes基于DNS的服务发现功能。

在从Kubernetes 1.10开始Dynamic Kubelet Configuration特性进入beta阶段,kubelet的大多数命令行参数都改为推荐在 --config 指定位置的配置文件中进行配置,包括 ---cluster-dns--cluster-domain 两个参数,在kubelet的配置文件中配置如下:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
......
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
......

其中clusterDNS指定了集群中所有容器将使用的DNS Server,即kubelet会在每个Pod内部设置DNS服务的地址为clusterDNS配置的地址。前面的配置中设置了Kubernetes集群访问内DNS服务器的地址是10.96.0.10,将由起完成Service Name到Cluster Ip的解析。有了这个配置,我们还需要在集群内部署DNS服务,DNS服务一般都是作为addon组件部署在Kubernetes集群内的。

2.Kubernetes DNS服务发展史

从Kubernetes 1.11开始,可使用CoreDNS作为Kubernetes的DNS插件进入GA状态,Kubernetes推荐使用CoreDNS作为集群内的DNS服务。 我们先看一下Kubernetes DNS服务的发展历程。

2.1 Kubernetes 1.3之前的版本 - skyDNS

Kubernetes 1.3之前的版本使用skyDNS作为DNS服务,这个有点久远了。Kubernetes的DNS服务由kube2sky、skyDNS、etcd组成。 kube2sky通过kube-apiserver监听集群中Service的变化,将生成的DNS记录信息更新到etcd中,而skyDNS将从etcd中获取数据对外提供DNS的查询服务。

2.2 Kubernetes 1.3版本开始 - kubeDNS

Kubernetes 1.3开始使用kubeDNS和dnsmasq替换了原来的kube2sky和skyDNS,不再使用etcd,而是将DNS记录直接存放在内存中,通过dnsmasq的缓存功能提高DNS的查询效率。下图是描述了Kubernetes使用kubeDNS实现服务发现的整体架构:

使用CoreDNS实现Kubernetes基于DNS的服务发现

2.3 Kubernetes 1.11版本开始 - CoreDNS进入GA

从Kubernetes 1.11开始,可使用CoreDNS作为Kubernetes的DNS插件进入GA状态,Kubernetes推荐使用CoreDNS作为集群内的DNS服务。 CoreDNS从2017年初就成为了CNCF的的孵化项目,CoreDNS的特点就是十分灵活和可扩展的插件机制,各种插件实现不同的功能,如重定向、定制DNS记录、记录日志等等。下图描述了CoreDNS的整体架构:

使用CoreDNS实现Kubernetes基于DNS的服务发现

3.Kubernetes配置使用CoreDNS

在Kubernetes中部署CoreDNS作为集群内的DNS服务有很多种方式,例如可以使用官方Helm Chart库中的helm chart部署,具体可查看 CoreDNS Helm Chart 。这里继承我们之前部署kubeDNS的传统,使用Kubernetes中addon库中的yaml文件部署,地址在这里 coredns addon

查看transforms2sed.sed的内容:

s/__PILLAR__DNS__SERVER__/$DNS_SERVER_IP/g
s/__PILLAR__DNS__DOMAIN__/$DNS_DOMAIN/g
s/__PILLAR__CLUSTER_CIDR__/$SERVICE_CLUSTER_IP_RANGE/g
s/__MACHINE_GENERATED_WARNING__/Warning: This is a file generated from the base underscore template file: __SOURCE_FILENAME__/g

$DNS_SERVER_IPDNS_DOMAIN 替换成kubelet配置的内容。这里将 $DNS_SERVER_IP 替换成 10.96.0.10 ,将 DNS_DOMAIN 替换成 cluster.local

执行下面的命令,生成部署coreDNS所需的coredns.yaml文件:

sed -f transforms2sed.sed coredns.yaml.base > coredns.yaml

对coredns.yaml做微调,如修改镜像地址为私有镜像仓库,调整副本数量等等。

kubectl delete -f kube-dns.yaml #删除原来的kubeDNS部署
kubectl apply -f coredns.yaml

查看coredns的Pod,确认所有Pod都处于Running状态:

kubectl get pods -n kube-system -l k8s-app=kube-dns
NAME                       READY     STATUS    RESTARTS   AGE
coredns-699477c54d-9fsl2   1/1       Running   0          5m
coredns-699477c54d-d6tb2   1/1       Running   0          5m
coredns-699477c54d-qh54v   1/1       Running   0          5m
coredns-699477c54d-vvqj9   1/1       Running   0          5m
coredns-699477c54d-xcv8h   1/1       Running   0          6m

测试一下DNS功能是否好用:

kubectl run curl --image=radial/busyboxplus:curl -i --tty

nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

DNS服务是Kubernetes赖以实现服务发现的核心组件之一,默认情况下只会创建一个DNS Pod,在生产环境中我们需要对coredns进行扩容。 有两种方式:

参考


以上所述就是小编给大家介绍的《使用CoreDNS实现Kubernetes基于DNS的服务发现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript & jQuery

JavaScript & jQuery

David Sawyer McFarland / O Reilly / 2011-10-28 / USD 39.99

You don't need programming experience to add interactive and visual effects to your web pages with JavaScript. This Missing Manual shows you how the jQuery library makes JavaScript programming fun, ea......一起来看看 《JavaScript & jQuery》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试