CoreDNS

CoreDNS 是 Kubernetes 集群的默认 DNS 服务,负责为集群内的 Pod 和 Service 提供域名解析服务。它取代了早期版本中的 kube-dns,提供了更好的性能、灵活性和可扩展性。

CoreDNS 架构
graph TB
    subgraph "K8s 集群"
        subgraph "Master 节点"
            API[API Server]
            ETCD[etcd]
        end
        
        subgraph "CoreDNS Pod"
            COREDNS[CoreDNS Server]
            PLUGIN[插件系统
kubernetes, k8s_gateway等] end subgraph "客户端" POD1[应用 Pod] POD2[应用 Pod] SVC[Service] end subgraph "外部 DNS" UPSTREAM[上游 DNS
8.8.8.8] end end POD1 --> COREDNS POD2 --> COREDNS SVC --> COREDNS COREDNS --> API COREDNS --> ETCD COREDNS --> UPSTREAM API --> PLUGIN
CoreDNS 核心特性

插件架构

基于插件系统,支持多种功能扩展

服务发现

自动发现并解析集群内的服务

缓存机制

高效缓存机制,提升解析性能

可配置性

灵活的配置选项,满足不同需求

CoreDNS 配置详解

CoreDNS 使用 Corefile 配置文件来定义 DNS 解析规则和插件行为。

# CoreDNS 配置示例
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    . {
      errors
      health {
        lameduck 5s
      }
      kubernetes cluster.local in-addr.arpa ip6.arpa {
        pods insecure
        fallthrough in-addr.arpa ip6.arpa
        ttl 30
      }
      prometheus :9153
      forward . /etc/resolv.conf
      cache 30
      loop
      reload
      loadbalance
    }
CoreDNS 常用插件
插件功能使用场景
kubernetes与 Kubernetes API 集成,提供服务发现解析 Service 和 Pod 域名
forward将查询转发到上游 DNS 服务器解析外部域名
cacheDNS 查询结果缓存提升解析性能
health健康检查端点监控 CoreDNS 服务状态
prometheus暴露监控指标性能监控和告警
loop检测和防止 DNS 循环防止查询循环
DNS 解析流程
sequenceDiagram
    participant Pod as 应用 Pod
    participant CoreDNS as CoreDNS
    participant API as Kubernetes API
    participant Upstream as 上游 DNS
    
    Pod->>CoreDNS: 查询 service.namespace.svc.cluster.local
    CoreDNS->>API: 检查 Service 定义
    API-->>CoreDNS: 返回 Service IP
    CoreDNS-->>Pod: 返回解析结果
    alt 未找到内部服务
        CoreDNS->>Upstream: 转发查询
        Upstream-->>CoreDNS: 外部域名解析结果
        CoreDNS-->>Pod: 返回外部解析结果
    end
                                
CoreDNS 故障排查
# 查看 CoreDNS Pod 状态
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns
# 测试 DNS 解析
kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- nslookup kubernetes.default
# 查看 CoreDNS 配置
kubectl get configmap coredns -n kube-system -o yaml
# 重新加载 CoreDNS 配置
kubectl rollout restart deployment/coredns -n kube-system
CoreDNS 性能优化
缓存优化
  • 调整缓存大小和 TTL
  • 根据负载调整缓存策略
  • 监控缓存命中率
资源优化
  • 调整副本数以提高可用性
  • 设置合适的资源请求和限制
  • 启用负载均衡策略