在 Kubernetes 集群中,服务发现是核心功能之一,而 kubedns 作为集群内默认的 DNS 服务,为 Pod 之间的通信提供了域名解析能力,kubedns 的部署通常通过 StatefulSet 实现,这种控制器能够保证 Pod 的稳定网络标识和持久化存储,为 DNS 服务的高可用性和可预测性奠定了基础,本文将详细探讨 kubedns StatefulSet 的架构、部署配置、关键组件及运维注意事项。

kubedns 的核心架构与组件
kubedns 由多个协同工作的组件构成,每个组件承担特定的功能,在 StatefulSet 部署模式下,这些组件被封装在容器中,共同组成一个完整的 DNS 服务,核心组件包括:
- kubedns:负责监听 Kubernetes API Server 的服务和端点变化,维护本地 DNS 记录,并响应客户端的 DNS 查询请求,它是整个系统的入口点。
- dnsmasq:提供缓存功能,减少对上游 DNS 服务器的查询压力,提高解析效率,它还支持服务发现和 Pod 的 SRV 记录查询。
- skydns:基于 etcd 的分布式 DNS 服务,负责将域名解析请求转换为 Kubernetes 集群内的服务 IP 或 Pod IP。
- sidecar:作为日志和监控的代理,收集各组件的日志指标,便于运维排查问题。
这些组件通过容器的方式部署在同一个 Pod 中,通过本地通信(如 localhost)高效协作,StatefulSet 确保了每个 Pod 的名称和顺序是固定的,kubedns0、kubedns1,这为服务发现和故障转移提供了稳定的基础。
StatefulSet 部署配置详解
kubedns 的 StatefulSet 配置通常包含在 Kubernetes 的核心组件 YAML 文件中,如 kubedns.yaml,以下是一个简化的配置示例,重点说明关键参数:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: kubedns
namespace: kubesystem
spec:
serviceName: kubedns
replicas: 3
selector:
matchLabels:
app: kubedns
template:
metadata:
labels:
app: kubedns
spec:
containers:
name: kubedns
image: k8s.gcr.io/k8sdnskubednsamd64:1.15.0
resources:
limits:
memory: 170Mi
requests:
memory: 70Mi
livenessProbe:
httpGet:
path: /healthzkubedns
port: 10054
scheme: HTTP
initialDelaySeconds: 60
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
httpGet:
path: /readiness
port: 8081
initialDelaySeconds: 3
timeoutSeconds: 5
name: dnsmasq
image: k8s.gcr.io/k8sdnsdnsmasqnannyamd64:1.15.0
livenessProbe:
httpGet:
path: /healthzdnsmasq
port: 10054
scheme: HTTP
initialDelaySeconds: 60
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
name: sidecar
image: k8s.gcr.io/k8sdnssidecaramd64:1.15.0
livenessProbe:
httpGet:
path: /metrics
initialDelaySeconds: 60
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
关键配置说明:
- replicas:定义 Pod 副本数量,通常建议设置为 3 或更多,以实现高可用性。
- serviceName:指定关联的 Headless Service,用于稳定网络标识。
- containers:定义各组件的容器镜像、资源限制和健康检查配置。
- livenessProbe/readinessProbe:确保异常容器被及时重启,并避免流量转发到不可用 Pod。
Headless Service 的作用
kubedns 的 StatefulSet 通常与一个 Headless Service 关联,该服务的 ClusterIP 设置为 None,直接返回后端 Pod 的 IP 地址,以下是 Service 配置示例:

apiVersion: v1
kind: Service
metadata:
name: kubedns
namespace: kubesystem
labels:
app: kubedns
spec:
selector:
app: kubedns
ports:
name: dns
port: 53
protocol: UDP
name: dnstcp
port: 53
protocol: TCP
clusterIP: None
Headless Service 的优势在于:
- 稳定域名:Pod 的域名格式为
kubedns0.kubedns.kubesystem.svc.cluster.local,其中数字部分固定,便于配置和记忆。 - 直接访问:客户端可以直接访问特定 Pod,无需通过 Service 的负载均衡,适用于需要直接通信的场景。
高可用性与故障转移机制
kubedns 通过多副本部署和 Kubernetes 的自愈能力实现高可用性,当某个 Pod 发生故障时,Node 上的 kubelet 会检测到容器异常,并通过 kubecontrollermanager 重新创建 Pod,StatefulSet 确保新 Pod 的名称和顺序与原 Pod 一致,避免 DNS 记录的频繁变更。
kubedns 支持水平扩展,通过调整 replicas 参数即可增加或减少 Pod 数量,在扩展过程中,StatefulSet 会按顺序创建新 Pod,确保服务的稳定性。
运维注意事项
- 资源监控:kubedns 的内存和 CPU 使用量与集群规模直接相关,建议通过 Prometheus 和 Grafana 监控其资源消耗,及时调整资源限制。
- 日志排查:使用
kubectl logs n kubesystem kubedns0查看各组件日志,重点关注kubedns和dnsmasq的错误信息。 - 版本升级:升级 kubedns 时,需确保新版本与 Kubernetes 集群版本兼容,采用滚动更新方式逐步替换旧 Pod。
相关配置参数说明
下表小编总结了 kubedns StatefulSet 中常用的配置参数及其作用:
| 参数 | 作用 | 示例值 |
|---|---|---|
replicas |
Pod 副本数量 | 3 |
serviceName |
关联的 Headless Service 名称 | kubedns |
image |
容器镜像版本 | k8s.gcr.io/k8sdnskubednsamd64:1.15.0 |
resources.limits.memory |
内存使用上限 | 170Mi |
livenessProbe.initialDelaySeconds |
健康检查初始延迟 | 60 |
readinessProbe.path |
就绪检查路径 | /readiness |
FAQs
问题 1:如何验证 kubedns 是否正常工作?
解答:可以通过在 Pod 中执行 nslookup 命令测试 DNS 解析。

kubectl run it rm restart=Never image=busybox dnstest nslookup kubernetes.default
如果返回正确的 Service IP(如 96.0.1),则说明 kubedns 工作正常。
问题 2:kubedns Pod 频繁重启怎么办?
解答:首先检查 Pod 事件(kubectl describe pod n kubesystem <podname>),查看是否有 OOM(内存不足)或镜像拉取失败等问题,若为 OOM,需增加 resources.limits.memory 值;若为镜像问题,检查镜像仓库配置或版本兼容性。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/249983.html