Kubernetes中Deployment如何同时配置只读代码目录和可写日志目录?
问题根因
- 错误使用
allowedHostPaths配置:该配置仅用于校验Pod中显式声明的hostPath类型卷是否符合权限规则,既不会自动为Pod挂载目录,也不会修改镜像内置路径的读写属性。你开启了readOnlyRootFilesystem: true,整个容器根文件系统默认只读,未单独挂载的/code/logs路径自然无法写入。 - ServiceAccount绑定错误:RoleBinding中
subjects.kind写为User,但你要授权的是名为my-app-sa的服务账号,类型应为ServiceAccount,导致PSP规则实际未生效。 - 目录权限不匹配:Dockerfile中用root用户创建的
/code/logs目录,默认权限仅root可写,你设置的运行用户为1000,没有写入权限。
可行解决方案
方案采用emptyDir卷做临时日志存储,不需要持久化、不需要挂载节点路径,符合只读根文件系统的安全要求,步骤如下:
1. 修改Dockerfile,修正目录权限
在创建logs目录后增加权限配置,适配你的运行用户和fsGroup:
FROM python:3.9.7-alpine3.14 RUN mkdir -p /code/logs # 新增行:给logs目录配置组可写权限,适配你设置的fsGroup 2000 RUN chgrp -R 2000 /code/logs && chmod -R 775 /code/logs WORKDIR /code COPY requirements.txt . RUN pip install --upgrade pip RUN pip install -r requirements.txt COPY src/ . CMD [ "python", "code.py"]
修改完成后重新构建镜像即可。
2. 修正RoleBinding的授权配置
将subject的类型改为ServiceAccount:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: manage-app namespace: default subjects: # 修改kind为ServiceAccount - kind: ServiceAccount name: my-app-sa apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: psp:restricted apiGroup: rbac.authorization.k8s.io
3. 修改Deployment配置,挂载emptyDir到日志路径
在Pod模板中增加卷声明,挂载到/code/logs路径:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: selector: matchLabels: app: orbservice template: metadata: labels: app: orbservice spec: serviceAccountName: my-app-sa securityContext: runAsUser: 1000 runAsGroup: 3000 fsGroup: 2000 # 新增卷声明 volumes: - name: log-volume emptyDir: {} containers: - name: my-app image: app:v0.0.1 # 新增卷挂载 volumeMounts: - name: log-volume mountPath: /code/logs resources: limits: memory: "128Mi" cpu: "500m" livenessProbe: exec: command: - python - check_logs.py initialDelaySeconds: 60 periodSeconds: 30 failureThreshold: 1
4. (可选)清理PSP冗余配置
你不需要使用hostPath卷,可以删除PSP中的allowedHostPaths部分配置,避免冗余。
内容的提问来源于stack exchange,提问作者boblerbob
相关产品推荐
相关产品推荐

