To use this feature, you (or a cluster administrator) will need to enable the VolumeBindMountOptions feature gate for all relevant components in your cluster.
See Enable Or Disable Feature Gates for more information.
本页展示如何为 Pod 中的卷挂载应用与安全相关的绑定挂载选项(noexec、
nodev、nosuid)。
你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:
你的 Kubernetes 服务器版本必须是 v1.37.要获知版本信息,请输入 kubectl version.
你需要在 API 服务器和 kubelet 上启用 VolumeBindMountOptions
特性门控。容器运行时还必须支持
CRI Mount 消息中的 mount_options 字段。
.spec.containers[*].volumeMounts[*].bindMountOptions 字段接受一组绑定挂载标志。
允许的取值为 noexec、nodev 和 nosuid。
例如,要在 /tmp 处挂载一个带有 noexec 和 nosuid 的 emptyDir 卷,
使得二进制文件无法被执行,并且忽略 set-user-ID 位:
apiVersion: v1
kind: Pod
metadata:
name: bind-mount-options-demo
spec:
containers:
- image: registry.k8s.io/busybox
name: test-container
command: ["sleep", "3600"]
volumeMounts:
- mountPath: /tmp
name: tmp-volume
bindMountOptions:
- noexec
- nosuid
volumes:
- name: tmp-volume
emptyDir: {}
在你的集群上创建 Pod:
kubectl apply -f https://k8s.io/examples/pods/bind-mount-options.yaml
验证 Pod 正在运行:
kubectl get pod bind-mount-options-demo
检查该卷的挂载选项:
kubectl exec bind-mount-options-demo -- mount | grep /tmp
输出的挂载选项中应包含 noexec 和 nosuid。
验证在该挂载上执行二进制文件会失败:
kubectl exec bind-mount-options-demo -- sh -c 'cp /bin/ls /tmp/ls && /tmp/ls'
输出类似于:
sh: /tmp/ls: Permission denied
删除你在本练习中创建的 Pod:
kubectl delete pod bind-mount-options-demo