部署完k8s coredns 之后想测试一下能不能解析成功 (k8s版本v1.18.1)
先部署一个busybox pod 测一下能否解析
cat > busybox.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
EOF
kubectl apply -f busybox.yaml
验证:
kubectl exec -it busybox – nslookup baidu.com
结果解析不了
网上查了一下说是busybox 的版本问题
改个image 试试
cat > dig.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: dig
namespace: default
spec:
containers:
- name: dig
image: docker.io/azukiapp/dig
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
EOF
kubectl apply -f dig.yaml
执行解析
查了一下在 stackoverflow 找到了解决方法:
Ubuntu: 在worker节点中 查看 br_netfilter这个模块是不是启用了,如果没有启用运行modprobe br_netfilter
CentOS: 看看 /proc/sys/net/bridge/bridge-nf-call-iptables 的值是不是为1,如果不是:echo ‘1’> /proc/sys/net/bridge/bridge-nf-call-iptables
https://stackoverflow.com/questions/48148838/kube-dns-error-reply-from-unexpected-source
最好是加上内核参数
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
另外提供一个排查思路
- kubectl exec -it busybox /bin/sh 登陆进pod 查看dns server 是否指向了coredns的service ip
- ping 一下coredns的service ip 看看是否能通
- nc 探测 coredns 的端口是否可达
- kubectl get endpoints -n kube-system 查看coredns service的endpoint是否正确
- dig 指定 coredns pod 的ip 看能否解析成功
个人公众号
https://mp.weixin.qq.com/s/yzOUYAJ7bF6iFyGPnXLWww