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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:39:00