使用 Praefect chart (alpha)

cautionPraefect chart 仍在开发中。alpha 版本尚不适合生产使用。升级可能需要大量人工干预。

Praefect chart 用于管理使用 Helm chart 部署的 GitLab 安装中的 Gitaly 集群。

已知限制

  1. 数据库必须手动创建。
  2. 集群大小固定:Gitaly 集群目前不支持自动伸缩。
  3. 不支持使用集群内的 Praefect 实例管理集群外的 Gitaly 实例。
  4. 升级到 chart 的 4.8 版本(极狐GitLab 13.8)将遇到一个问题,使其看起来像存储库数据丢失。 数据不会丢失,但需要人工干预。

要求

此 chart 使用 Gitaly chart。global.gitaly 中的设置用于配置此 chart 创建的实例。这些设置的文档可以在 Gitaly chart 文档 中找到。

重要global.gitaly.tls 独立于 global.praefect.tls。它们是单独配置的。

默认情况下,此 chart 将创建 3 个 Gitaly 副本。

配置

默认情况下禁用 chart。要将其作为 chart 的一部分启用,请部署 global.praefect.enabled=true

副本

要部署的默认副本数为 3。可以通过将 global.praefect.virtualStorages[].gitalyReplicas 设置为所需的副本数来更改。例如:

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1

多虚拟存储

可以配置多个虚拟存储。例如:

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
    - name: vs2
      gitalyReplicas: 5
      maxUnavailable: 2

这将为 Gitaly 创建两组资源,包括两个 Gitaly StatefulSets(每个虚拟存储一个)。

然后管理员可以配置新仓库的存储位置

持久化

可以为每个虚拟存储提供持久化配置。

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
      persistence:
        enabled: true
        size: 50Gi
        accessMode: ReadWriteOnce
        storageClass: storageclass1
    - name: vs2
      gitalyReplicas: 5
      maxUnavailable: 2
      persistence:
        enabled: true
        size: 100Gi
        accessMode: ReadWriteOnce
        storageClass: storageclass2

defaultReplicationFactor

defaultReplicationFactor 可以在每个虚拟存储上配置。(参见配置复制系数文档)。

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 5
      maxUnavailable: 2
      defaultReplicationFactor: 3
    - name: secondary
      gitalyReplicas: 4
      maxUnavailable: 1
      defaultReplicationFactor: 2

迁移到 Praefect

note目前群组级 wikis 。

当从独立的 Gitaly 实例迁移到 Praefect 设置时,global.praefect.replaceInternalGitaly 可以设置为 false。 这确保在创建新的 Praefect 管理的 Gitaly 实例时保留现有的 Gitaly 实例。

global:
  praefect:
    enabled: true
    replaceInternalGitaly: false
    virtualStorages:
    - name: virtualStorage2
      gitalyReplicas: 5
      maxUnavailable: 2
note迁移到 Praefect 时,Praefect 的所有虚拟存储都不能命名为 default。这是因为在任何时候都必须至少有一个名为 default 的存储,因此该名称已被非 Praefect 配置采用。

然后可以将数据从 default 存储移动到 virtualStorage2。如果在 global.gitaly.internal.names 下定义了额外的存储,请确保也从这些存储中迁移仓库。

在存储库迁移到virtualStorage2后,如果名为 default 的存储添加到 Praefect 配置,replaceInternalGitaly 可以设置回 true

global:
  praefect:
    enabled: true
    replaceInternalGitaly: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
    - name: virtualStorage2
      gitalyReplicas: 5
      maxUnavailable: 2

如果需要,可以再次按照将现有存储库迁移到 Gitaly 集群 的说明,将数据从 virtualStorage2 移动到新添加的default 存储。

最后,请参阅仓库存储路径文档,配置新仓库的存储位置。

创建数据库

Praefect 使用自己的数据库来跟踪其状态。必须手动创建数据库才能使 Praefect 正常工作。

note以下说明假设您使用的是捆绑的 PostgreSQL 服务器。 如果您使用自己的服务器,则连接方式会有所不同。
  1. 登录到您的数据库实例:

    kubectl exec -it $(kubectl get pods -l app=postgresql -o custom-columns=NAME:.metadata.name --no-headers) -- bash
    
    PGPASSWORD=$(cat $POSTGRES_POSTGRES_PASSWORD_FILE) psql -U postgres -d template1
    
  2. 创建数据库用户:

    CREATE ROLE praefect WITH LOGIN;
    
  3. 设置数据库用户的密码。

    默认情况下,shared-secrets 作业将为您生成一个 secret。

    1. 获取密码:

      kubectl get secret RELEASE_NAME-praefect-dbsecret -o jsonpath="{.data.secret}" | base64 --decode
      
    2. psql 提示符中设置密码:

      \password praefect
      
  4. 创建数据库:

    CREATE DATABASE praefect WITH OWNER praefect;
    

