在 run-script Task 中使用自定义镜像时遇到权限不够的问题
目录
问题描述
在 Tekton 的 run-script Task 中使用自定义镜像时,可能会遇到操作文件权限不够的问题。这种情况通常发生在 Task 配置了非 root 用户运行,而自定义镜像中的应用程序需要 root 权限才能正常执行,或者镜像中不存在编号为 65532 的非 root 用户。
错误表现
TaskRun 执行失败,Pod 日志中显示权限不足:
根因分析
该问题通常由以下原因导致:
run-script
Task 中配置了 runAsUser: 65532
,导致 Pod 强制以非 root 用户运行。
- 自定义镜像中的应用程序需要 root 权限才能执行某些操作,或者镜像中不存在编号为 65532 的非 root 用户。
- 应用程序尝试访问或修改无权限的目录或文件。
示例 Task 配置:
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: run-script
spec:
steps:
- name: run-script
securityContext:
runAsNonRoot: true
# 这里会强制该 Task 以 65532 号用户运行,目前无其他配置可以覆盖该设置。
runAsUser: 65532
问题排查
如果该问题仅在使用自定义镜像时出现,建议按以下步骤排查:
-
验证镜像本身在 root 用户下是否存在权限不足的问题:
$ docker run -it --rm --user root ${registry} ${cmd}
-
检查应用程序是否允许用户 65532 访问特定目录或文件:
$ docker run -it --rm --user 65532:65532 ${registry} ${cmd} ls -la /path/to/directory
-
检查 Task 的 securityContext 配置:
$ kubectl get task run-script -o yaml | grep -E 'runAsUser|runAsNonRoot'
解决方案
方案一:调整自定义镜像构建配置
前提条件
操作步骤
- 参考 调整 Dockerfile 构建适用于 Task 的自定义镜像 文档,调整 Dockerfile 的配置。
- 确保镜像中的应用程序能够以 65532 用户正常运行。
- 合理设置目录和文件的权限。
方案二:调整应用程序的配置
前提条件
操作步骤
-
设置 HOME
环境变量指向有权限的目录:
# 设置 HOME 环境变量为临时目录
$ export HOME=$(mktemp -d)
# 设置 git 的 safe.directory 配置
$ git config --global --add safe.directory /workspace/source
-
使用应用程序的参数指定配置文件位置:
# 使用 skopeo 的 --authfile 参数指定认证文件位置
$ skopeo --authfile /workspace/auth.json copy docker://${registry}/${image}:${tag} docker://${registry}/${image}:${tag}
方案三:修改 Task 配置
前提条件
操作步骤
-
移除 runAsNonRoot 及 runAsUser 配置:
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: run-script
spec:
steps:
- name: run-script
securityContext:
# runAsNonRoot: true
# runAsUser: 65532
-
或者修改 runAsUser 为有权限的用户:
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: run-script
spec:
steps:
- name: run-script
securityContext:
# runAsNonRoot: true
runAsUser: 0
预防措施
-
镜像构建
- 优先使用非 root 用户构建镜像。
- 统一使用 UID 65532 作为非 root 用户。
- 确保应用程序能够以非 root 用户正常运行。
- 合理设置目录和文件的权限。
-
权限管理
- 遵循最小权限原则。
- 提前规划好目录权限。
- 定期审查权限配置。
- 避免使用 root 用户运行容器。
-
应用程序配置
- 使用环境变量或参数调整配置。
- 避免硬编码文件路径。
- 支持配置文件位置的自定义。
相关内容