Kubernetes 第四章:深入掌握Service-进阶(CoreDNS)

Kubernetes 第四章:深入掌握Service-进阶(CoreDNS)

CoreDNS背景概述

CoreDNS是Kubernetes集群中默认的DNS服务器,自1.11版本起全面取代kube-dns。作为CNCF毕业项目,它采用Go语言开发,通过插件化架构实现灵活的域名解析功能。在云原生架构中,CoreDNS承担着服务发现的核心角色,为集群内外的域名解析提供统一解决方案。

核心价值

服务发现:自动注册Kubernetes服务的DNS记录负载均衡:通过A记录轮询实现服务间通信动态更新:实时同步Kubernetes API的变化高可用性:支持多实例部署和故障转移

CoreDNS的概念原理

CoreDNS采用基于插件的架构设计,每个插件负责特定功能模块。其工作流程如下:

接收DNS查询请求依次经过配置的插件链处理返回最终解析结果

核心插件体系

插件名称 功能描述
kubernetes 解析集群内部服务域名
forward 转发外部域名请求
cache 缓存查询结果提升性能
loadbalance 实现DNS层负载均衡
prometheus 提供监控指标收集

服务搭建和配置指南

环境准备


# 查看集群版本
kubectl version --short
# 确保版本≥1.11

配置kubelet参数

修改每个Node节点的kubelet配置:


--cluster-dns=169.169.0.100
--cluster-domain=cluster.local

重启kubelet服务后生效:


systemctl restart kubelet

创建CoreDNS配置


apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    cluster.local {
        errors
        health
        kubernetes cluster.local 169.169.0.0/16
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
    . {
        forward . /etc/resolv.conf
    }

部署CoreDNS服务


apiVersion: apps/v1
kind: Deployment
metadata:
  name: coredns
  namespace: kube-system
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
  selector:
    matchLabels:
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        k8s-app: kube-dns
    spec:
      containers:
      - name: coredns
        image: coredns/coredns:1.8.4
        args: ["-conf", "/etc/coredns/Corefile"]
        volumeMounts:
        - name: config-volume
          mountPath: /etc/coredns
      volumes:
      - name: config-volume
        configMap:
          name: coredns

创建Service


apiVersion: v1
kind: Service
metadata:
  name: coredns
  namespace: kube-system
spec:
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: metrics
    port: 9153
    protocol: TCP
  selector:
    k8s-app: kube-dns

验证部署


kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl get svc -n kube-system coredns

服务名的DNS解析

解析规则

同命名空间服务:
<service-name>
跨命名空间服务:
<service-name>.<namespace>
完全限定域名(FQDN):
<service-name>.<namespace>.svc.cluster.local

示例验证


# 创建测试服务
kubectl run nginx --image=nginx --expose --port=80
kubectl get svc nginx

# 在Pod内测试解析
nslookup nginx
nslookup nginx.default
nslookup nginx.default.svc.cluster.local

CoreDNS的配置说明

Corefile关键配置项


cluster.local {
    # 错误日志记录
    errors
    # 健康检查端点
    health
    # Kubernetes解析插件
    kubernetes cluster.local 169.169.0.0/16 {
        pods insecure
        fallthrough in-addr.arpa ip6.arpa
    }
    # Prometheus监控
    prometheus :9153
    # 转发配置
    forward . /etc/resolv.conf
    # 缓存配置
    cache 30
    # 负载均衡
    loadbalance
}

动态配置更新


# 修改ConfigMap后自动生效
kubectl edit configmap coredns -n kube-system

Node本地DNS缓存

dnsmasq配置示例


apiVersion: v1
kind: Pod
metadata:
  name: dnsmasq
  namespace: kube-system
spec:
  containers:
  - name: dnsmasq
    image: jderusse/dnsmasq
    ports:
    - containerPort: 53
      protocol: UDP
    env:
    - name: RESOLVCONF
      value: "/etc/resolv.conf"
    volumeMounts:
    - name: resolv-conf
      mountPath: "/etc/resolv.conf"
      subPath: resolv.conf
  volumes:
  - name: resolv-conf
    configMap:
      name: kube-dns

Pod的DNS域名相关特性

默认DNS域名格式


<Pod-IP>.pod.<namespace>.pod.cluster.local

自定义Hostname配置


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  hostname: custom-host
  containers:
  - image: nginx

Subdomain配置


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  subdomain: app-sub
  containers:
  - image: nginx

Pod的DNS策略

四种DNS策略对比

策略类型 行为描述 适用场景
Default 使用宿主机DNS配置 外部服务访问
ClusterFirst 优先使用CoreDNS 集群内服务访问
ClusterFirstWithHostNet hostNetwork模式专用 需直连宿主机网络
None 完全自定义DNS 特殊网络需求

示例配置


# ClusterFirst策略
spec:
  dnsPolicy: ClusterFirst

# None策略
spec:
  dnsPolicy: None
  dnsConfig:
    nameservers: ["8.8.8.8"]
    searches: ["example.com"]
    options:
    - name: ndots
      value: "2"

Pod中的自定义DNS配置

HostAliases配置


apiVersion: v1
kind: Pod
metadata:
  name: with-hostaliases
spec:
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "example.com"
    - "www.example.com"
  containers:
  - name: test
    image: nginx

深度自定义配置


spec:
  dnsPolicy: None
  dnsConfig:
    nameservers:
      - 169.254.169.254
    searches:
      - default.svc.cluster.local
      - svc.cluster.local
    options:
      - name: ndots
        value: "5"
      - name: edns0

性能优化建议

缓存配置:将
cache
插件TTL设置为合理值ndots优化:将
ndots
设置为2-5之间的值负载均衡:启用
loadbalance
插件实现流量分发监控告警:通过Prometheus监控解析延迟拓扑感知:使用
policy
插件实现区域感知解析

故障排查技巧


# 检查CoreDNS日志
kubectl logs -n kube-system coredns-xxxx

# 测试DNS解析
dig @169.169.0.100 kubernetes.default.svc.cluster.local

# 检查Pod DNS配置
cat /etc/resolv.conf

# 验证服务端口
nc -zv 169.169.0.100 53

高级配置示例

hosts插件配置


example.com {
    hosts {
        192.168.1.100 internal.example.com
    }
}

域名重写


rewrite name example.com www.example.com

多级缓存


cache 30 example.com
cache 60 .example.com

安全加固措施

限制转发:配置
forward
插件的上游DNS服务器访问控制:使用
acl
插件限制查询来源日志审计:启用
log
插件记录查询信息速率限制:配置
ratelimit
防止DDoS攻击

未来发展方向

IPv6支持:完善双栈网络解析能力Service Mesh集成:与Istio等服务网格深度整合智能路由:基于拓扑信息的动态解析安全增强:支持DNSSEC等安全协议

通过以上配置和最佳实践,可以构建稳定高效的DNS服务体系,为Kubernetes应用提供可靠的服务发现基础。建议定期监控CoreDNS的性能指标,根据集群规模和业务需求动态调整配置参数。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
爱踢学长的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容