背景
pod启动后报错无法解析k8s svc的域名
k8s版本为1.23.17,cri为docker
排查
查看pod的/etc/resolv.conf
发现值不对,为node上的/etc/resolv.conf
查看pod的yaml
dnsPolicy值为ClusterFirstWithHostNet
dnsConfig值为空
查看kubelet代码
pkg/kubelet/dockershim/docker_sandbox.go中
func (ds *dockerService) RunPodSandbox(ctx context.Context, r *runtimeapi.RunPodSandboxRequest) (*runtimeapi.RunPodSandboxResponse, error) {
...
if dnsConfig := config.GetDnsConfig(); dnsConfig != nil {
containerInfo, err := ds.client.InspectContainer(createResp.ID)
if err != nil {
return nil, fmt.Errorf("failed to inspect sandbox container for pod %q: %v", config.Metadata.Name, err)
}
if err := rewriteResolvFile(containerInfo.ResolvConfPath, dnsConfig.Servers, dnsConfig.Searches, dnsConfig.Options); err != nil {
return nil, fmt.Errorf("rewrite resolv.conf failed for pod %q: %v", config.Metadata.Name, err)
}
}
...
}
也就是说kubelet正常是会在创建完sandbox后会去rewrite这个容器的dns config,所以有2个怀疑点
1 kubelet在rewrite前发生了重启,重启后发现sandbox是running状态则不会去进行rewrite
2 sandbox发生了重启,此dns config并未持久化
查看sandbox重启情况
未发生重启
查看kubelet重启情况
确实在sandbox创建时间附近发生了重启
解决
临时方案
重建pod
长期方案
方案一
修改kubelet代码,就算是sandbox running也检查dnsconfig
方案二
替换cri替换为containerd
网友评论