尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Kubernetes 集群中 CoreDNS 的部署与配置:从 kube-dns 平滑迁移的完整指南

Kubernetes 集群中 CoreDNS 的部署与配置:从 kube-dns 平滑迁移的完整指南 教程云原生容器编排【免费下载链接】kubernetes-handbookKubernetes 架构与生态从云原生到 AI 原生基础设施的构建指南项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-handbook点击查看免费下载CoreDNS 是 CNCF 托管的开源 DNS 服务器可作为 Kubernetes 集群的标准 DNS 插件运行实现 Kubernetes DNS-Based Service Discovery 规范所定义的域名解析能力。本文基于当前仓库中 practice/coredns.md 的部署方案结合仓库内 manifests/coredns 目录下的官方部署脚本与 manifest 模板源码完整讲解如何在使用 kube-dns 的既有集群中生成并部署 CoreDNS、如何安全地移除 kube-dns以及部署后如何验证与排查 DNS 解析问题帮助你掌握一条可复制、可回退的平滑迁移路径。CoreDNS 与 kube-dns为什么需要迁移在 Kubernetes 集群中DNS 组件承担着服务注册与发现的核心职责通过将 Service 注册到 DNS集群内的 Pod 可以直接使用服务名如my-svc.my-namespace.svc.cluster.local访问其他服务无需关心后端的 ClusterIP 与端点变化。仓库文档 practice/dns-installation.md 明确指出DNS 是服务注册和发现的一个必要组件通常是在集群安装完成后部署的第一个容器化应用。传统上集群默认使用kube-dns插件其 Pod 内含三个容器kubedns监听 Kubernetes master 中 Service 和 Endpoint 的变化维护内存查找结构来服务 DNS 请求dnsmasq提供 DNS 缓存以提升解析性能sidecar提供单一健康检查端点监听 10054 端口对dnsmasq和kubedns执行双重健康检查。而 CoreDNS 作为 CNCF 托管项目用单一二进制进程即可同时承担区域数据读取、缓存、上游代理与指标暴露等全部职责架构更简单。在 Kubernetes 1.9 版本中使用 kubeadm 方式安装的集群可以通过kubeadm init --feature-gatesCoreDNStrue直接启用 CoreDNS详见 practice/configuring-dns.md对于已经运行 kube-dns 的存量集群则可以采用本文介绍的方式平滑替换。CoreDNS 作为 Kubernetes 插件运行时会从 Kubernetes 集群中读取区zone数据完整实现 Kubernetes DNS-Based Service Discovery 规范定义的 A 记录、SRV 记录、PTR 反向解析等能力包括 Service 域名my-svc.my-namespace.svc.cluster.local、命名端口 SRV 记录_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local、Pod 域名pod-ip.my-namespace.pod.cluster.local等解析规则。部署前的准备两份关键文件部署 CoreDNS 需要两份官方文件它们已随仓库放入manifests/coredns目录文件作用manifests/coredns/deploy.sh用于在已运行 kube-dns 的集群中生成 CoreDNS 部署清单manifest的工具脚本manifests/coredns/coredns.yaml.sed部署清单模板内含CLUSTER_DNS_IP、CLUSTER_DOMAIN、REVERSE_CIDRS三个占位符由脚本替换后输出最终 YAML这两份文件协同工作的完整流程为deploy.sh以coredns.yaml.sed为模板通过sed命令将占位符替换为实际集群参数生成一个 ConfigMap存放 Corefile 配置和 CoreDNS 的 Deployment更新集群中已有的kube-dnsService 的 selector使其指向 CoreDNS 的 Deployment由于复用了既有的kube-dnsService包括其 ClusterIPPod 中原有的 DNS 配置无需任何改动即可继续工作服务请求不会发生冲突。需要特别注意的是deploy.sh不会删除 kube-dns 的 Deployment 或 ReplicationController。删除 kube-dns 是部署 CoreDNS 之后的独立手工步骤。deploy.sh 脚本解析参数与替换逻辑从 manifests/coredns/deploy.sh 的源码可以看到脚本支持以下命令行参数usage: deploy.sh [ -r REVERSE-CIDR ] [ -i DNS-IP ] [ -d CLUSTER-DOMAIN ] [ -t YAML-TEMPLATE ]参数含义默认值-r REVERSE-CIDR为给定 CIDR 定义反向解析区域reverse zone可多次指定以添加多个反向区域若未指定任何反向 CIDR则默认处理全部反向区域in-addr.arpa ip6.arpa-i DNS-IP指定集群 DNS 的 Service IP若未指定则自动读取现有kube-dnsService 的 ClusterIP自动探测-d CLUSTER-DOMAIN指定集群域名cluster.local-t YAML-TEMPLATE指定 YAML 模板文件路径当前目录下的coredns.yaml.sed脚本的关键逻辑对应 manifests/coredns/deploy.sh当未通过-i指定 DNS IP 时脚本执行kubectl get service --namespace kube-system kube-dns -o jsonpath{.spec.clusterIP}自动获取既有 kube-dns 服务的 ClusterIP若获取失败则报错提示必须通过-i显式指定最终通过sed完成三处占位符替换s/CLUSTER_DNS_IP/$CLUSTER_DNS_IP/g、s/CLUSTER_DOMAIN/$CLUSTER_DOMAIN/g、s?REVERSE_CIDRS?$REVERSE_CIDRS?g并将结果输出到标准输出。由于脚本输出的是经过替换的完整 YAML可以直接通过管道交给kubectl apply -f -应用到集群这正是一条命令部署的实现基础。coredns.yaml.sed 模板详解六大资源对象manifests/coredns/coredns.yaml.sed 模板由 6 个资源对象以---分隔组成逐一解读如下。1. ServiceAccountapiVersion: v1 kind: ServiceAccount metadata: name: coredns namespace: kube-system为 CoreDNS 创建独立的 ServiceAccount用于后续 RBAC 授权。2. ClusterRoleapiVersion: 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 - watchCoreDNS 需要从 Kubernetes API 读取区zone数据因此授予其对endpoints、services、pods、namespaces四类资源的list和watch权限——这正是它实现从集群读取 zone 数据这一核心能力所需的全部权限。3. ClusterRoleBindingapiVersion: 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将corednsServiceAccount 绑定到system:corednsClusterRole。这与 kube-dns 使用预定义system:kube-dnsRoleBinding 的做法详见 practice/kubedns-addon-installation.md思路一致通过 ServiceAccount RoleBinding 授予访问 kube-apiserver 相关 API 的权限。4. ConfigMapCorefile 配置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 }Corefile 是 CoreDNS 的核心配置文件这里的每个指令都对应一项具体能力指令作用.:53监听 53 端口处理所有域名的请求zone 为根域errors记录错误日志health启用健康检查端点Deployment 中 livenessProbe 即探测该端点kubernetes CLUSTER_DOMAIN REVERSE_CIDRS加载 Kubernetes 插件将CLUSTER_DOMAIN默认cluster.local下的 Service/Pod 域名解析交给集群数据REVERSE_CIDRS默认in-addr.arpa ip6.arpa定义反向解析区域pods insecure为 Pod 提供 A 记录解析insecure 模式不校验 Pod 是否真实存在upstream将非集群域名的解析请求转发到上游 DNSfallthrough in-addr.arpa ip6.arpa对in-addr.arpa与ip6.arpa反解区域的请求若本插件无法处理则继续传递给后续插件prometheus :9153在 9153 端口暴露 Prometheus 指标供监控系统采集proxy . /etc/resolv.conf将未匹配集群域名的查询代理到节点的/etc/resolv.conf配置的上游 nameservercache 30开启 DNS 缓存TTL 上限 30 秒提升解析性能5. DeploymentapiVersion: 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.1 imagePullPolicy: IfNotPresent 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 - containerPort: 9153 name: metrics 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: CorefileDeployment 的关键设计点复用 kube-dns 的标签Pod 与 Deployment 的标签均为k8s-app: kube-dns与既有kube-dnsService 的 selector 完全一致因此无需新建 Service副本数为 2采用RollingUpdate滚动更新策略maxUnavailable: 1保证升级过程中至少有一个副本可用容忍CriticalAddonsOnly污点确保 CoreDNS 作为关键插件可调度到被标记为仅承载关键组件的节点镜像coredns/coredns:1.1.1imagePullPolicy: IfNotPresent通过-conf /etc/coredns/Corefile参数加载挂载的 ConfigMap 配置同时暴露 53/UDP 与 53/TCP分别对应标准 DNS 查询与 TCP 场景9153 端口供 Prometheus 采集指标存活探针每 60 秒后开始探测http://:8080/health超时 5 秒、连续 5 次失败判定不健康交由 kubelet 重启dnsPolicy: Default容器使用节点的 DNS 配置/etc/resolv.conf与 Corefile 中proxy . /etc/resolv.conf的上游转发逻辑匹配。6. Service复用 kube-dnsapiVersion: 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模板中的 Service 仍以kube-dns命名clusterIP由deploy.sh替换为既有 kube-dns 服务的 ClusterIPCLUSTER_DNS_IP占位符。由于 Service 的 IP 与端口保持不变、selector 不变k8s-app: kube-dns集群内所有 Pod 的/etc/resolv.conf由 kubelet 通过--cluster-dns注入的 nameserver 地址无需任何调整即可无缝指向新的 CoreDNS 后端。此外Service 上带有prometheus.io/scrape: true注解可与 Prometheus 自动发现集成。一键部署替换 kube-dns 的标准流程在最佳场景下使用 CoreDNS 替换 kube-dns 只需要执行两条命令命令需在包含deploy.sh与coredns.yaml.sed的manifests/coredns目录下运行且本机已配置好访问集群的 kubeconfig$ ./deploy.sh | kubectl apply -f - $ kubectl delete --namespacekube-system deployment kube-dns执行过程说明第一条命令中deploy.sh自动探测既有kube-dnsService 的 ClusterIP完成模板占位符替换后输出完整 YAML经管道交给kubectl apply -f -创建 ServiceAccount、ClusterRole、ClusterRoleBinding、ConfigMap 与 CoreDNS Deployment并更新kube-dnsService 的 selector第二条命令删除旧的 kube-dns Deployment完成切换。注意建议在部署 CoreDNS 后立即删除 kube-dns。如果两者同时运行由于 Service selector 会同时选中新旧两套 Pod服务查询可能会随机的在 CoreDNS 和 kube-dns 之间产生导致解析行为不确定。因此迁移应一次性完成避免双 DNS 并存的窗口期。非 RBAC 集群的适配对于未启用 RBACRole-Based Access Control的集群需要对生成的 YAML 结果做如下手工编辑从 YAML 文件的Deployment部分删除serviceAccountName: coredns这一行删除ServiceAccount、ClusterRole和ClusterRoleBinding三个资源段。在非 RBAC 集群中任何 Pod 都默认拥有访问 API 的权限因此这些 RBAC 相关资源既无必要也不受支持rbac.authorization.k8s.ioAPI 组可能不可用删除后即可正常部署。部署后的验证与问题排查部署完成后可参照 practice/configuring-dns.md 中针对 DNS 组件的系统化验证方法进行确认。检查 DNS Pod 运行状态$ kubectl get pods --namespacekube-system -l k8s-appkube-dns NAME READY STATUS RESTARTS AGE coredns-7d4d9b6c6b-xxxxx 1/1 Running 0 2m coredns-7d4d9b6c6b-yyyyy 1/1 Running 0 2m与 kube-dns 的3/3kubedns、dnsmasq、sidecar 三个容器不同CoreDNS 每个 Pod 只需1/1单容器这正是其架构简化的直观体现。若 Pod 未运行或处于 Failed/Completed 状态说明插件未正确部署。检查 Service 与 Endpoints$ kubectl get svc --namespacekube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.0.0.10 none 53/UDP,53/TCP 1h $ kubectl get ep kube-dns --namespacekube-system NAME ENDPOINTS AGE kube-dns 10.180.3.17:53,10.180.3.17:53 1hService 的 ClusterIP 应与 kubelet 的--cluster-dns参数一致Endpoints 应指向 CoreDNS Pod 的 IP。用测试 Pod 验证解析创建 busybox 测试 Pod然后执行nslookup$ kubectl exec -ti busybox -- nslookup kubernetes.default Server: 10.0.0.10 Address 1: 10.0.0.10 Name: kubernetes.default Address 1: 10.0.0.1若看到上述输出说明集群内服务域名解析正常。同时可检查容器内的 DNS 配置$ kubectl exec busybox cat /etc/resolv.conf search default.svc.cluster.local svc.cluster.local cluster.local nameserver 10.0.0.10 options ndots:5其中nameserver指向的正是kube-dnsService 的 ClusterIP——这也是迁移方案复用该 Service IP 的意义所在所有 Pod 无需重启即可继续使用原 DNS 地址。若nslookup报cant resolve kubernetes.default则需要依次排查CoreDNS Pod 是否运行、Pod 日志kubectl logs --namespacekube-system -l k8s-appkube-dns中是否有以W/E/F开头的警告、错误与失败日志、Service 是否暴露、Endpoints 是否正常。迁移注意事项与前提仔细测试 manifestdeploy.sh生成的 manifest 是否正常工作取决于集群的构建方式与运行版本。对 manifest 做必要的修改如镜像仓库、副本数、Corefile 插件参数是合理的建议先在测试集群验证后再应用于生产。保持 kubelet 参数一致--cluster-dns指向的地址必须与kube-dnsService 的 ClusterIP 一致--cluster-domain应与-d参数默认cluster.local一致否则 Pod 内域名解析会失败。上游解析能力Corefile 中的proxy . /etc/resolv.conf依赖节点自身的 DNS 配置。与 kube-dns 的upstreamNameservers最多指定三个上游 nameserver未指定时默认继承节点/etc/resolv.conf行为类似Pod 的dnsPolicy为ClusterFirst时未匹配集群域名的请求会按此转发dnsPolicy为Default或None的 Pod 则不受集群 DNS 配置影响。双 DNS 并存风险务必在部署 CoreDNS 后删除 kube-dns避免解析请求随机分发到两套 DNS 后端。参考practice/coredns.md本文核心依据CoreDNS 安装配置原始文档manifests/coredns/deploy.sh部署脚本源码manifests/coredns/coredns.yaml.sedmanifest 模板源码practice/configuring-dns.mdkube-dns 配置、存根域与 DNS 调试指南practice/kubedns-addon-installation.mdkube-dns 插件安装与 RBAC 配置细节practice/dns-installation.mdDNS 组件在集群服务发现中的定位说明practice/install-kubernetes-with-kubeadm.mdkubeadm 集群安装方式及 CoreDNS 集成背景赞分享教程云原生容器编排【免费下载链接】kubernetes-handbookKubernetes 架构与生态从云原生到 AI 原生基础设施的构建指南项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-handbook点击查看免费下载相关推荐Kubernetes 集群 DNS 解析配置与故障排查完全指南基于 kubernetes-handbook 的 kube-dns 实战Kubernetes 集群 DNS 解析配置与故障排查完全指南基于 kubernetes handbook 的 kube dns 实战 Kubernetes教程云原生容器编排kube-state-metrics Helm Chart 部署与配置完全指南Kubernetes 集群指标采集实战kube state metrics Helm Chart 部署与配置完全指南Kubernetes 集群指标采集实战 本指南以 Friend 仓库内嵌的 ku人工智能AI 应用语音移动开发后端桌面应用智能硬件MCP 服务Kubernetes The Hard Way DNS插件部署CoreDNS配置与调优终极指南在Kubernetes集群中DNS服务发现是核心组件之一而CoreDNS作为官方推荐的DNS插件为集群内部的服务发现提供了强大的支持。本文将通过Kuber文档/教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表