一、CoreDNS简介
Kubernetes包括用于服务发现的DNS服务器Kube-DNS。 该DNS服务器利用SkyDNS的库来为Kubernetes pod和服务提供DNS请求。SkyDNS2的作者,Miek Gieben,创建了一个新的DNS服务器,CoreDNS,它采用更模块化,可扩展的框架构建。 Infoblox已经与Miek合作,将此DNS服务器作为Kube-DNS的替代品。
CoreDNS利用作为Web服务器Caddy的一部分而开发的服务器框架。该框架具有非常灵活,可扩展的模型,用于通过各种中间件组件传递请求。这些中间件组件根据请求提供不同的操作,例如记录,重定向,修改或维护。虽然它一开始作为Web服务器,但是Caddy并不是专门针对HTTP协议的,而是构建了一个基于CoreDNS的理想框架。
在这种灵活的模型中添加对Kubernetes的支持,相当于创建了一个Kubernetes中间件。该中间件使用Kubernetes API来满足针对特定Kubernetes pod或服务的DNS请求。而且由于Kube-DNS作为Kubernetes的另一项服务,kubelet和Kube-DNS之间没有紧密的绑定。您只需要将DNS服务的IP地址和域名传递给kubelet,而Kubernetes并不关心谁在实际处理该IP请求。
二、CoreDNS支持的行为
1.0.0版本主要遵循Kube-DNS的当前行为。 CoreDNS的005及更高版本实现了完整的规范和更多功能。
- A记录(正常的Service分配了一个名为my-svc.my-namespace.svc.cluster.local的DNS A记录。 这解决了服务的集群IP)
- “headless”(没有集群IP)的Service也分配了一个名为my-svc.my-namespace.svc.cluster.local的DNS A记录。 与普通服务不同,这解决了Service选择了pods的一组IP。 客户预计将从这ip集合中消耗集合或使用标准循环选择。
- 针对名为正常或无头服务的端口创建的SRV记录,对于每个命名的端口,SRV记录的格式为_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local。对于常规服务,这将解析为端口号和CNAME:my-svc.my-namespace.svc.cluster.local;对于无头服务,这解决了多个答案,一个用于支持服务的每个pod,并包含端口号还有格式为auto-generated-name.my-svc.my-namespace.svc.cluster.local 的pod的CNAME 。SRV记录包含它们中的“svc”段,对于省略“svc”段的旧式CNAME不支持。
- 作为Service一部分的endpoints的A记录(比如“pets”的记录)
- pod的Spec中描述的A记录
- 还有就是用来发现正在使用的DNS模式版本的TXT记录
所有群集中不需要pod A记录支持,默认情况下禁用。 此外,CoreDNS对此用例的支持超出了在Kube-DNS中找到的标准行为。
在Kube-DNS中,这些记录不反映集群的状态,例如,对w-x-y-z.namespace.pod.cluster.local的任何查询将返回带有w.x.y.z(ip)的A记录,即使该IP不属于指定的命名空间,甚至不属于集群地址空间。最初的想法是启用对* .namespace.pod.cluster.local这样的域使用通配符SSL证书。
CoreDNS集成了提供pod验证的选项,验证返回的IP地址w.x.y.z实际上是指定命名空间中的pod的IP。他防止在命名空间中欺骗DNS名称。 然而,它确实会大大增加CoreDNS实例的内存占用,因为现在它需要观察所有的pod,而不仅仅是服务端点。
三、在kubernetes中部署coredns
1、下载coredns部署包:
https://github.com/coredns/deployment/tree/master/kubernetes
主要有几个文件:
deploy.sh是一个便捷的脚本,用于生成用于在当前运行标准kube-dns的集群上运行CoreDNS的清单。使用coredns.yaml.sed文件作为模板,它创建一个ConfigMap和一个CoreDNS deployment,然后更新 Kube-DNS service selector以使用CoreDNS deployment。 通过重新使用现有服务,服务请求不会中断。
脚本不会删除kube-dns的deployment或replication controller - 您必须手动执行:
kubectl delete --namespace=kube-system deployment kube-dns
要使用它,只需将它们放在同一目录中,然后运行deploy.sh脚本,将其传递给您的服务CIDR(10.3.0.0/24)。 这将生成具有必要Corefile的ConfigMap。 它还将查找现有的kube-dns服务的集群IP。 例如,运行:
./deploy.sh 10.3.0.0/24 cluster.local
其实就是将10.3.0.0/24和cluster.local替换掉coredns.yaml.sed里面的变量。
执行脚本前coredns.yaml.sed的内容如下(红色部分的内容脚本执行后会被替换掉):
apiVersion: v1kind: ConfigMapmetadata: ?name: coredns ?namespace: kube-systemdata: ?Corefile: | ???.:53 { ???????errors ???????log stdout ???????health ???????kubernetes CLUSTER_DOMAIN SERVICE_CIDR ???????proxy . /etc/resolv.conf ???????cache 30 ???}---apiVersion: extensions/v1beta1kind: Deploymentmetadata: ?name: coredns ?namespace: kube-system ?labels: ???k8s-app: coredns ???kubernetes.io/cluster-service: "true" ???kubernetes.io/name: "CoreDNS"spec: ?replicas: 1 ?selector: ???matchLabels: ?????k8s-app: coredns ?template: ???metadata: ?????labels: ???????k8s-app: coredns ?????annotations: ???????scheduler.alpha.kubernetes.io/critical-pod: ‘‘ ???????scheduler.alpha.kubernetes.io/tolerations: ‘[{"key":"CriticalAddonsOnly", "operator":"Exists"}]‘ ???spec: ?????containers: ?????- name: coredns ???????image: coredns/coredns:latest ???????imagePullPolicy: Always ???????args: [ "-conf", "/etc/coredns/Corefile" ] ???????volumeMounts: ???????- name: config-volume ?????????mountPath: /etc/coredns ???????ports: ???????- containerPort: 53 ?????????name: dns ?????????protocol: UDP ???????- containerPort: 53 ?????????name: dns-tcp ?????????protocol: TCP ???????livenessProbe: ?????????httpGet: ???????????path: /health ???????????port: 8080 ???????????scheme: HTTP ?????????initialDelaySeconds: 60 ?????????timeoutSeconds: 5 ?????????successThreshold: 1 ?????????failureThreshold: 5 ?????dnsPolicy: Default ?????volumes: ???????- name: config-volume ?????????configMap: ???????????name: coredns ???????????items: ???????????- key: Corefile ?????????????path: Corefile---apiVersion: v1kind: Servicemetadata: ?name: kube-dns ?namespace: kube-system ?labels: ???k8s-app: coredns ???kubernetes.io/cluster-service: "true" ???kubernetes.io/name: "CoreDNS"spec: ?selector: ???k8s-app: coredns ?clusterIP: CLUSTER_DNS_IP ?ports: ?- name: dns ???port: 53 ???protocol: UDP ?- name: dns-tcp ???port: 53 ???protocol: TCP
CoreDNS for kubernetes Service Discovery
原文地址:http://www.cnblogs.com/boshen-hzb/p/7511432.html