在 TLS 上运行 Praefect

Praefect 支持通过 TLS 与客户端和 Gitaly 节点通信。 这由设置 global.praefect.tls.enabledglobal.praefect.tls.secretName 控制。 要在 TLS 上运行 Praefect,请执行以下步骤:

  1. Helm chart 期望提供证书以通过 TLS 与 Praefect 进行通信。此证书应适用于所有存在的 Praefect 节点。 因此,应将每个节点的所有主机名作为 Subject Alternate Name (SAN) 添加到证书中,或者您可以使用通配符。

    要知道要使用的主机名,请检查 Toolbox Pod 中的文件 /srv/gitlab/config/gitlab.yml 并检查其中的 repositories.storages 键下指定的各种 gitaly_address 字段。

    kubectl exec -it <Toolbox Pod> -- grep gitaly_address /srv/gitlab/config/gitlab.yml
    
note为内部 Praefect Pod 生成自定义签名证书的基础脚本可以在这个仓库中找到。 用户可以使用或参考该脚本来生成具有适当 SAN 属性的证书。
  1. 使用创建的证书创建 TLS Secret。

    kubectl create secret tls <secret name> --cert=praefect.crt --key=praefect.key
    
  2. 通过传递 --set global.praefect.tls.enabled=true 重新部署 Helm chart。

在 TLS 上运行 Gitaly 时,必须为每个虚拟存储提供一个 secret 名称。

global:
  gitaly:
    tls:
      enabled: true
  praefect:
    enabled: true
    tls:
      enabled: true
      secretName: praefect-tls
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
      tlsSecretName: default-tls
    - name: vs2
      gitalyReplicas: 5
      maxUnavailable: 2
      tlsSecretName: vs2-tls

安装命令行选项

下表包含可以使用 --set 标志提供给 helm install 命令的所有可能的 chart 配置。

参数 默认值 说明
common.labels {} 应用于此 chart 创建的所有对象的补充标签。
failover.enabled true Praefect 是否应在节点故障时执行故障转移
failover.readonlyAfter false 故障转移后节点是否应处于只读模式
autoMigrate true 在启动时自动运行迁移
electionStrategy sql
image.repository registry.jihulab.com/gitlab-cn/build/cng-images/gitaly 要使用的默认镜像仓库。 Praefect 作为 Gitaly 镜像的一部分捆绑在一起
podLabels {} 补充 Pod 标签。 不会用于选择器。
ntpHost pool.ntp.org 配置 NTP 服务器,Praefect 应该询问当前时间。
service.name praefect 要创建的 service 的名称
service.type ClusterIP 要创建的 service 的类型
service.internalPort 8075 Praefect pod 将监听的内部端口号
service.externalPort 8075 Praefect service 应该在集群中暴露的端口号
init.resources    
init.image    
extraEnvFrom   要暴露的其它数据源的额外环境变量列表
logging.level   日志级别
logging.format json 日志格式
logging.sentryDsn   Sentry DSN URL - Go 服务器
logging.sentryEnvironment   用于日志记录的 Sentry 环境
metrics.enabled true 指标端点是否可用于抓取
metrics.port 9236 指标端点端口
metrics.path /metrics 指标端点路径
metrics.serviceMonitor.enabled false 是否创建 ServiceMonitor 使 Prometheus Operator 能够管理指标抓取,请注意启用此功能会删除 prometheus.io 抓取注释
metrics.serviceMonitor.additionalLabels {} 要添加到 ServiceMonitor 的其它标签
metrics.serviceMonitor.endpointConfig {} ServiceMonitor 的附加端点配置
metrics.annotations   已废弃 设置明确的指标注释。替换为模板内容。
securityContext.runAsUser 1000  
securityContext.fsGroup 1000  
securityContext.fsGroupChangePolicy   更改卷的所有权和权限的策略(需要 Kubernetes 1.23)
serviceLabels {} 补充的 service 标签
statefulset.strategy {} 允许配置 statefulset 使用的更新策略。