找回密码
 立即注册
首页 业界区 业界 K8s集群中的DNS服务(CoreDNS)详解

K8s集群中的DNS服务(CoreDNS)详解

鸳剿 2025-6-3 00:38:16
概述

官网文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/dns-pod-service/
在 Kubernetes(K8s)中,DNS 服务是实现服务发现和 Pod 通信的核心组件之一,用于解决集群内资源通过域名而非 IP 地址进行访问的需求。本文将详细解析 K8s DNS 服务的原理、组件、配置及应用场景。
K8s DNS的作用

服务发现


  • 允许 Pod 通过服务名称(Service Name)而非动态变化的 IP 地址访问其他服务,简化网络配置。
  • 支持跨命名空间(Namespace)的服务访问,通过域名后缀区分不同作用域。
Pod 通信


  • 每个 Pod 自动获取 DNS 配置,可直接通过主机名(Hostname)或服务名进行通信。
解耦服务依赖


  • 服务的 IP 地址变更时,DNS 会自动更新解析结果,避免手动维护 IP 列表。
核心组件:CoreDNS(替代传统 kube-dns)

K8s 早期使用kube-dns作为 DNS 服务器,目前默认采用CoreDNS,因其更轻量、灵活且支持插件机制。
CoreDNS的安装

如果使用kubeadm部署集群,CoreDNS 会自动部署在kube-system命名空间下,如果需要进行部署,可以使用下面的文件:
  1. kubectl apply -f https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base
复制代码
部署CoreDNS通常包含

  • StatefulSet/Deployment:定义 CoreDNS Pod 副本。
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: coredns
  5.   namespace: kube-system
  6. spec:
  7.   replicas: 2  # 默认2个副本,确保高可用
  8.   selector:
  9.     matchLabels:
  10.       k8s-app: kube-dns  # 历史遗留标签,兼容旧版kube-dns
  11.   template:
  12.     metadata:
  13.       labels:
  14.         k8s-app: kube-dns
  15.     spec:
  16.       containers:
  17.       - name: coredns
  18.         image: coredns/coredns:v1.10.1  # CoreDNS版本
  19.         args: [ "-conf", "/etc/coredns/Corefile" ]
  20.         ports:
  21.         - containerPort: 53
  22.           name: dns
  23.           protocol: UDP
  24.         - containerPort: 53
  25.           name: dns-tcp
  26.           protocol: TCP
  27.         volumeMounts:
  28.         - name: config-volume
  29.           mountPath: /etc/coredns
  30.       volumes:
  31.       - name: config-volume
  32.         configMap:
  33.           name: coredns
  34.           items:
  35.           - key: Corefile
  36.             path: Corefile
复制代码

  • Service:暴露 CoreDNS 服务,供集群内 Pod 访问(默认 IP 为10.96.0.10)。
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: kube-dns
  5.   namespace: kube-system
  6. spec:
  7.   selector:
  8.     k8s-app: kube-dns
  9.   clusterIP: 10.96.0.10  # 默认集群IP,Pod的nameserver配置指向此IP
  10.   ports:
  11.   - name: dns
  12.     port: 53
  13.     protocol: UDP
  14.   - name: dns-tcp
  15.     port: 53
  16.     protocol: TCP
复制代码

  • ConfigMap:存储 Corefile 配置。
  1. .:53 {                              #表示监听所有接口的 53 端口(DNS 标准端口)。
  2.     errors                          # 记录错误日志
  3.     health {
  4.         lameduck 5s                 # 健康检查,延迟5秒标记不健康
  5.     }
  6.     ready                           # 提供 readiness 探针端点(/ready),指示 CoreDNS 是否准备好处理请求
  7.     kubernetes cluster.local in-addr.arpa ip6.arpa {
  8.         fallthrough in-addr.arpa ip6.arpa  # 未匹配到K8s服务时,透传给下一个插件
  9.         ttl 30                        # DNS记录的TTL时间
  10.     }
  11.     prometheus :9153                # 暴露Prometheus监控指标
  12.     forward . /etc/resolv.conf      # 转发外部域名查询到宿主机的DNS服务器
  13.     cache 30                        # 缓存查询结果30秒
  14.     loop                            # 检测配置循环引用
  15.     reload                          # 自动重新加载配置变更
  16.     loadbalance                     # 对A/AAAA记录进行负载均衡
  17. }
