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只需要使用下面的两个命令:
4.deploy.sh(https://github.com/coredns/deployment/tree/master/kubernetes)
5.coredns.yaml.sed
三:备注
对于非RBAC部署,你需要编辑生成的结果yaml文件:
1.从yaml文件的Deployment部分删除 serviceAccountName: coredns
2.删除 ServiceAccount、 ClusterRole和 ClusterRoleBinding 部分
分享文章:kubernetes实践之六十四:CoreDNS
文章网址:http://azwzsj.com/article/ihdcih.html
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。
点击(此处)折叠或打开
成都创新互联公司专注于翁源企业网站建设,响应式网站设计,成都商城网站开发。翁源网站建设公司,为翁源等地区提供建站服务。全流程定制设计,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务
-
$./deploy.sh | kubectl apply -f -
- $ kubectl delete --namespace=kube-system deployment kube-dns
点击(此处)折叠或打开
-
#!/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
点击(此处)折叠或打开
-
apiVersion: v1
-
kind: ServiceAccount
-
metadata:
-
name: coredns
-
namespace: kube-system
-
---
-
apiVersion: rbac.authorization.k8s.io/v1beta1
-
kind: ClusterRole
-
metadata:
-
labels:
-
kubernetes.io/bootstrapping: rbac-defaults
-
name: system:coredns
-
rules:
-
- apiGroups:
-
-""
-
resources:
-
- endpoints
-
- services
-
- pods
-
- namespaces
-
verbs:
-
- list
-
- watch
-
---
-
apiVersion: rbac.authorization.k8s.io/v1beta1
-
kind: ClusterRoleBinding
-
metadata:
-
annotations:
-
rbac.authorization.kubernetes.io/autoupdate: "true"
-
labels:
-
kubernetes.io/bootstrapping: rbac-defaults
-
name: system:coredns
-
roleRef:
-
apiGroup: rbac.authorization.k8s.io
-
kind: ClusterRole
-
name: system:coredns
-
subjects:
-
- kind: ServiceAccount
-
name: coredns
-
namespace: kube-system
-
---
-
apiVersion: v1
-
kind: ConfigMap
-
metadata:
-
name: coredns
-
namespace: kube-system
-
data:
-
Corefile: |
-
.:53{
-
errors
-
health
-
kubernetes CLUSTER_DOMAIN REVERSE_CIDRS{
-
pods insecure
-
upstream
-
fallthrough in-addr.arpa ip6.arpa
-
}
-
prometheus:9153
-
proxy. /etc/resolv.conf
-
cache 30
-
reload
-
}
-
---
-
apiVersion: extensions/v1beta1
-
kind: Deployment
-
metadata:
-
name: coredns
-
namespace: kube-system
-
labels:
-
k8s-app: kube-dns
-
kubernetes.io/name: "CoreDNS"
-
spec:
-
replicas: 2
-
strategy:
-
type: RollingUpdate
-
rollingUpdate:
-
maxUnavailable: 1
-
selector:
-
matchLabels:
-
k8s-app: kube-dns
-
template:
-
metadata:
-
labels:
-
k8s-app: kube-dns
-
spec:
-
serviceAccountName: coredns
-
tolerations:
-
- key: "CriticalAddonsOnly"
-
operator: "Exists"
-
containers:
-
- name: coredns
-
image: coredns/coredns:1.1.3
-
imagePullPolicy: IfNotPresent
-
args: ["-conf", "/etc/coredns/Corefile" ]
-
volumeMounts:
-
- name: config-volume
-
mountPath: /etc/coredns
-
readOnly: true
-
ports:
-
- containerPort: 53
-
name: dns
-
protocol: UDP
-
- containerPort: 53
-
name: dns-tcp
-
protocol: TCP
-
- containerPort: 9153
-
name: metrics
-
protocol: TCP
-
securityContext:
-
allowPrivilegeEscalation: false
-
capabilities:
-
add:
-
- NET_BIND_SERVICE
-
drop:
-
-all
-
readOnlyRootFilesystem: true
-
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: v1
-
kind: Service
-
metadata:
-
name: kube-dns
-
namespace: kube-system
-
annotations:
-
prometheus.io/scrape: "true"
-
labels:
-
k8s-app: kube-dns
-
kubernetes.io/cluster-service: "true"
-
kubernetes.io/name: "CoreDNS"
-
spec:
-
selector:
-
k8s-app: kube-dns
-
clusterIP: CLUSTER_DNS_IP
-
ports:
-
- name: dns
-
port: 53
-
protocol: UDP
-
- name: dns-tcp
-
port: 53
- protocol: TCP
对于非RBAC部署,你需要编辑生成的结果yaml文件:
1.从yaml文件的Deployment部分删除 serviceAccountName: coredns
2.删除 ServiceAccount、 ClusterRole和 ClusterRoleBinding 部分
分享文章:kubernetes实践之六十四:CoreDNS
文章网址:http://azwzsj.com/article/ihdcih.html