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

解决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

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

领支付宝红包 赞助服务器费用
上一篇 2023年12月31日 12:18
下一篇 2023年12月31日 13:57

相关文章

  • k8s pod 无法启动一直ContainerCreating

    查看详细信息如下 Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container “334d991a478b9640c66c67b46305122d7f0eefc98b2b4e671301f1981d9b9bc6” network for pod “yupay-vip-5c4bb7db5c-s6m52”: networkPlugin cni failed to set up pod “yupay-vip-5c4bb7db5c-s6m52_yupay” network: error getting ClusterInforma

    2024年04月28日
    浏览(38)
  • K8s的Pod出现Init:ImagePullBackOff问题的解决(以calico为例)

    对于这类问题的解决思路应该都差不多,本文以calico插件安装为例,发现有个Pod的镜像没有pull成功 从上图发现是docker拉取\\\"calico/cni:v3.15.1\\\"失败,那么我们手动拉取一下 Note :我们需要知道这个pod是部署在哪个node上,然后才能在具体的Node上拉取镜像 发现是在k8snode1主机上,那

    2024年02月11日
    浏览(50)
  • k8s pod启动报错: no route to host

    查看pod命令 查看报错pod日志 命令: pod报错都一样: no route to host 原因: 找不到这个路由对应的地址,关闭防火墙,重启k8s,执行下面命令即可。 正常线上是不能关闭防火墙,这个属于pod内部之间的host调用失败,有大神知道的这种情况怎么处理的, 可以在评论区告知一下,

    2024年02月13日
    浏览(49)
  • kubeadm init [ERROR ImagePull]: failed to pull image registry.k8s.io 解决方法

    ** https://blog.itwk.cc 由于国内网络原因,kubeadm init部署集群会卡住不动,,报错如下: error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR ImagePull]: failed to pull image registry.k8s.io/kube-apiserver:v1.25.6: output: E0124 00:28:25.369652 3299 remote_image.go:171] “PullImage from image service failed”

    2024年02月11日
    浏览(51)
  • 解决公网下,k8s calico master节点无法访问node节点创建的pod

    目的:解决pod部署成功后,只能在node节点访问,而master节点无法访问 原因:集群搭建时,没有配置公网进行kubectl操作,从而导致系统默认node节点,使用内网IP加入k8s集群!如下: 解决方案:围绕公网IP进行搭建即可,其实就是在传统的搭建步骤下,给master节点和node节点添加

    2024年02月03日
    浏览(55)
  • K8S基本概念+pod生命周期+容器重启策略+Init容器和边车容器+pod探针+postStart和preStop

    Kubernetes是谷歌以Borg为前身,基于谷歌15年生产环境经验的基础上开源的一个项目,Kubernetes致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。 kube-APIServer:集群的控制中枢,各个模块之间信息交互都需要经过Kube-APIServer,同时它也是集群管理、资

    2024年04月15日
    浏览(52)
  • k8s 启动和删除pod

    流程图 运维人员向kube-apiserver发出指令(我想干什么,我期望事情是什么状态) api响应命令,通过一系列认证授权,把pod数据存储到etcd,创建deployment资源并初始化。(期望状态) controller通过list-watch机制,监听api server读取etcd,发现新的deployment,将该资源加入到内部工作队列,发现该

    2024年02月10日
    浏览(52)
  • 主机重启后k8s kubelet无法自动启动问题解决梳理

    OS Version:CentOS Linux release 7.9.2009 (Core) K8S Version:Kubernetes v1.20.4 K8S安装配置完成后,重启服务器发现,kubelet没有正常启动(systemctl status kubelet) 命令: systemctl status kubelet 输入kubectl -n kube-system get pods命令,有如下报错: 命令: kubectl -n kube-system get pods 由于K8S的要求,在部署K8S的服

    2024年02月03日
    浏览(46)
  • 记NVIDIA显卡A100在K8S POD中“Failed to initialize NVML: Unknown Error“问题解决

    因项目原因需要在k8s上跑GPU相关的代码,优选使用NVIDIA A100显卡,但在根据官方文档简单并部署GitHub - NVIDIA/k8s-device-plugin:适用于 Kubernetes 的 NVIDIA 设备插件后,出现了pod中GPU运行一段时间后丢失的问题,进入容器后发现nvidia-smi命令报错\\\"Failed to initialize NVML: Unknown Error\\\"。尝试

    2024年02月08日
    浏览(60)
  • K8s之Pod生命周期、启动停止钩子

    Pod生命周期整个过程 如下图: 1、在启动任何容器之前,前创建 pause 容器,它初始化Pod的环境并为后续加入的容器提供共享名称空间。 2、初始化容器(initContainers):一个Pod可以定义任意个初始化容器,如上图就定义了两个初始化容器,初始化会按照YAML清单中顺序执行,当最

    2024年02月05日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包