kubernetes实践之六十四:CoreDNS
发表于:2025-12-04 作者:千家信息网编辑
千家信息网最后更新 2025年12月04日,一:简介1.Kubernetes包括用于服务发现的DNS服务器Kube-DNS。 该DNS服务器利用SkyDNS的库来为Kubernetes pod和服务提供DNS请求。SkyDNS2的作者,Miek
千家信息网最后更新 2025年12月04日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只需要使用下面的两个命令:
对于非RBAC部署,你需要编辑生成的结果yaml文件:
1.从yaml文件的Deployment部分删除 serviceAccountName: coredns
2.删除 ServiceAccount、 ClusterRole和 ClusterRoleBinding 部分
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
点击(此处)折叠或打开
- #!/bin/bash
- # Deploys CoreDNS to a cluster currently running Kube-DNS.
- show_help () {
- cat << USAGE
- usage: $0 [ -r REVERSE-CIDR ] [ -i DNS-IP ] [ -d CLUSTER-DOMAIN ] [ -t YAML-TEMPLATE ]
- -r : Define a reverse zone for the given CIDR. You may specifcy this option more
- than once to add multiple reverse zones. If no reverse CIDRs are defined,
- then the default is to handle all reverse zones (i.e. in-addr.arpa and ip6.arpa)
- -i : Specify the cluster DNS IP address. If not specificed, the IP address 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 -e s/CLUSTER_DNS_IP/$CLUSTER_DNS_IP/g -e s/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 部分
服务
服务器
文件
中间件
框架
集群
运行
两个
模型
组件
部分
不同
之间
作者
后手
命令
地址
域名
备注
官方
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
超星杯网络安全竟赛
原神国际版哪个服务器多人
关系型数据库表中的列称为
插画软件开发
网络安全链路讲解
陕西互联网养老软件开发专业制作
数据库原理与技术心得体会
数据库安全毕业论文选题
关于数据是数据库中存储的
怎么给服务器做系统
自己人网络技术有限公司
亚马逊服务器什么价格
服务器管理的服务和质量
医疗器械软件开发资料模板
软件开发女孩适合哪个
四六级报名官网未连接服务器
数据库系统题库
一诺365数据库连接失败
服务器租用公司
儿童网络安全创意短片
服务器防黑加固
怎么把文件路径存入数据库
软件开发专业哪些大学较好
网络安全设备维保费
信息安全和数据库管理
泰州市网络安全运营方案
c 泛型数据库
国家网络安全周宣传页
花点爱互联网科技怎么样
云服务器可以分析转录组数据吗