Kubernetes之调试DNS解析
LiuSw Lv6

Kubernetes之调试DNS解析

创建一个简单的 Pod 来用作测试环境

使用以下内容创建一个名为 busybox.yaml 的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always

然后使用此文件创建一个 pod 并验证其状态:

1
2
3
4
5
6
kubectl create -f busybox.yaml
# pod "busybox" created

kubectl get pods busybox
# NAME READY STATUS RESTARTS AGE
# busybox 1/1 Running 0 <some-time>

一旦该 pod 运行,您就可以在环境中执行 nslookup。如果您看到如下所示的内容,则 DNS 工作正常。

1
2
3
4
5
6
kubectl exec -ti busybox -- nslookup kubernetes.default
# Server: 10.0.0.10
# Address 1: 10.0.0.10

# Name: kubernetes.default
# Address 1: 10.0.0.1

如果 nslookup 命令失败,请检查以下内容:

首先检查本地 DNS 配置

看一看 resolv.conf 文件

1
kubectl exec busybox cat /etc/resolv.conf

验证搜索路径和名称服务器是否设置如下(请注意,搜索路径可能因不同的云提供商而异):

1
2
3
search default.svc.cluster.local svc.cluster.local cluster.local google.internal c.gce_project_id.internal
nameserver 10.0.0.10
options ndots:5

以下错误表明 kube-dns 附加组件或相关服务存在问题:

1
2
3
4
5
kubectl exec -ti busybox -- nslookup kubernetes.default
# Server: 10.0.0.10
# Address 1: 10.0.0.10

# nslookup: can't resolve 'kubernetes.default'

或者

1
2
3
4
5
kubectl exec -ti busybox -- nslookup kubernetes.default
# Server: 10.0.0.10
# Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local

# nslookup: can't resolve 'kubernetes.default'

检查 DNS pod 是否正在运行中

使用 kubectl get pods 命令验证 DNS pod 是否正在运行中。

1
2
3
4
5
6
kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
# NAME READY STATUS RESTARTS AGE
# ...
# kube-dns-v19-ezo1y 3/3 Running 0 1h
# ...

如果您看到没有 pod 正在运行中,或者 pod 已失败/已完成,那么在当前环境中,默认情况下可能不会部署 DNS 插件,您将不得不手动部署它。

检查 DNS pod 中的错误

使用 kubectl logs 命令查看 DNS 守护程序的日志。

1
2
3
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c sidecar

看看有没有可疑的日志。字母 ‘W‘、’E‘、’F’ 表示警告、错误和失败。

DNS服务起来了吗?

通过使用 kubectl get service 命令验证 DNS 服务已启动。

1
2
3
4
5
kubectl get svc --namespace=kube-system
# NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# ...
# kube-dns 10.0.0.10 <none> 53/UDP,53/TCP 1h
# ...

如果您已经创建了该服务,或者应该在默认情况下创建它,但它没有出现。

DNS endpoints 是否暴露?

您可以使用 kubectl get endpoints 命令验证是否暴露了了 DNS endpoints。

1
2
3
kubectl get ep kube-dns --namespace=kube-system
# NAME ENDPOINTS AGE
# kube-dns 10.180.3.17:53,10.180.3.17:53 1h
 评论