复制代码
CoreDNS的组成


  • CoreDNS Pod:运行 CoreDNS 服务,监听 DNS 请求(默认端口 53)。
  1. [root@master ~]# kubectl get po -o wide -n kube-system
  2. NAME                             READY   STATUS    RESTARTS        AGE   IP                NODE     NOMINATED NODE   READINESS GATES
  3. coredns-787d4945fb-jb4t9         1/1     Running   1 (2d23h ago)   9d    100.117.144.135   node01   <none>           <none>
  4. coredns-787d4945fb-z47x7         1/1     Running   1 (2d23h ago)   9d    100.117.144.138   node01   <none>           <none>
复制代码

  • Service 资源:为 CoreDNS Pod 暴露集群内部服务,名称为kube-dns(或coredns,取决于部署方式),IP 通常为10.96.0.10(集群 IP 范围)。
  1. [root@master ~]# kubectl get svc -n kube-system
  2. NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
  3. kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   9d
  4. [root@master ~]# kubectl describe svc kube-dns -n kube-system
  5. Name:              kube-dns
  6. Namespace:         kube-system
  7. Labels:            k8s-app=kube-dns
  8.                    kubernetes.io/cluster-service=true
  9.                    kubernetes.io/name=CoreDNS
  10. Annotations:       prometheus.io/port: 9153
  11.                    prometheus.io/scrape: true
  12. Selector:          k8s-app=kube-dns
  13. Type:              ClusterIP
  14. IP Family Policy:  SingleStack
  15. IP Families:       IPv4
  16. IP:                10.96.0.10
  17. IPs:               10.96.0.10
  18. Port:              dns  53/UDP
  19. TargetPort:        53/UDP
  20. Endpoints:         100.117.144.135:53,100.117.144.138:53
  21. Port:              dns-tcp  53/TCP
  22. TargetPort:        53/TCP
  23. Endpoints:         100.117.144.135:53,100.117.144.138:53
  24. Port:              metrics  9153/TCP
  25. TargetPort:        9153/TCP
  26. Endpoints:         100.117.144.135:9153,100.117.144.138:9153
  27. Session Affinity:  None
  28. Events:            <none>
复制代码

  • ConfigMap 配置:通过 ConfigMap 定义 CoreDNS 的解析规则和插件。
  1. [root@master ~]# kubectl describe cm coredns -n kube-system
  2. Name:         coredns
  3. Namespace:    kube-system
  4. Labels:       <none>
  5. Annotations:  <none>
  6. Data
  7. ====
  8. Corefile:
  9. ----
  10. .:53 {
  11.     errors
  12.     health {
  13.        lameduck 5s
  14.     }
  15.     ready
  16.     kubernetes cluster.local in-addr.arpa ip6.arpa {
  17.        pods insecure
  18.        fallthrough in-addr.arpa ip6.arpa
  19.        ttl 30
  20.     }
  21.     prometheus :9153
  22.     forward . /etc/resolv.conf {
  23.        max_concurrent 1000
  24.     }
  25.     cache 30
  26.     loop
  27.     reload
  28.     loadbalance
  29. }
  30. BinaryData
  31. ====
  32. Events:  <none>
复制代码
CoreDNS域名解析规则

K8s集群中Pod之间通过域名互相访问需要遵守特定的规则,规则如下
  1. <service-name>.<namespace>.svc.<cluster-domain>
复制代码

  • service-name:表示service的名称
  • namespace:service所在的命名空间
  • cluster-domain:集群的域名,默认为cluster.local
cluster-domain从哪儿获取?
  1. [root@master ~]# grep clusterDomain /var/lib/kubelet/config.yaml
  2. clusterDomain: cluster.local
复制代码
CoreDNS实战案例

验证同一个命名空间下的CoreDNS访问

