写点什么

k8s 节点机器重启 CNI IP 未回收

用户头像
Geek_f24c45
关注
发布于: 2 小时前

当 k8s 的节点,突然机器宕机重启,此时会 gc 清理失效的 POD,在这个阶段 CNI IP 自然会得到释放。


可实际发现 这种情况发生时,CNI 的 IP 会残留在 IPAM 中。


排查 CNI 的日志, kubelet 确实主动释放了,可是此时 CNI 服务并没有真正的启动起来, unix socket 文件并没有准备好,直接报了 “no such file or directory”类似的错误,kubelet 就再也没有下文了,理论上该不断进行重试的。


我们查看下代码,一切自然明了!


func (plugin *cniNetworkPlugin) deleteFromNetwork(ctx context.Context, network *cniNetwork, podName string, podNamespace string, podSandboxID kubecontainer.ContainerID, podNetnsPath string, annotations map[string]string) error {	rt, err := plugin.buildCNIRuntimeConf(podName, podNamespace, podSandboxID, podNetnsPath, annotations, nil)	if err != nil {		klog.Errorf("Error deleting network when building cni runtime conf: %v", err)		return err	}
pdesc := podDesc(podNamespace, podName, podSandboxID) netConf, cniNet := network.NetworkConfig, network.CNIConfig klog.V(4).Infof("Deleting %s from network %s/%s netns %q", pdesc, netConf.Plugins[0].Network.Type, netConf.Name, podNetnsPath) err = cniNet.DelNetworkList(ctx, netConf, rt) // The pod may not get deleted successfully at the first time. // Ignore "no such file or directory" error in case the network has already been deleted in previous attempts. // 这个错误 被当成了 “资源已经清理” 忽略了 if err != nil && !strings.Contains(err.Error(), "no such file or directory") { klog.Errorf("Error deleting %s from network %s/%s: %v", pdesc, netConf.Plugins[0].Network.Type, netConf.Name, err) return err } klog.V(4).Infof("Deleted %s from network %s/%s", pdesc, netConf.Plugins[0].Network.Type, netConf.Name) return nil}
复制代码


由于很多的 CNI 插件都采用 bin + unix socket 的模式, 在 unix socket 不存在时,connect() 就会抛出这样的错误;误导 kubelet 不再重试; 存在泄漏 IP 的问题; 特此记录!


用户头像

Geek_f24c45

关注

还未添加个人签名 2018.03.24 加入

还未添加个人简介

评论

发布
暂无评论
k8s 节点机器重启 CNI IP 未回收