OCI运行时执行失败:执行失败:无法启动容器进程:打开/dev/pts/0:操作不允许:未知错误。

11
我已经阅读了许多类似于我的问题的链接,但是它们都没有帮助我解决这个问题。
类似链接:
  1. 由于执行 'systemctl daemon-reload' 后的权限问题,无法进入容器。
  2. OCI 运行时执行失败:执行失败,无法启动容器进程:打开 /dev/pts/0:操作不允许:未知错误。
  3. CI 运行时执行失败:执行失败,无法启动容器进程:打开 /dev/pts/0:操作不允许:未知错误。
  4. OCI 运行时执行失败:执行失败,无法启动容器进程:打开 /dev/pts/0:操作不允许:未知错误。
  5. 无法执行 docker exec。
  6. OCI 运行时执行失败:执行失败,容器_linux.go:348:启动容器进程导致 "打开 /proc/self/fd:没有该文件或目录":未知错误。
问题描述:
我使用Kubespray创建了一个新的Kubernetes集群。当我想在其中一个容器中执行一些命令时,遇到了以下错误:
执行的命令:
kubectl exec -it -n rook-ceph rook-ceph-tools-68d847b88d-7kw2v -- sh

错误:
OCI运行时执行失败:执行失败:无法启动容器进程:打开/dev/pts/1:操作不允许:未知命令以退出代码126终止
我还登录到运行Pod的节点上,并尝试使用docker exec命令执行容器,但错误没有改变。
解决方法:
据我所发现,错误代码(126)意味着权限不足,但我在Docker或Kubernetes中没有遇到过这种错误(比如执行`sh`)。
我还检查了`SELinux`是否启用(正如第三个链接中所说)。
```bash apt install policycoreutils sestatus # 输出 SELinux status: disabled ```
在第五个链接中,建议检查是否已更新内核,但我在节点上没有升级任何内容。
```bash id; stat /dev/pts/0 # 输出 uid=0(root) gid=0(root) groups=0(root) File: /dev/pts/0 Size: 0 Blocks: 0 IO Block: 1024 character special file Device: 18h/24d Inode: 3 Links: 1 Device type: 88,0 Access: (0600/crw-------) Uid: ( 0/ root) Gid: ( 5/ tty) Access: 2022-08-21 12:01:25.409456443 +0000 Modify: 2022-08-21 12:01:25.409456443 +0000 Change: 2022-08-21 11:54:47.474457646 +0000 Birth: - ```
我还尝试了使用`/bin/sh`代替`sh`或`/bin/bash`,但没有起作用,仍然出现相同的错误。
有人能帮我找出这个问题的根本原因并解决它吗?

1
kubectl run debug --image=alpine -i --tty -- sh 你能检查一下这个命令是否可行吗? - Adiii
@Adiii 它可以工作,但无法执行现有的 pod,例如 rook-ceph-tools-68d847b88d-7kw2v,我在这里提到了它。 - Mostafa Ghadimi
有任何卷挂载吗?镜像是否支持您的平台?k describe node node_name | grep "kubernetes.io/arch" - Adiii
你能否编辑一下问题,包括一个 MCVE(最小可复现例);需要什么应用程序代码来重现这个问题?你认为这是一个已有问题的重复吗(链接在 https://dev59.com/N8Xsa4cB1Zd3GeqPOgT7 中)?或者你认为这与你安装集群的方式有关(在这种情况下,像 sf 这样的另一个网站可能更合适)? - David Maze
尝试使用 kubectl exec -i -n rook-ceph rook-ceph-tools-68d847b88d-7kw2v -- sh 命令,不要加上 -t 参数。这样你可能会得到一个没有 tty 的运行中的 shell。在空提示符下进行测试,例如输入 dateexit。 如果可以正常工作,那么你遇到了 runc 的一个 bug,需要更新到 v1.1.4 版本。 - D. Lohrsträter
显示剩余4条评论
2个回答

7

这个问题可能与Docker有关,首先使您的节点处于无工作负载状态(即“drain”)。

kubectl drain <node-name>

其次,SSH到节点并重新启动docker服务。

systemctl restart docker.service

最后尝试执行您的命令。


如果您正在使用Docker Compose,将容器关闭并重新启动也可以解决问题。我的问题是什么可能导致Docker这样做? - Erich
@Erich 我不确定这是否与 Docker 相关,但这个解决方案可以解决他的问题。 - Xirehat
3
看起来这是 runc 1.1.3 中的一个错误,已经被修复了。我在我的机器上升级了 containerd,自那以后就没有遇到这个问题了。https://github.com/opencontainers/runc/pull/3554 - Erich
@Erich 绝对不只是Docker。我在runc下使用Podman也遇到了这个问题。我使用的是Almalinux 8,其中包含runc 1.1.3。希望runc 1.1.4很快就会出现。我以为这是Cockpit的Podman插件中的一些错误,但看来不是这样... - Ungeheuer

0
我在大约三个月后找到了根本原因。Kubespray已被用于安装集群。在安装OCI(在我的情况下是Docker)时,Kubespray存在一个奇怪的bug。Docker的配置未被应用,并且更改未被正确应用。@xirehat建议重新启动Docker作为解决Kubespray问题的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接