在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的影响
- 测试项失效:kube-bench原本需要读取节点上
/srv/kubernetes(证书、集群配置)和/opt/cni/bin(CNI插件)的真实文件完成合规检查。改用emptyDir后,这些目录为空,对应的测试项会直接失败,无法反映集群真实状态。 - 数据无持久化:emptyDir是Pod级别的临时存储,每次CronJob运行的Pod结束后,目录内所有数据都会被清除,无法留存测试临时文件。
- 资源占用:默认使用节点本地磁盘,会占用节点存储资源,但因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
相关产品推荐
相关产品推荐

