尽管我是 Kubernetes 集群的新手,但我还是被指派为我的实验室部署和管理一个集群。目前,带有使用 gpu 的 pytorch 容器的 pod(这些将是我设置中最典型的 pod 类型)在集群上运行良好,尽管存在一些权限问题:
- 例如,一个用户
tom
可以删除另一个用户部署的 podjerry
。 - 容器以 的身份运行
root
。我们再举jerry
个例子。假设jerry
部署了一个 pod,其容器清单中挂载了一个目录,其中包含其他用户拥有的文件。以 身份运行意味着root
不仅jerry
可以修改自己的文件,还可以修改 拥有的文件,tom
甚至是spike
和拥有的文件tyke
。这样的清单可能看起来像这样:
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
namespace: default # this field should be properly configured
# if I want to restrict user access to certain resources,
# usually pods.
spec:
runtimeClassName: nvidia
nodeSelector:
nvidia.com/gpu: 'true'
restartPolicy: Never
containers:
- name: cuda-container
image: mylab.registry:5000/espnet/espnet:gpu-latest
command:
- /bin/sh
- -c
- |
echo "running following scripts"
ls /data
ls /exp
nvidia-smi
resources:
limits:
nvidia.com/gpu: 4
volumeMounts:
- name: data-volume
mountPath: /data
- name: exp-volume
mountPath: /exp
volumes:
- name: data-volume
hostPath:
path: /data
- name: exp-volume
hostPath:
path: /exp # where directories owned by tom, jerry,
# spike and tyke are located.
# on the host machine, this directory is actually
# a mounted nfs path served by other machine.
其实 Kubernetes 确实为我提供了解决这些问题的武器,确切地说,RBAC和安全上下文。似乎可以通过创建多个命名空间或分层命名空间并为不同角色配置正确的命名空间权限来解决第一个问题,但我还不确定这是否有效。
但是,对于第二个问题,安全上下文允许容器以非 root 模式运行,并且只能访问某些文件,尽管有些(实际上,从互联网上拉取的太多)镜像必须以 root 模式运行,因此需要重建。但是,似乎我最终只能依靠用户的良好行为来仅部署securityContext
清单中具有正确字段的 pod。
作为集群管理员,我该怎么做才能避免上述 2 个权限问题?是否有任何 kubernetes 插件可供我自动处理权限?或者,当所有选项都用尽时,我是否应该部署一个系统范围的程序来拦截每个kubectl apply
命令、覆盖清单并应用修改后的版本?