GitLab Runner 16.x AWS S3缓存失效问题求助
问题背景
近期将GitLab及GitLab Runner升级至16.x版本,尝试配置AWS S3作为缓存存储,但功能无法正常运行。GitLab Runner部署在AWS EKS集群,通过Helm管理,作业执行时抛出以下错误:
No URL provided, cache will not be uploaded to shared cache server. Cache will be stored only locally.
当前使用的Runner配置(已脱敏):
runners: config: | [[runners]] request_concurrency = 1 [runners.kubernetes] privileged = true namespace = "_REDACTED_" image = "ubuntu:22.04" [runners.kubernetes.node_selector] project = "_REDACTED_" [runners.cache] Type = "s3" Shared = true [runners.cache.s3] ServerAddress = "s3.amazonaws.com" BucketName = "_REDACTED_" BucketLocation = "us-east-1" AuthenticationType = "iam" ServerSideEncryption = "S3" Insecure = false
环境相关信息:
- Runner所在EC2节点已配置IAM角色,作业可通过该角色访问AWS资源
- Helm部署时设置了
rbac: create: true,已为Runner Pod创建Kubernetes Service、Role及RoleBinding - EKS集群已启用OIDC
排查与解决步骤
1. 补充S3缓存的URL参数
GitLab Runner 16.x对S3缓存配置的参数校验更严格,即使使用默认的s3.amazonaws.com,也建议显式指定URL参数。在[runners.cache.s3]块中添加:
URL = "https://s3.amazonaws.com"
2. 确认IAM权限覆盖缓存操作
确保EC2节点的IAM角色拥有目标S3 Bucket的以下权限:
s3:ListBuckets3:GetObjects3:PutObjects3:DeleteObject
可通过AWS IAM控制台验证策略是否正确关联到节点角色。
3. 检查Helm配置是否存在参数冲突
使用Helm部署时,顶层的runners.cache参数可能会覆盖内嵌config块中的配置。确认Helm values文件中没有单独设置如下内容:
# 需避免这类可能冲突的配置 runners: cache: type: s3 # 其他缓存相关参数
所有缓存配置应集中在runners.config的[[runners]]块内。
4. 切换为IRSA方式绑定IAM角色(推荐)
既然EKS已启用OIDC,建议使用IRSA(IAM Roles for Service Accounts)为Runner Pod单独绑定IAM角色,避免节点角色权限过大或权限冲突:
- 创建仅包含S3缓存所需权限的IAM角色
- 将该角色与Runner的Service Account关联
- 确保Runner Pod使用该Service Account
5. 查看Runner Pod日志定位细节错误
通过Kubectl查看Runner Pod的日志,获取更详细的错误信息:
kubectl logs -n <runner-namespace> <runner-pod-name>
日志中可能会暴露签名失败、Bucket不存在、区域不匹配等具体问题。
6. 验证Bucket名称与区域一致性
确认目标S3 Bucket确实位于us-east-1区域,且Bucket名称无拼写错误,避免因配置与实际Bucket信息不匹配导致的失败。
内容的提问来源于stack exchange,提问作者Abdullah Khawer

