使用外部对象存储配置 GitLab chart
使用外部对象存储配置 GitLab Helm chart,这是生产部署所必需的。
极狐GitLab 在 Kubernetes 中依赖对象存储来提供高可用的持久化数据。 极狐GitLab 支持主流云对象存储提供商的两种认证方式:静态凭据和通过云特定服务获取的临时凭据。
静态凭据
这些凭据是所有提供商长期有效的访问密钥和密钥:
- AWS S3:访问密钥 ID + 秘密访问密钥
- Google Cloud Storage:服务账号 JSON 密钥文件
- Azure Blob Storage:存储账号名称 + 访问密钥,或客户端 ID + 租户 ID + 客户端密钥
通过云 IAM 获取临时凭据
极狐GitLab 可以获取特定提供商的工作负载身份机制,以获得动态、短期的凭据:
- AWS S3:服务账号的 IAM 角色 (IRSA)
- Google Cloud Storage:工作负载身份联合
- Azure Blob Storage:Azure Kubernetes 服务的工作负载身份
这些临时凭据机制通过以下方式提高安全性:
- 消除长期有效的静态凭据。
- 提供自动化的凭据轮换。
- 支持细粒度的访问控制。
- 支持凭据使用的审计日志记录。
- 与云提供商 IAM 策略集成。
Azure Blob Storage
对于上传的附件、CI 作业产物、LFS 以及通过统一设置支持的其他对象类型,可直接支持 Azure Blob 存储。在之前的极狐GitLab 版本中,需要 Azure MinIO 网关。
极狐GitLab 不支持 将 Azure MinIO 网关作为 Docker Registry 的存储。 在设置 Docker Registry 时,请参考相应的 Azure 示例。
尽管 Azure 使用“容器”一词来表示一组 Blob, 但极狐GitLab 统一使用“桶”这一术语。
Azure Blob 存储需要使用 统一的对象存储设置。必须在多个 Azure Blob 容器中使用 单一的 Azure 存储账号名称和密钥。不允许按对象类型(例如,artifacts、uploads 等)自定义单独的 connection 设置。
要启用 Azure Blob 存储,请参阅 rails.azurerm.yaml 作为定义 Azure connection 的示例。您可以通过以下方式将其作为 密钥加载:
shellkubectl create secret generic gitlab-rails-storage --from-file=connection=rails.azurerm.yml
然后,禁用 MinIO 并设置以下全局设置:
shell--set global.minio.enabled=false --set global.appConfig.object_store.enabled=true --set global.appConfig.object_store.connection.secret=gitlab-rails-storage
请务必为默认名称创建 Azure 容器,或在桶配置中设置容器名称。
如果您的请求失败并出现 Requests to the local network are not allowed 错误, 请参阅故障排查部分。
Docker Registry 镜像
registry chart 的对象存储配置通过 registry.storage 键和 global.registry.bucket 键完成。
shell--set registry.storage.secret=registry-storage --set registry.storage.key=config --set global.registry.bucket=bucket-name
桶名称需要在密钥和 global.registry.bucket 中同时设置。该密钥用于 registry 服务器, 而全局设置用于极狐GitLab 备份。
请根据 registry chart 的存储文档 创建密钥,然后配置 chart 以使用此密钥。
可以在 examples/objectstorage 中找到 S3(S3 兼容存储,但不支持 Azure MinIO 网关,请参阅 Azure Blob Storage)、Azure 和 GCS 驱动程序的示例。
Registry 配置
- 决定使用哪种存储服务。
- 将相应的文件复制到 registry-storage.yaml。
- 根据环境编辑正确的值。
- 按照 registry chart 的存储文档 创建密钥。
- 按文档配置 chart。
LFS、产物、上传、软件包、外部差异、Terraform 状态、依赖代理、安全文件、Agent 计划、CI 目录捆绑包
LFS、产物、上传、软件包、外部差异、Terraform 状态、安全文件、Agent 计划、CI 目录捆绑包和假名化器的对象存储配置通过以下键完成:
- global.appConfig.lfs
- global.appConfig.artifacts
- global.appConfig.uploads
- global.appConfig.packages
- global.appConfig.externalDiffs
- global.appConfig.dependencyProxy
- global.appConfig.terraformState
- global.appConfig.ciSecureFiles
- global.appConfig.agentPlanContent
- global.appConfig.ciCatalogBundles
另请注意:
- 您必须为默认名称或桶配置中的自定义名称创建桶。
- 每个都需要一个不同的桶,否则从备份恢复将无法正常工作。
- 默认情况下,不启用将合并请求差异存储在外部存储上,因此, 要使 externalDiffs 的对象存储设置生效, global.appConfig.externalDiffs.enabled 键的值应为 true。
- 默认情况下,不启用依赖代理功能,因此, 要使 dependencyProxy 的对象存储设置生效, global.appConfig.dependencyProxy.enabled 键的值应为 true。
以下是配置选项的示例:
shell1--set global.appConfig.lfs.bucket=gitlab-lfs-storage 2--set global.appConfig.lfs.connection.secret=object-storage 3--set global.appConfig.lfs.connection.key=connection 4 5--set global.appConfig.artifacts.bucket=gitlab-artifacts-storage 6--set global.appConfig.artifacts.connection.secret=object-storage 7--set global.appConfig.artifacts.connection.key=connection 8 9--set global.appConfig.uploads.bucket=gitlab-uploads-storage 10--set global.appConfig.uploads.connection.secret=object-storage 11--set global.appConfig.uploads.connection.key=connection 12 13--set global.appConfig.packages.bucket=gitlab-packages-storage 14--set global.appConfig.packages.connection.secret=object-storage 15--set global.appConfig.packages.connection.key=connection 16 17--set global.appConfig.externalDiffs.bucket=gitlab-externaldiffs-storage 18--set global.appConfig.externalDiffs.connection.secret=object-storage 19--set global.appConfig.externalDiffs.connection.key=connection 20 21--set global.appConfig.terraformState.bucket=gitlab-terraform-state 22--set global.appConfig.terraformState.connection.secret=object-storage 23--set global.appConfig.terraformState.connection.key=connection 24 25--set global.appConfig.dependencyProxy.bucket=gitlab-dependencyproxy-storage 26--set global.appConfig.dependencyProxy.connection.secret=object-storage 27--set global.appConfig.dependencyProxy.connection.key=connection 28 29--set global.appConfig.ciSecureFiles.bucket=gitlab-ci-secure-files 30--set global.appConfig.ciSecureFiles.connection.secret=object-storage 31--set global.appConfig.ciSecureFiles.connection.key=connection 32 33--set global.appConfig.agentPlanContent.bucket=gitlab-agent-plan-content 34--set global.appConfig.agentPlanContent.connection.secret=object-storage 35--set global.appConfig.agentPlanContent.connection.key=connection 36 37--set global.appConfig.ciCatalogBundles.bucket=gitlab-ci-catalog-bundles 38--set global.appConfig.ciCatalogBundles.connection.secret=object-storage 39--set global.appConfig.ciCatalogBundles.connection.key=connection
有关完整详细信息,请参阅 charts/globals 的 appConfig 文档。
请根据连接详情文档创建密钥,然后配置 chart 以使用提供的密钥。请注意,所有对象类型都可以使用同一个密钥。
可以在 examples/objectstorage 中找到 AWS(任何 S3 兼容,如使用 MinIO 的 Azure)和 Google 提供商的示例。
S3 加密
极狐GitLab 支持 Amazon KMS 来加密存储在 S3 桶中的数据。 您可以通过两种方式启用此功能:
- 在 AWS 中,配置 S3 桶以使用默认加密。
- 在极狐GitLab 中,启用服务器端加密头。
这两个选项并不互斥。您可以设置默认加密策略,也可以启用服务器端加密头来覆盖这些默认值。
有关更多详细信息,请参阅极狐GitLab 关于加密 S3 桶的文档。
appConfig 配置
- 决定使用哪种存储服务。
- 将相应的文件复制到 rails.yaml。
- 根据环境编辑正确的值。
- 按照连接详情文档创建密钥。
- 按文档配置 chart。
备份
备份也存储在对象存储中,并且必须配置为指向外部存储,而不是内置的 MinIO 服务。备份/恢复过程使用两个独立的桶:
- 一个用于存储备份的桶 (global.appConfig.backups.bucket)
- 一个用于在恢复过程中保留现有数据的临时桶 (global.appConfig.backups.tmpBucket)
支持 AWS S3 兼容对象存储系统、Google Cloud Storage 和 Azure Blob Storage 作为后端。您可以通过将 global.appConfig.backups.objectStorage.backend 设置为 s3(用于 AWS S3)、gcs(用于 Google Cloud Storage)或 azure(用于 Azure Blob Storage)来配置后端类型。您还必须通过 gitlab.toolbox.backups.objectStorage.config 键提供连接配置。
使用带有密钥的 Google Cloud Storage 时,必须使用 global.appConfig.backups.objectStorage.config.gcpProject 值设置 GCP 项目。
当 Toolbox 使用其 ServiceAccount 的身份进行身份验证时,不需要连接配置。在这些情况下,请省略 gitlab.toolbox.backups.objectStorage.config:
- 使用服务账号的 IAM 角色 (IRSA) 的 S3。同时向 backup-utility 传递 --s3tool awscli,因为 s3cmd 需要 .s3cfg 文件。
- 使用 GKE 的工作负载身份联合 的 GCS。
chart 不验证备份对象存储配置。配置缺失或不完整会在备份或恢复运行时显现。
对于 S3 兼容存储:
shell--set global.appConfig.backups.bucket=gitlab-backup-storage --set global.appConfig.backups.tmpBucket=gitlab-tmp-storage --set gitlab.toolbox.backups.objectStorage.config.secret=storage-config --set gitlab.toolbox.backups.objectStorage.config.key=config
对于使用密钥的 Google Cloud Storage (GCS):
shell1--set global.appConfig.backups.bucket=gitlab-backup-storage 2--set global.appConfig.backups.tmpBucket=gitlab-tmp-storage 3--set gitlab.toolbox.backups.objectStorage.backend=gcs 4--set gitlab.toolbox.backups.objectStorage.config.gcpProject=my-gcp-project-id 5--set gitlab.toolbox.backups.objectStorage.config.secret=storage-config 6--set gitlab.toolbox.backups.objectStorage.config.key=config
对于使用 GKE 的工作负载身份联合 的 Google Cloud Storage (GCS),只需设置后端和桶。 确保未设置 gitlab.toolbox.backups.objectStorage.config.secret 和 gitlab.toolbox.backups.objectStorage.config.key, 以便集群使用 Google 的应用默认凭据:
shell--set global.appConfig.backups.bucket=gitlab-backup-storage --set global.appConfig.backups.tmpBucket=gitlab-tmp-storage --set gitlab.toolbox.backups.objectStorage.backend=gcs
对于 Azure Blob Storage:
shell--set global.appConfig.backups.bucket=gitlab-backup-storage --set global.appConfig.backups.tmpBucket=gitlab-tmp-storage --set gitlab.toolbox.backups.objectStorage.backend=azure --set gitlab.toolbox.backups.objectStorage.config.secret=storage-config --set gitlab.toolbox.backups.objectStorage.config.key=config
有关完整详细信息,请参阅备份/恢复对象存储文档。
要从其他对象存储位置备份或恢复文件,需要将配置文件配置为以具有足够访问权限的用户身份进行身份验证,以读写所有极狐GitLab 桶。
备份存储示例
-
创建 storage.config 文件:
-
在 Amazon S3 上,内容应为 s3cmd 配置文件格式
toml[default] access_key = AWS_ACCESS_KEY secret_key = AWS_SECRET_KEY bucket_location = us-east-1 multipart_chunk_size_mb = 128 # default is 15 (MB) -
在 Google Cloud Storage 上,您可以通过创建具有 storage.admin 角色的服务账号,然后 创建服务账号密钥 来创建该文件。 以下是使用 gcloud CLI 创建该文件的示例。
shellexport PROJECT_ID=$(gcloud config get-value project) gcloud iam service-accounts create gitlab-gcs --display-name "Gitlab Cloud Storage" gcloud projects add-iam-policy-binding --role roles/storage.admin ${PROJECT_ID} --member=serviceAccount:gitlab-gcs@${PROJECT_ID}.iam.gserviceaccount.com gcloud iam service-accounts keys create --iam-account gitlab-gcs@${PROJECT_ID}.iam.gserviceaccount.com storage.config -
在 Azure Storage 上
toml1[default] 2# Setup endpoint: hostname of the Web App 3host_base = https://your_minio_setup.azurewebsites.net 4host_bucket = https://your_minio_setup.azurewebsites.net 5# Leave as default 6bucket_location = us-west-1 7use_https = True 8multipart_chunk_size_mb = 128 # default is 15 (MB) 9 10# Setup access keys 11# Access Key = Azure Storage Account name 12access_key = AZURE_ACCOUNT_NAME 13# Secret Key = Azure Storage Account Key 14secret_key = AZURE_ACCOUNT_KEY 15 16# Use S3 v4 signature APIs 17signature_v2 = False
-
-
创建密钥
shellkubectl create secret generic storage-config --from-file=config=storage.config
Google Cloud CDN
您可以使用 Google Cloud CDN 来缓存 和获取产物桶中的数据。这有助于提高性能并降低网络出站成本。
Cloud CDN 的配置通过以下键完成:
- global.appConfig.artifacts.cdn.secret
- global.appConfig.artifacts.cdn.key(默认值为 cdn)
要使用 Cloud CDN:
-
创建签名 URL 的密钥。
-
使用 rails.googlecdn.yaml 中的示例准备包含参数的 YAML 文件。 您需要填写以下信息:
- url:步骤 1 中 CDN 主机的基础 URL
- key_name:步骤 2 中的密钥名称
- key:步骤 2 中的实际密钥
-
将此 YAML 文件作为 Kubernetes 密钥加载到 cdn 键下。例如,要创建密钥 gitlab-rails-cdn:
shellkubectl create secret generic gitlab-rails-cdn --from-file=cdn=rails.googlecdn.yml -
将 global.appConfig.artifacts.cdn.secret 设置为 gitlab-rails-cdn。如果您通过 helm 参数进行设置,请使用:
shell--set global.appConfig.artifacts.cdn.secret=gitlab-rails-cdn
故障排查
Azure Blob:URL [FILTERED] is blocked: Requests to the local network are not allowed
当 Azure Blob 主机名解析为 RFC1918(本地/私有)IP 地址 时,会发生此问题。作为变通方法,请为您的 Azure Blob 主机名 (yourinstance.blob.core.windows.net) 允许出站请求。