在 Tekton 中使用自定义镜像时遇到容器创建失败的问题
目录
问题描述
在 Tekton pipeline 中,使用产品提供的镜像时能够正常运行,但使用用户自定义镜像时,可能会遇到 TaskRun 执行失败的情况。
错误表现
-
TaskRun 执行失败,状态为
False,原因是CreateContainerConfigError: -
TaskRun 事件中显示错误信息:
-
相关 Pod 事件显示错误信息:
根因分析
此类问题通常由以下两种原因导致:
- 镜像本身存在问题。
- 镜像与 Task 配置不兼容。
故障排查
如果该问题仅在使用自定义镜像时出现,建议按照以下步骤排查:
-
验证镜像本身是否存在问题:
-
检查 Task 配置与镜像的兼容性:
- 检查 Task 是否配置了
runAsNonRoot: true。 - 检查镜像默认用户是否为 root 或非数字用户 ID。
- 检查 Task 是否配置了
示例 Task 配置:
示例 Dockerfile 配置:
解决方案
方案一:调整镜像构建配置,将默认用户设置为非 root 用户
前提条件
- 具备重建镜像的环境和权限。
步骤
参考调整 Dockerfile 以兼容 Task 的自定义镜像修改 Dockerfile 配置。
方案二:修改 TaskRun 或 PipelineRun 执行配置
前提条件
- 具备修改 TaskRun 或 PipelineRun 的权限。
步骤
-
单独执行 TaskRun 时添加配置:
-
执行 PipelineRun 时添加配置:
方案三:修改全局 Tekton 配置
前提条件
- 具备集群操作权限。
- 具备修改 TektonConfig 资源的权限。
- 注意:该配置会影响所有 Task。
步骤
-
修改 TektonConfig 资源: 增加以下
spec.pipeline.default-pod-template配置: -
验证配置是否生效:
方案四:修改 Task 定义
前提条件
- 具备修改 Task 的权限。
- 注意:该配置会影响所有使用该 Task 的 TaskRun 或 PipelineRun。
步骤
-
方法一:移除 runAsNonRoot 配置:
-
方法二:添加 runAsUser 配置:
防止错误发生
-
镜像构建
- 优先使用非 root 用户构建镜像。
- 统一使用 UID 65532 作为非 root 用户。
- 确保应用能够在非 root 用户下正常运行。
-
Task 配置
- 根据安全需求决定是否启用
runAsNonRoot。 - 如需启用,合理配置
runAsUser。
- 根据安全需求决定是否启用
-
权限管理
- 遵循最小权限原则。
- 预先规划目录权限。
- 定期审查权限配置。