我们最近将 GitLab 和 GitLab Runner 升级到版本 16.x,并尝试实施 AWS S3 Cache 进行缓存,但这不起作用。我遵循了这个官方文档这里。我们正在使用 Helm 在 AWS EKS Kubernetes 集群上运行 GitLab Runner。
以下是我们在作业中看到的错误:
No URL provided, cache will not be uploaded to shared cache server. Cache will be stored only locally.
这就是我们的 GitLab 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
我们的 GitLab Runner 节点(AWS EC2 实例)已经具有 AWS IAM 角色,并且我们还在 Kubernetes 上为 GitLab Runner pod 提供了服务、角色和角色绑定,这些是通过在 Helm 的值文件中设置以下内容来创建的:
rbac:
create: true
我们的作业能够使用节点(AWS EC2 实例)角色访问 AWS,但由于某种原因,它无法与 AWS S3 一起使用。我们的 AWS EKS Kubernetes 集群上也启用了 OIDC。
注:REDACTED指已被审查的机密值,实际使用时应更换。
经过一番研究,我找到了解决方案。我们需要为 GitLab Runner pod 创建一个单独的 AWS IAM 角色,该角色将与 Kubernetes 中的服务帐户关联。
以下是 AWS IAM 角色的信任关系策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::[AWS_ACCOUNT_ID]:oidc-provider/oidc.eks.[AWS_ACCOUNT_REGION].amazonaws.com/id/[AWS_EKS_OIDC_ID]"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.[AWS_ACCOUNT_REGION].amazonaws.com/id/[AWS_EKS_OIDC_ID]:sub": "system:serviceaccount:[AWS_EKS_KUBERNETES_NAMESPACE_NAME]:[AWS_EKS_KUBERNETES_SERVICE_ACCOUNT_NAME]",
"oidc.eks.[AWS_ACCOUNT_REGION].amazonaws.com/id/[AWS_EKS_OIDC_ID]:aud": "sts.amazonaws.com"
}
}
}
]
}
以下是 AWS IAM 角色的权限策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::[AWS_S3_BUCKET_NAME]",
"arn:aws:s3:::[AWS_S3_BUCKET_NAME]/*",
]
}
]
}
注意:
[...]
之间的所有值均应替换为正确的实际值。
以下是 Helm 值文件中所做的更改:
rbac:
create: true
serviceAccountAnnotations:
eks.amazonaws.com/role-arn: "_REDACTED_"
参考资料:
注:REDACTED指已被审查的机密值,实际使用时应更换。