Skip to content

CoreDNS 服务发现

CoreDNS 概述

CoreDNS 是 Kubernetes 默认的 DNS 服务器,运行在 kube-system 命名空间,为集群内所有 Pod 提供 DNS 解析。

DNS 解析规则

# Service DNS
<service>.<namespace>.svc.cluster.local

# Pod DNS(需要 subdomain)
<pod-ip-dashes>.<namespace>.pod.cluster.local

# Headless Service 的 Pod
<pod-name>.<service>.<namespace>.svc.cluster.local

# 示例
my-service.default.svc.cluster.local
mysql-0.mysql.default.svc.cluster.local

Corefile 配置

# kubectl get configmap coredns -n kube-system -o yaml
.:53 {
    errors
    health {
       lameduck 5s
    }
    ready
    kubernetes cluster.local in-addr.arpa ip6.arpa {
       pods insecure
       fallthrough in-addr.arpa ip6.arpa
       ttl 30
    }
    prometheus :9153
    forward . /etc/resolv.conf {
       max_concurrent 1000
    }
    cache 30
    loop
    reload
    loadbalance
}

自定义 DNS 配置

yaml
# 为特定域名配置自定义 DNS 服务器
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
        }
        # 内部域名转发到内部 DNS
        forward internal.company.com 10.0.0.53
        # 其他域名转发到公网 DNS
        forward . 8.8.8.8 8.8.4.4
        cache 30
        loop
        reload
        loadbalance
    }

Pod DNS 策略

yaml
spec:
  dnsPolicy: ClusterFirst  # 默认,先查集群 DNS
  # ClusterFirstWithHostNet:使用 hostNetwork 时也查集群 DNS
  # Default:使用节点 DNS
  # None:完全自定义

  # 自定义 DNS 配置
  dnsConfig:
    nameservers:
    - 1.1.1.1
    searches:
    - my-namespace.svc.cluster.local
    - svc.cluster.local
    options:
    - name: ndots
      value: "2"
    - name: timeout
      value: "5"

常用排查

bash
# 测试 DNS 解析
kubectl run dns-test --image=busybox:1.35 --rm -it -- nslookup kubernetes.default
kubectl run dns-test --image=busybox:1.35 --rm -it -- nslookup my-service.production

# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns

# 查看 CoreDNS 指标
kubectl port-forward -n kube-system svc/kube-dns 9153:9153
curl http://localhost:9153/metrics | grep coredns_dns_requests_total

# 检查 Pod 的 DNS 配置
kubectl exec my-pod -- cat /etc/resolv.conf

本站内容由 褚成志 整理编写,仅供学习参考