极狐 GitLab

使用外部对象存储配置 GitLab chart

使用外部对象存储配置 GitLab Helm chart,这是生产部署所必需的。

极狐GitLab 依赖对象存储在 Kubernetes 中提供高可用的持久化数据。极狐GitLab 支持两种针对主流云对象存储提供商的认证方法:静态凭证和通过云特定服务获取的临时凭证。

静态凭证#

这些凭证是所有提供商长期有效的访问密钥和密钥:

  • AWS S3:访问密钥 ID + 秘密访问密钥
  • Google Cloud Storage:服务账号 JSON 密钥文件
  • Azure Blob Storage:存储账号名称 + 访问密钥,或客户端 ID + 租户 ID + 客户端密钥

通过 Cloud IAM 获取临时凭证#

极狐GitLab 可以获取提供商特定的工作负载身份机制,以使用动态、短期有效的凭证:

这些临时凭证机制通过以下方式提高安全性:

  • 消除长期有效的静态凭证。
  • 提供自动凭证轮换。
  • 支持细粒度访问控制。
  • 支持凭证使用的审计日志记录。
  • 与云提供商 IAM 策略集成。

Azure Blob Storage#

Azure Blob 存储的直接支持适用于 上传的附件、CI 作业产物、LFS 以及通过合并设置支持的其他对象类型。在以前的极狐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的示例。您可以通过以下方式将其作为密钥加载:

shell
kubectl 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 以使用此密钥。

S3(兼容 S3 的存储,但不支持 Azure MinIO 网关,请参阅 Azure Blob Storage)、Azure 和 GCS 驱动程序的示例可以在 examples/objectstorage中找到。

Registry 配置#

  1. 决定使用哪种存储服务。
  2. 将相应的文件复制到 registry-storage.yaml。
  3. 根据环境编辑正确的值。
  4. 按照 registry chart 的存储文档创建密钥。
  5. 按照文档配置 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。

以下是配置选项的示例:

shell
1--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 以使用所提供的密钥。请注意,所有对象类型都可以使用同一个密钥。

AWS(任何兼容 S3 的存储,例如使用 MinIO 的 Azure)和 Google 提供商的示例可以在 examples/objectstorage中找到。

S3 加密#

极狐GitLab 支持使用 Amazon KMS 来加密存储在 S3 桶中的数据。 您可以通过两种方式启用此功能:

这两个选项并不互斥。您可以设置默认加密策略,同时启用服务器端加密请求头来覆盖这些默认设置。

有关更多详情,请参阅极狐GitLab 关于加密 S3 桶的文档。

appConfig 配置#

  1. 决定使用哪种存储服务。
  2. 将相应的文件复制到 rails.yaml。
  3. 根据环境编辑正确的值。
  4. 按照连接详情文档创建密钥。
  5. 按照文档配置 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:

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):

shell
1--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 桶的用户身份进行认证。

备份存储示例#

  1. 创建 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 创建该文件的示例。

      shell
      export 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 上

      toml
      1[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
  2. 创建密钥

    shell
    kubectl 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:

  1. 设置 Cloud CDN 以使用产物桶作为后端。

  2. 创建用于签名 URL 的密钥。

  3. 授予 Cloud CDN 服务账号从桶中读取的权限。

  4. 使用 rails.googlecdn.yaml中的示例准备一个包含参数的 YAML 文件。 您需要填写以下信息:

    • url:步骤 1 中 CDN 主机的基础 URL
    • key_name:步骤 2 中的密钥名称
    • key:步骤 2 中的实际密钥
  5. 将此 YAML 文件加载到 cdn 键下的 Kubernetes 密钥中。例如,要创建密钥 gitlab-rails-cdn:

    shell
    kubectl create secret generic gitlab-rails-cdn --from-file=cdn=rails.googlecdn.yml
  6. 将 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)允许 出站请求。