一、介绍
在Kubernetes 1.11中,CoreDNS已经实现了基于DNS的服务发现的GA,可作为kube-dns插件的替代品。这意味着CoreDNS将作为各种安装工具未来发布版本中的一个选项来提供。事实上,kubeadm团队选择将其作为Kubernetes 1.11的默认选项。
使用kube-dns集群插件,基于DNS的服务发现已成为Kubernetes的一部分。这通常很有效,但是对于实施的可靠性、灵活性和安全性存在一些担忧。
CoreDNS是一个通用的、权威的DNS服务器,提供与Kubernetes后向兼容但可扩展的集成。它解决了kube-dns所遇到的问题,并提供了许多独特的功能,可以解决各种各样的用例。
在本文中,你将了解kube-dns和CoreDNS的实施差异,以及CoreDNS提供的一些有用的扩展。
二、实施差异
在kube-dns中,一个pod内使用了数个容器:kubedns、dnsmasq和sidecar。 kubedns容器监视Kubernetes API并基于Kubernetes DNS规范提供DNS记录,dnsmasq提供缓存和存根域支持,sidecar提供指标和健康检查。
此设置会导致一些问题随着时间的推移而出现。首先,dnsmasq中的安全漏洞导致过去需要发布Kubernetes安全补丁。此外,由于dnsmasq处理存根域,但kubedns处理External Services,因此你无法在外部服务中使用存根域,这非常限制该功能。
在CoreDNS中,所有这些功能都在一个容器中完成——该容器运行用Go编写的进程。启用的不同插件来复制(并增强)kube-dns中的功能。
三、安装core-dns
1、将$DNS_SERVER_IP和$DNS_DOMAIN替换成kubelet配置的内容
[root@k8s-node1 cfg]# cat kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 192.168.100.30
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.0.0.2
clusterDomain: cluster.local.
failSwapOn: false
authentication:
anonymous:
enabled: true
2、这里将$DNS_SERVER_IP替换成10.0.0.2,将$DNS_DOMAIN替换成cluster.local.
[root@k8s-master1 coredns]# vim ./transforms2sed.sed
s/__PILLAR__DNS__SERVER__/10.0.0.2/g
s/__PILLAR__DNS__DOMAIN__/cluster.local./g
s/__PILLAR__CLUSTER_CIDR__/$SERVICE_CLUSTER_IP_RANGE/g
s/__PILLAR__DNS__MEMORY__LIMIT__/$DNS_MEMORY_LIMIT/g
s/__MACHINE_GENERATED_WARNING__/Warning: This is a file generated from the base underscore template file: __SOURCE_FILENAME__/g
3、执行下面的命令,生成部署coreDNS所需的coredns.yaml文件
[root@k8s-master1 dns]# cd cluster/addons/dns/coredns
[root@k8s-master1 coredns]# ls
coredns.yaml.base coredns.yaml.sed transforms2salt.sed
coredns.yaml.in Makefile transforms2sed.sed
[root@k8s-master1 coredns]# sed -f transforms2sed.sed coredns.yaml.base > coredns.yaml
4、替换镜像,将k8s.gcr.io/coredns:1.2.6替换成coredns/coredns:1.2.6
[root@k8s-master1 coredns]# vim coredns.yaml
118 - name: coredns
119 image: coredns/coredns:1.2.6 #替换
120 imagePullPolicy: IfNotPresent
121 resources:
122 limits:
123 memory: 100Mi #修改
124 requests:
125 cpu: 100m
126 memory: 70Mi
[root@k8s-master1 coredns]# kubectl create -f coredns.yaml
5、修改各个节点的dns
[root@k8s-node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32
DNS2=10.0.0.2
[root@k8s-node1 ~]# systemctl restart network
[root@k8s-node1 ~]# nslookup mydb.default.svc.cluster.local
;; Got SERVFAIL reply from 192.168.100.55, trying next server
Server:10.0.0.2
Address:10.0.0.2#53
Name:mydb.default.svc.cluster.local
Address: 10.0.0.12