美文网首页
pod报错无法解析svc对应域名如何解决

pod报错无法解析svc对应域名如何解决

作者: wwq2020 | 来源:发表于2023-09-27 06:28 被阅读0次

背景

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

相关文章

网友评论

      本文标题:pod报错无法解析svc对应域名如何解决

      本文链接:https://www.haomeiwen.com/subject/znchbdtx.html