You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GKE中部署kube-bench:使用emptyDir替代只读目录的影响

在GKE中使用emptyDir替代hostPath解决kube-bench挂载只读文件系统问题

先解决当前容器启动报错

你遇到的mkdir /srv/kubernetes: read-only file system错误,是因为kube-bench镜像的根文件系统为只读模式,Kubernetes尝试在只读层创建挂载目录时失败。解决这个问题的直接方法是在启动kube-bench前手动创建所需目录,修改容器的command字段:

command: ["sh", "-c", "mkdir -p /srv/kubernetes /opt/cni/bin && kube-bench --httpoutput=true"]

容器启动时会先在可写层创建这两个目录,再挂载emptyDir,规避只读文件系统的限制。

emptyDir的具体使用方式

你当前的配置已经正确声明了emptyDir类型的Volume,核心配置片段如下:

# volumes部分
- name: srv-kubernetes
  emptyDir: {}
- name: opt-cni-bin
  emptyDir: {}

# volumeMounts部分
- name: srv-kubernetes
  mountPath: /srv/kubernetes/
  readOnly: true
- name: opt-cni-bin
  mountPath: /opt/cni/bin/
  readOnly: true

emptyDir: {}表示使用默认配置:以节点本地磁盘为存储介质,Pod启动时自动创建空目录,Pod销毁时自动清除所有内容。如果需要用内存存储临时小文件(性能更高),可以修改为:

emptyDir:
  medium: Memory

使用emptyDir的影响

  1. 测试项失效:kube-bench原本需要读取节点上/srv/kubernetes(证书、集群配置)和/opt/cni/bin(CNI插件)的真实文件完成合规检查。改用emptyDir后,这些目录为空,对应的测试项会直接失败,无法反映集群真实状态。
  2. 数据无持久化:emptyDir是Pod级别的临时存储,每次CronJob运行的Pod结束后,目录内所有数据都会被清除,无法留存测试临时文件。
  3. 资源占用:默认使用节点本地磁盘,会占用节点存储资源,但因CronJob的Pod是一次性任务,结束后资源会自动释放;若使用内存介质,需注意内存容量限制,避免触发OOM。

GKE环境的替代建议

GKE作为托管集群,部分节点系统目录受保护无法直接挂载,更推荐以下方案:

  • 使用kube-bench的GKE专用测试配置:kube-bench内置针对GKE的测试集,无需挂载节点目录,只需确保Pod具备足够API权限。
  • 调整测试范围:通过--skip-tests参数跳过依赖这些目录的测试项,比如跳过节点和CNI相关检查。
  • 借助K8s API获取配置:给kube-bench的Pod绑定ClusterRole,让它通过Kubernetes API读取集群配置,替代直接挂载节点文件。

内容的提问来源于stack exchange,提问作者Ajinkya16

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:40:44