kubernetes实践之六十四:CoreDNS
一:简介1.Kubernetes包括用于服务发现的DNS
服务器Kube-DNS。 该DNS服务器利用SkyDNS的库来为Kubernetes pod和服务提供DNS请求。SkyDNS2的作者,Miek Gieben,创建了一个新的DNS服务器,CoreDNS,它采用更模块化,可扩展的框架构建。 Infoblox已经与Miek合作,将此DNS服务器作为Kube-DNS的替代品。
2.CoreDNS利用作为Web服务器Caddy的一部分而开发的服务器框架。该框架具有非常灵活,可扩展的模型,用于通过各种中间件组件传递请求。这些中间件组件根据请求提供不同的操作,例如记录,重定向,修改或维护。虽然它一开始作为Web服务器,但是Caddy并不是专门针对HTTP协议的,而是构建了一个基于CoreDNS的理想框架。
3.在这种灵活的模型中添加对Kubernetes的支持,相当于创建了一个Kubernetes中间件。该中间件使用Kubernetes API来满足针对特定Kubernetes pod或服务的DNS请求。而且由于Kube-DNS作为Kubernetes的另一项服务,kubelet和Kube-DNS之间没有紧密的绑定。您只需要将DNS服务的IP地址和域名传递给kubelet,而Kubernetes并不关心谁在实际处理该IP请求。
4.CoreDNS可以在具有标准的Kube-DNS的Kubernetes集群中运行。作为Kubernetes 的插件使用,CoreDNS将从 Kubernetes集群中读取区(zone)数据。它实现了为Kubernetes的DNS服务发现定义的规范:Kubernetes DNS-Based Service Discovery。
二:部署部署CoreDNS需要使用到官方提供的两个文件 deploy.sh和coredns.yaml.sed
1.deploy.sh 是一个用于在已经运行kube-dns的集群中生成运行CoreDNS部署文件(manifest)的工具脚本。它使用 coredns.yaml.sed文件作为模板,创建一个ConfigMap和CoreDNS的deployment,然后更新集群中已有的kube-dns 服务的selector使用CoreDNS的deployment。重用已有的服务并不会在服务的请求中发生冲突。
2.deploy.sh文件并不会删除kube-dns的deployment或者replication controller。如果要删除kube-dns,你必须在部署CoreDNS后手动的删除kube-dns。
3.使用CoreDNS替换Kube-DNS只需要使用下面的两个命令:
-
$./deploy.sh | kubectl apply -f -
-
$ kubectl delete --namespace=kube-system deployment kube-dns
4.deploy.sh(https://github.com/coredns/deployment/tree/master/kubernetes)
-
#!/bin/bash
-
-
# Deploys CoreDNS toa cluster currently running Kube-DNS.
-
-
show_help() {
-
cat << USAGE
-
usage: $0 [ -r REVERSE-CIDR ] [ -i DNS-IP ] [ -d CLUSTER-DOMAIN ] [ -t YAML-TEMPLATE ]
-
-r: Definea reverse zone for the given CIDR. You may specifcy thisoption more
-
thanonce to add multiple reverse zones. If no reverse CIDRs are defined,
-
then thedefault is to handleall reverse zones(i.e. in-addr.arpa and ip6.arpa)
-
-i : Specify the cluster DNS IPaddress. If not specificed, the IPaddress of
-
the existing"kube-dns" service is used, if present.
-
USAGE
-
exit 0
-
}
-
-
# Simple Defaults
-
CLUSTER_DOMAIN=cluster.local
-
YAML_TEMPLATE=`pwd`/coredns.yaml.sed
-
-
-
# Get Opts
-
while getopts"hr:i:d:t:" opt; do
-
case"$opt" in
-
h) show_help
-
;;
-
r) REVERSE_CIDRS="$REVERSE_CIDRS $OPTARG"
-
;;
-
i) CLUSTER_DNS_IP=$OPTARG
-
;;
-
d) CLUSTER_DOMAIN=$OPTARG
-
;;
-
t) YAML_TEMPLATE=$OPTARG
-
;;
-
esac
-
done
-
-
# Conditional Defaults
-
if [[ -z $REVERSE_CIDRS ]]; then
-
REVERSE_CIDRS="in-addr.arpa ip6.arpa"
-
fi
-
if [[ -z $CLUSTER_DNS_IP ]]; then
-
#Default IP to kube-dns IP
-
CLUSTER_DNS_IP=$(kubectl get service --namespace kube-system kube-dns -o jsonpath="{.spec.clusterIP}")
-
if [ $? -ne 0 ]; then
-
>&2 echo"Error! The IP address for DNS service couldn't be determined automatically. Please specify the DNS-IP with the '-i' option."
-
exit 2
-
fi
-
fi
-
-
sed -es/CLUSTER_DNS_IP/$CLUSTER_DNS_IP/g -es/CLUSTER_DOMAIN/$CLUSTER_DOMAIN/g -e"s?REVERSE_CIDRS?$REVERSE_CIDRS?g" $YAML_TEMPLATE
5.coredns.yaml.sed
三:备注对于非RBAC部署,你需要编辑生成的结果yaml文件:
1.从yaml文件的Deployment部分删除 serviceAccountName: coredns
2.删除 ServiceAccount、 ClusterRole和 ClusterRoleBinding 部分
分享文章:kubernetes实践之六十四:CoreDNS
本文来源:
http://kswjz.com/article/ihdcih.html
扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流