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

GitLab 依靠对象存储来存储 Kubernetes 中的高可用持久数据。默认情况下,名为 minio 的 S3 兼容存储解决方案与 chart 一起部署,但对于生产环境质量的部署,我们建议使用托管对象存储解决方案,如 Google Cloud Storage 或 AWS S3。

要禁用 MinIO,请设置此选项,然后按照以下文档进行操作:

--set global.minio.enabled=false

完整配置示例已在示例文档中提供。

本文档指定了 AWS 的访问和 secret 密钥的使用。

S3 加密

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

这两个选项并不相互排斥。您可以设置默认加密策略,还可以启用服务器端加密 header 来覆盖这些默认值。

Azure Blob 存储

对于 Azure 的 Blob 存储的直接支持可用于上传附件, CI 作业产物, LFS, 和其它对象类型支持的统一设置。在早期的版本中,需要 Azure MinIO 网关

note极狐GitLab 不支持 Azure MinIO 网关作为 Docker Registry 的存储。 设置 Docker Registry时,请参考对应的 Azure 示例

尽管 Azure 使用“容器”一词来表示 Blob 的集合,但 GitLab 对术语“桶”进行了标准化。

Azure Blob 存储需要使用统一的对象存储设置。必须跨多个 Azure blob 容器使用单个 Azure 存储账户名称和密钥。不允许使用对象类型(例如,artifactsuploads 等)自定义的单个 connection 设置。

若要启用 Azure Blob 存储,请参阅 rails.azurerm.yaml。以定义 Azure connection为例,您可以通过以下方式将其加载为机密:

kubectl create secret generic gitlab-rails-storage --from-file=connection=rails.azurerm.yml

然后,禁用 MinIO 并设置这些全局设置:

--set global.minio.enabled=false
--set global.appConfig.object_store.enabled=true
--set global.appConfig.object_store.connection.secret=gitlab-rails-storage

请确保创建 Azure 容器为默认名称或在存储桶配置中设置容器名称

note如果您遇到请求失败并显示 Requests to the local network are not allowed,请参阅 故障排除部分

Docker Registry 镜像

registry chart 的对象存储配置是通过 registry.storage 键和 global.registry.bucket 键完成的。

--set registry.storage.secret=registry-storage
--set registry.storage.key=config
--set global.registry.bucket=bucket-name

注意:存储桶名称需要在 secret 和 global.registry.bucket 中设置。secret 用于 registry 服务器,全局配置用于 GitLab 备份。

根据 registry chart 文档 创建 secret,然后配置 chart 以使用此 secret。

S3 示例(S3 兼容存储,但不支持 Azure MinIO 网关,查看 Azure Blob Storage), AzureGCS 驱动配置可以在 examples/objectstorage 中找到。

Registry 配置

  1. 决定使用哪个存储服务。
  2. 将适当的文件复制到 registry-storage.yaml
  3. 使用正确的环境值进行编辑。
  4. 按照 registry chart 存储文档 创建 secret。
  5. 按照文档配置 chart。

LFS, Artifacts, Uploads, Packages, External Diffs, Terraform State, Dependency Proxy, Secure Files

LFS、产物、上传文件、软件包、外部差异、Terraform state、安全文件和 pseudonymizer 的对象存储配置通过以下键完成:

  • global.appConfig.lfs
  • global.appConfig.artifacts
  • global.appConfig.uploads
  • global.appConfig.packages
  • global.appConfig.externalDiffs
  • global.appConfig.dependencyProxy
  • global.appConfig.terraformState
  • global.appConfig.ciSecureFiles

注意:

  • 您必须为存储桶配置中的默认名称或自定义名称创建存储桶。
  • 目前,每个都需要不同的存储桶,否则从备份执行还原将无法正常运行。
  • 默认情况下不启用在外部存储上存储 MR 差异。 因此,要使 externalDiffs 的对象存储设置生效,global.appConfig.externalDiffs.enabled 键应该具有 true 值。
  • 默认情况下不启用依赖代理功能。 因此,要使 dependencyProxy 的对象存储设置生效,global.appConfig.dependencyProxy.enabled 键应具有 true 值。

以下是配置选项的示例:

--set global.appConfig.lfs.bucket=gitlab-lfs-storage
--set global.appConfig.lfs.connection.secret=object-storage
--set global.appConfig.lfs.connection.key=connection

--set global.appConfig.artifacts.bucket=gitlab-artifacts-storage
--set global.appConfig.artifacts.connection.secret=object-storage
--set global.appConfig.artifacts.connection.key=connection

--set global.appConfig.uploads.bucket=gitlab-uploads-storage
--set global.appConfig.uploads.connection.secret=object-storage
--set global.appConfig.uploads.connection.key=connection

