Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker DevOps


minikube Pod 无法解析 Service 主机名

minikube Kubernetes kubectl 大约 1430 字

现象

使用nslookup查询Service名称,无法找到对应主机的IP,显示为NXDOMAIN

/ # nslookup myspringboot
Server:         10.96.0.10
Address:        10.96.0.10:53

** server can't find myspringboot.default.svc.cluster.local: NXDOMAIN

** server can't find myspringboot.svc.cluster.local: NXDOMAIN

** server can't find myspringboot.cluster.local: NXDOMAIN

** server can't find myspringboot.cluster.local: NXDOMAIN

** server can't find myspringboot.default.svc.cluster.local: NXDOMAIN

** server can't find myspringboot.svc.cluster.local: NXDOMAIN

尝试解决(无效)

修改 net bridge 策略

查看nf-call相关参数

sudo modprobe br_netfilter
sudo sysctl -a | grep nf-call

输出

net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

修改

echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

备注:因为minikube的虚拟机默认是Buildroot,没有curl、包管理器等命令。默认的nf-call值都已经被赋予了1

修改 coredns ConfigMap

备注:默认都已经配置正确

kubectl -n kube-system edit configmaps coredns -o yaml

解决方法

最终有效的解决办法是:重启corednsPod

kubectl -n kube-system rollout restart deployment coredns

备注

minikube启动时指定的虚拟网卡是否能访问网络,如果不能访问网络,则coredns不能解析外部网络的域名(如:在Podnslookup baidu.com是无法查询到的。)

补充

有些JDK镜像是slim版本,没有curlnslookup等命令,可以使用kubectl debug命令来注入sidecar容器来帮助排查。

busyboxalpine等容器没有curl。如果需要curl可以使用nginx-alpine容器(镜像解压后大小23MB左右)

kubectl debug myspringboot -it --image=nginx:1.21.6-alpine -- sh

参考

https://stackoverflow.com/questions/45805483/kubernetes-pods-cant-resolve-hostnames

阅读 53 · 发布于 2022-11-19

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批