解决k8s pod无法启动:”unable to init seccomp”问题,附带详细步骤和原因分析

21,729次阅读
没有评论

共计 2571 个字符,预计需要花费 7 分钟才能阅读完成。

解决 k8s pod 无法启动:”unable to init seccomp” 问题

k8s pod

最近,在发布博客站点时,我遇到了一个奇怪的问题。有两个节点上的 pod 一直处于 ”ContainerCreating” 状态,无法正常启动。经过仔细查看 pod 日志,我发现了下面的错误信息:

runc create failed: unable to start container process: unable to init seccomp: error loading seccomp filter into kernel: error loading seccomp filter: errno 524: unknown

这个错误信息给我们提供了一些线索,表明与 seccomp(安全计算)相关的问题导致了 pod 无法启动的情况。

在进一步研究之后,我发现了一个可能的解决方案。原来,pod 所在的节点超出了 `net.core.bpf_jit_limit` 的限制。为了确认这个问题,我们首先查看限制值:

# cat /proc/sys/net/core/bpf_jit_limit
264241152

然后,我们查看当前的值:

# cat /proc/vmallocinfo | grep bpf_jit | awk '{s+=$2} END {print s}'
353464320

通过对比限制值和当前值,我们可以发现当前值已经超出了限制值。

为了解决这个问题,我们需要调整节点的 `net.core.bpf_jit_limit` 限制值。以下是具体的步骤:

1. 登录到出现问题的节点,以 root 用户身份执行以下命令:

# sysctl net.core.bpf_jit_limit=452534528

 这里,我们将 `net.core.bpf_jit_limit` 的值设置为 452534528。

2. 确认修改已生效。再次执行以下命令:

# cat /proc/sys/net/core/bpf_jit_limit

如果输出结果为 `452534528`,则说明修改已成功生效。

3. 现在,重新启动受影响的 pod,并检查它们是否能够正常启动。您可以使用以下命令来重新启动 pod(假设您的 pod 名称为 `my-pod`):

# kubectl delete pod my-pod

Kubernetes 将会自动重新创建这个 pod,并且现在它应该能够正常启动。

通过这些步骤,您应该能够解决 pod 无法启动的问题。这个解决方法来源于 https://github.com/awslabs/amazon-eks-ami/issues/1179,并已经被广泛验证和采用。

原因分析

为了更好地理解问题的原因,让我们稍微了解一下 seccomp 和 `net.core.bpf_jit_limit` 的背景信息。

seccomp 简介

seccomp(Secure Computing Mode)是一个 Linux 内核功能,可用于过滤进程对系统调用的访问。它允许管理员定义哪些系统调用可以在进程中执行,从而增强系统的安全性。

Kubernetes 使用 seccomp 来限制容器内部发起的系统调用。这种限制确保了容器的运行环境的安全性。

net.core.bpf_jit_limit 简介

`net.core.bpf_jit_limit` 是一个内核参数,用于限制伴随程序过滤器(BPF)即时编译的大小。BPF 是一个灵活且功能强大的机制,它允许用户在内核中执行自定义程序。

在本文中,我们特别关注与 seccomp 相关的 BPF 过滤器。当 Kubernetes 尝试加载 seccomp 过滤器时,会使用 BPF 进行实时编译。然而,内核对 BPF 程序的大小有一定的限制,即由 `net.core.bpf_jit_limit` 参数控制。

如果 BPF 程序的大小超过了限制值,就会出现 ”unable to init seccomp” 错误,从而导致 pod 无法正常启动。

调整 net.core.bpf_jit_limit 的原因

为了更好地理解问题的来源,我们需要知道为什么节点上的 `net.core.bpf_jit_limit` 参数会成为限制因素。

Kubernetes 在部署 pod 时需要加载 seccomp 过滤器,并根据容器的要求生成适当的 BPF 程序。但是,这些 BPF 程序的大小取决于容器所需的系统调用规则和策略。

在某些情况下,特别是当容器的安全策略非常复杂时,生成的 BPF 程序可能会非常大。这就会导致 BPF 程序的大小超出了节点上的 `net.core.bpf_jit_limit` 限制,从而引发了问题。

幸运的是,我们可以通过调整 `net.core.bpf_jit_limit` 参数来扩大 BPF 程序的大小限制,从而解决这个问题。

结论

当 k8s pod 无法启动并且出现 ”unable to init seccomp” 错误时,这很可能是由于节点的 `net.core.bpf_jit_limit` 限制导致的。通过修改该参数的值,我们可以解决这个问题。

在本文中,我们提供了详细的步骤和原因分析,以帮助您解决这个问题。请记住,在进行任何内核参数的更改之前,请确保您有足够的权限和对系统的充分了解。

希望本文对您解决 k8s pod 无法启动问题提供了帮助,并增进了您对 seccomp 和 `net.core.bpf_jit_limit` 的理解。如果您有任何疑问或需要进一步的协助,请随时在评论区留言,我将尽力回答。谢谢! 文章来源地址 https://www.toymoban.com/diary/problem/647.html

 参考:github.com/awslabs/amazon-eks-ami/issues/1179

到此这篇关于解决 k8s pod 无法启动:”unable to init seccomp” 问题,附带详细步骤和原因分析的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!

原文地址:https://www.toymoban.com/diary/problem/647.html

如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计2571字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)