--set global.appConfig.packages.bucket=gitlab-packages-storage
--set global.appConfig.packages.connection.secret=object-storage
--set global.appConfig.packages.connection.key=connection

--set global.appConfig.externalDiffs.bucket=gitlab-externaldiffs-storage
--set global.appConfig.externalDiffs.connection.secret=object-storage
--set global.appConfig.externalDiffs.connection.key=connection

--set global.appConfig.terraformState.bucket=gitlab-terraform-state
--set global.appConfig.terraformState.connection.secret=object-storage
--set global.appConfig.terraformState.connection.key=connection

--set global.appConfig.dependencyProxy.bucket=gitlab-dependencyproxy-storage
--set global.appConfig.dependencyProxy.connection.secret=object-storage
--set global.appConfig.dependencyProxy.connection.key=connection

--set global.appConfig.ciSecureFiles.bucket=gitlab-ci-secure-files
--set global.appConfig.ciSecureFiles.connection.secret=object-storage
--set global.appConfig.ciSecureFiles.connection.key=connection

请参阅appConfig charts/全局配置文档的全部细节。

根据 connection 详细文档 创建 secret, 然后配置 chart 以使用这些 secret。注意它们可以使用相同的 secret。

S3 (S3 兼容存储,但不支持 Azure MinIO 网关,查看 Azure Blob Storage) 和 Google 提供商的示例可以在 examples/objectstorage 中找到。

appConfig 配置

  1. 决定使用哪个存储服务。
  2. 将适当的文件复制到rails.yaml
  3. 使用正确的环境值进行编辑。
  4. 按照 connection 详细文档 创建 secret。
  5. 按照文档配置 chart。

备份

备份也存储在对象存储中,并且必须配置为指向外部而不是包含的 MinIO 服务。备份/恢复过程使用两个单独的存储桶。用于存储备份的存储桶 (global.appConfig.backups.bucket) 以及用于在还原过程中保留现有数据的临时存储桶 (global.appConfig.backups.tmpBucket)。 支持的存储后端包括 AWS S3 兼容的对象存储系统、Google Cloud Storage 和 Azure Blob 存储。 后端类型可通过将 global.appConfig.backups.objectStorage.backend 分别设置为 s3azuregcs 来配置。还必须提供通过 gitlab.task-runner.backups.objectStorage.config 键的连接配置。使用 Google Cloud Storage 时,必须使用 global.appConfig.backups.objectStorage.config.gcpProject 值设置 GCP 项目。

对于 S3 兼容存储:

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

--set global.appConfig.backups.bucket=gitlab-backup-storage
--set global.appConfig.backups.tmpBucket=gitlab-tmp-storage
--set gitlab.toolbox.backups.objectStorage.backend=gcs
--set gitlab.toolbox.backups.objectStorage.config.gcpProject=my-gcp-project-id
--set gitlab.toolbox.backups.objectStorage.config.secret=storage-config
--set gitlab.toolbox.backups.objectStorage.config.key=config

对于 Azure Blob 存储:

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

查看备份/恢复对象存储文档获取详细信息。

note要从其它对象存储位置备份或恢复文件,需要将配置文件配置为具有足够权限以读取/写入所有 GitLab 存储桶的用户身份进行身份验证。

备份存储示例

  1. 创建 storage.config 文件:

    • 在 Amazon S3 上,内容应为 s3cmd 配置文件格式

      [default]
      access_key = BOGUS_ACCESS_KEY
      secret_key = BOGUS_SECRET_KEY
      bucket_location = us-east-1
      multipart_chunk_size_mb = 128 # default is 15 (MB)
      
    • 在 Google Cloud Storage 上,您可以通过创建具有 storage.admin 角色的服务账户,然后创建服务账户密钥。以下是使用 gcloud CLI 创建文件的示例。

      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 存储

      [default]
      # Setup endpoint: hostname of the Web App
      host_base = https://your_minio_setup.azurewebsites.net
      host_bucket = https://your_minio_setup.azurewebsites.net
      # Leave as default
      bucket_location = us-west-1
      use_https = True
      multipart_chunk_size_mb = 128 # default is 15 (MB)
      
      # Setup access keys
      # Access Key = Azure Storage Account name
      access_key = BOGUS_ACCOUNT_NAME
      # Secret Key = Azure Storage Account Key
      secret_key = BOGUS_KEY
      
      # Use S3 v4 signature APIs
      signature_v2 = False
      
  2. 创建 secret

    kubectl create secret generic storage-config --from-file=config=storage.config
    

故障排除

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)的出站请求