Kubernetes:如何在容器中以root权限运行应用程序

3
我使用这个教程在同一台硬件上(Ubuntu 18)安装了Kubernetes的主控节点和工作节点。
Kubernetes版本为1.15.3,docker版本为19.03.2。
我创建的容器运行一个仿真软件,需要root权限并具有对/proc/sys/kernel目录的写访问权限。当Kubernetes启动容器时,在服务脚本/etc/init.d/myservicescript中出现错误,指示无法写入/proc/sys/kernel/xxx。容器运行在Ubuntu 14上。
我尝试在Pod的yaml文件中设置"runAsUser:0",也尝试在Dockerfile中设置"USER 0",但两者都没有起作用。请问如何解决这个问题?

如果您需要访问 /proc/sys/kernel,那么您的程序实际上无法在 Docker 或 Kubernetes 中运行,因为它要求具备接管整个主机的能力。即使是 root 用户也有其局限性。 - David Maze
David Maze:容器没有自己的/proc/sys/kernel吗?如果没有,每个容器如何像在真实操作系统上运行一样操作? - user3102610
Docker不是一个完整的虚拟化系统,所有容器共享主机的内核和相关的主机内核设置。 - David Maze
1个回答

4

在容器内更改用户不会赋予您主机上的任何特权。为了获得升高的特权,您必须在安全上下文中设置 privileged: true

例如:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - "999"
    securityContext:
      privileged: true

我会尝试一下。然而,我认为/proc/sys/kernel是在容器空间内的。如果它属于主机,那么我将无法运行多个相同容器的实例,因为它们都会写入到相同的/proc/sys/kernel/xxxx。 - user3102610
1
不支持特权。我收到了以下错误信息:[ValidationError(Pod.spec.containers):io.k8s.api.core.v1.PodSpec.containers的类型无效:得到“map”,期望“array”;ValidationError(Pod.spec.securityContext):io.k8s.api.core.v1.PodSecurityContext中未知字段“privileged”] - user3102610
1
非常抱歉,我编辑了我的答案。虽然你可以在spec级别和spec.containers级别都设置securityContext,但是privileged: true标志仅支持在spec.containers级别。 - Alassane Ndiaye
是的,我刚刚弄清楚了。现在它通过了那个错误。仍然有另一个错误,我需要找出原因。谢谢Alassane。 - user3102610

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