在 Kubernetes 集群中,DNS 服务是核心组件之一,用于实现服务发现和 Pod 之间的域名解析。以下是查看和验证 DNS 配置的详细方法:
1. 查看 DNS Pod 状态
Kubernetes 默认使用 CoreDNS(或旧版本的 kube-dns)作为 DNS 服务。首先检查 DNS Pod 是否正常运行:
kubectl get pods -n kube-system -l k8s-app=kube-dns
输出示例:
NAME READY STATUS RESTARTS AGE
coredns-5c98db65d4-2j6kq 1/1 Running 0 7d
coredns-5c98db65d4-l9x7v 1/1 Running 0 7d
- 如果状态不是
Running
,需检查 Pod 日志或集群事件。
2. 查看 DNS 服务(Service)
DNS 服务通常命名为 kube-dns
,查看其 ClusterIP 和端口:
kubectl get svc -n kube-system kube-dns
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 30d
- ClusterIP(如
10.96.0.10
)是集群内其他 Pod 使用的 DNS 服务器地址。
3. 查看 DNS 配置(CoreDNS ConfigMap)
CoreDNS 的配置存储在 ConfigMap 中,查看其内容:
kubectl get configmap -n kube-system coredns -o yaml
输出示例:
apiVersion: v1
data:
Corefile: |
.:53 {
errors
health
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
kind: ConfigMap
...
- 检查
forward
字段:它定义了上游 DNS 服务器(通常继承节点/etc/resolv.conf
)。 - 检查
kubernetes
插件:确保域名cluster.local
的解析规则正确。
4. 验证 DNS 解析
方法 1:通过临时 Pod 测试
启动一个临时 Pod(如 busybox
)并测试 DNS 解析:
kubectl run -it --rm --restart=Never dns-test --image=busybox:1.28 -- nslookup kubernetes.default
输出示例:
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
- 如果解析失败,检查 DNS Pod 日志或网络策略。
方法 2:使用 dig
或 nslookup
如果 Pod 中安装了 dig
工具(如 dnsutils
镜像):
kubectl run -it --rm --restart=Never dns-utils --image=gcr.io/kubernetes-e2e-test-images/dnsutils:1.3 -- dig kubernetes.default.svc.cluster.local
5. 查看 DNS 日志
检查 CoreDNS Pod 的日志以排查问题:
kubectl logs -n kube-system <coredns-pod-name>
示例命令:
kubectl logs -n kube-system coredns-5c98db65d4-2j6kq
6. 检查 Pod 的 DNS 配置
Pod 的 DNS 配置由以下字段控制:
dnsPolicy
: 如ClusterFirst
(默认使用集群 DNS)。dnsConfig
: 自定义 DNS 设置。
查看某个 Pod 的 DNS 配置:
kubectl get pod <pod-name> -o yaml | grep -i dns
7. 检查节点 DNS 配置
确保节点(宿主机)的 /etc/resolv.conf
配置正确,因为 CoreDNS 可能依赖上游 DNS 服务器。
常见问题排查
-
DNS 解析失败
- 检查 DNS Pod 是否正常运行。
- 检查网络插件(如 Calico、Flannel)是否导致网络隔离。
- 检查 CoreDNS 的
forward
配置是否正确。
-
解析外部域名失败
- 确保 CoreDNS 配置中
forward
指向了可用的上游 DNS(如8.8.8.8
或公司内网 DNS)。
- 确保 CoreDNS 配置中
-
自定义域名解析
- 在 CoreDNS 的 ConfigMap 中添加
hosts
插件或自定义域名解析规则。
- 在 CoreDNS 的 ConfigMap 中添加
通过以上步骤,可以全面诊断 Kubernetes 集群的 DNS 服务状态和配置。