创建两个Pod和Service
  1. ## 第一个Pod和 Service
  2. [root@master ~/coredns]# cat test-1.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: dns-target-pod
  7.   labels:
  8.     app: dns-test
  9. spec:
  10.   containers:
  11.   - name: busybox
  12.     image: busybox
  13.     command: ["sh", "-c", "while true; do sleep 3600; done"]
  14. ---
  15. apiVersion: v1
  16. kind: Service
  17. metadata:
  18.   name: dns-target-service
  19. spec:
  20.   type: ClusterIP
  21.   selector:
  22.     app: dns-test
  23.   ports:
  24.   - protocol: TCP
  25.     port: 80
  26.     targetPort: 80
  27. [root@master ~/coredns]# kubectl apply -f test-1.yaml
  28. pod/dns-target-pod unchanged
  29. service/dns-target-service created
  30. # 第二个Pod和Service
  31. [root@master ~/coredns]# cat test-2.yaml
  32. apiVersion: v1
  33. kind: Pod
  34. metadata:
  35.   name: dns-source-pod
  36.   labels:
  37.     app: dns-source-test
  38. spec:
  39.   containers:
  40.   - name: busybox
  41.     image: busybox
  42.     command: ["sh", "-c", "while true; do sleep 3600; done"]
  43. ---
  44. apiVersion: v1
  45. kind: Service
  46. metadata:
  47.   name: dns-source-service
  48. spec:
  49.   type: ClusterIP
  50.   selector:
  51.     app: dns-source-test
  52.   ports:
  53.   - protocol: TCP
  54.     port: 80
  55.     targetPort: 80
  56. [root@master ~/coredns]# kubectl apply -f test-2.yaml
  57. pod/dns-source-pod created
  58. service/dns-source-service created
  59. # 检查一下
  60. [root@master ~/coredns]# kubectl get po,svc
  61. NAME                 READY   STATUS    RESTARTS   AGE
  62. pod/dns-source-pod   1/1     Running   0          111s
  63. pod/dns-target-pod   1/1     Running   0          8s
  64. NAME                         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
  65. service/dns-source-service   ClusterIP   10.96.0.192   <none>        80/TCP    81s
  66. service/dns-target-service   ClusterIP   10.96.3.51    <none>        80/TCP    3m56s
复制代码
验证DNS
  1. [root@master ~/coredns]# kubectl exec -it pod/dns-source-pod -- sh
  2. / # nslookup dns-target-service.default.svc.cluster.local
  3. Server:         10.96.0.10
  4. Address:        10.96.0.10:53
  5. Name:   dns-target-service.default.svc.cluster.local
  6. Address: 10.96.3.51
复制代码
验证在不同命名空间下的DNS访问

示例:
  1. # 创建一个新的命名空间
  2. [root@master ~/coredns]# kubectl create ns coredns
  3. namespace/coredns created
  4. [root@master ~/coredns]# kubectl get ns coredns
  5. NAME      STATUS   AGE
  6. coredns   Active   15s
复制代码
创建Pod和Service进行验证
  1. [root@master ~/coredns]# cat test-3.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: dns-coredns-pod
  6.   namespace: coredns
  7.   labels:
  8.     app: dns-coredns-test
  9. spec:
  10.   containers:
  11.   - name: busybox
  12.     image: busybox
  13.     command: ["sh", "-c", "while true; do sleep 3600; done"]
  14. ---
  15. apiVersion: v1
  16. kind: Service
  17. metadata:
  18.   name: dns-coredns-service
  19.   namespace: coredns
  20. spec:
  21.   type: ClusterIP
  22.   selector:
  23.     app: dns-coredns-test
  24.   ports:
  25.   - protocol: TCP
  26.     port: 80
  27.     targetPort: 80
  28. [root@master ~/coredns]# kubectl apply -f test3.yaml
  29. pod/dns-coredns-pod created
  30. service/dns-coredns-service created
  31. [root@master ~]# kubectl get all -n coredns
  32. NAME                  READY   STATUS    RESTARTS   AGE
  33. pod/dns-coredns-pod   1/1     Running   0          4m36s
  34. NAME                          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
  35. service/dns-coredns-service   ClusterIP   10.96.0.119   <none>        80/TCP    4m36s
复制代码
进行验证
  1. [root@master ~/coredns]# kubectl exec -it dns-target-pod -- sh
  2. / # nslookup dns-coredns-service.coredns.svc.cluster.local
  3. Server:         10.96.0.10
  4. Address:        10.96.0.10:53
  5. Name:   dns-coredns-service.coredns.svc.cluster.local
  6. Address: 10.96.0.119
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册