kubectl exec执行失败报‘operation not permitted: unknown’问题排查求助
K3s集群中Pods运行正常但kubectl exec报错"open /dev/pts/0: operation not permitted"
问题描述
我在由1个主节点、3个工作节点组成的K3s集群中运行了若干部署Python程序的Pods。初始阶段可正常通过kubectl exec在Pods中执行简单命令,但运行数小时后执行命令时出现如下报错:
$ kubectl exec -it mypod -- bash error: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "37a9f1042841590e48e1869f8b0ca13e64df02d25458783e74d8e8f2e33ad398": OCI runtime exec failed: exec failed: unable to start container process: open /dev/pts/0: operation not permitted: unknown
重启Pods后问题会消失,但我希望找到根本原因以避免频繁重启。目前Pods中的Python程序仍正常运行(kubectl logs输出符合预期),containerd显示容器状态正常,可登录节点查看日志等。该问题最初仅出现在worker2、worker3节点的Pods上,最终所有工作节点的Pods均受影响,推测与节点状态相关,但重启Pods可重置该状态。
请问还需排查哪些内容?为何kubectl exec功能失效但容器仍正常运行?
排查方向
- 节点/dev/pts挂载与资源状态
登录受影响的worker节点,执行mount | grep /dev/pts,确认挂载参数是否包含mode=0620、gid=5(tty组),异常的挂载权限会导致容器无法访问伪终端;同时执行ls /dev/pts | wc -l,检查是否达到系统最大伪终端数(默认通常为4096),资源耗尽会触发此类报错。 - 容器运行时日志
查看worker节点上containerd日志(通常路径/var/log/containerd/containerd.log),搜索报错中的exec ID,定位更详细的权限或资源错误;也可直接用ctr -n k8s.io exec -it <容器ID> bash尝试进入容器,判断问题出在Kubernetes层面还是容器运行时层面。 - 安全模块限制
执行getenforce检查SELinux状态,若为Enforcing模式,用ausearch -m avc -ts recent查看是否有相关拒绝日志;若节点启用AppArmor,执行apparmor_status检查容器对应的profile是否限制了伪终端创建。 - 节点资源耗尽情况
用free -h检查内存是否接近耗尽,内存不足会导致内核无法分配pts设备资源;用df -i检查根文件系统或/dev所在分区的inode是否耗尽,inode不足会无法创建新的pts设备文件。 - K3s与容器运行时版本兼容性
确认当前K3s版本是否存在已知的exec资源泄漏bug,对比官方release notes,排查是否有特定版本组合(K3s+containerd/runc)导致长期运行后出现该问题。
为何exec失效但容器仍正常运行?
容器的主Python进程启动时已打开所需的文件描述符,运行过程中不需要依赖新的伪终端设备。而kubectl exec需要创建新的伪终端(/dev/pts/0)来建立交互式会话,当节点上的pts资源耗尽、权限异常或安全模块阻止访问时,新伪终端无法创建,导致exec失败,但不影响已在运行的主进程。重启Pod会重新申请pts资源,暂时恢复exec功能,但根本问题未解决的话会再次复发。
内容的提问来源于stack exchange,提问作者jersey bean
相关产品推荐
相关产品推荐

