使用 Praefect chart

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: 私有化部署
  • Status: Experiment
Praefect chart 依旧在开发中。此试验版本还不能够用于生产。审计可能会需要重要的人为干预。

Praefect chart 用于管理通过 Helm chart 部署的极狐GitLab 安装中的 Gitaly 群集

已知的限制和问题#

  1. 数据库必须手动创建。
  2. 群集大小是固定的:Gitaly 群集当前不支持自动扩展。
  3. 在群集中使用 Praefect 实例来管理群集外的 Gitaly 实例不支持。

要求#

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

Important: global.gitaly.tlsglobal.praefect.tls 是独立的。它们需要单独配置。

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

配置#

默认情况下,该 chart 是禁用的。要在 chart 部署中启用它,请设置 global.praefect.enabled=true

副本#

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

yaml
1global: 2 praefect: 3 enabled: true 4 virtualStorages: 5 - name: default 6 gitalyReplicas: 4 7 maxUnavailable: 1

多个虚拟存储#

可以配置多个虚拟存储(请参阅 Gitaly 群集 文档)。例如:

yaml
1global: 2 praefect: 3 enabled: true 4 virtualStorages: 5 - name: default 6 gitalyReplicas: 4 7 maxUnavailable: 1 8 - name: vs2 9 gitalyReplicas: 5 10 maxUnavailable: 2

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

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

持久性#

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

yaml
1global: 2 praefect: 3 enabled: true 4 virtualStorages: 5 - name: default 6 gitalyReplicas: 4 7 maxUnavailable: 1 8 persistence: 9 enabled: true 10 size: 50Gi 11 accessMode: ReadWriteOnce 12 storageClass: storageclass1 13 - name: vs2 14 gitalyReplicas: 5 15 maxUnavailable: 2 16 persistence: 17 enabled: true 18 size: 100Gi 19 accessMode: ReadWriteOnce 20 storageClass: storageclass2

defaultReplicationFactor#

defaultReplicationFactor 可以在每个虚拟存储上配置。(请参阅 配置 replication-factor 文档)。

yaml
1global: 2 praefect: 3 enabled: true 4 virtualStorages: 5 - name: default 6 gitalyReplicas: 5 7 maxUnavailable: 2 8 defaultReplicationFactor: 3 9 - name: secondary 10 gitalyReplicas: 4 11 maxUnavailable: 1 12 defaultReplicationFactor: 2

迁移到 Praefect#

群组维基[无法通过 API 移动](https://gitlab.cn/docs/jh/api/project_repository_storage_moves/)。

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

yaml
1global: 2 praefect: 3 enabled: true 4 replaceInternalGitaly: false 5 virtualStorages: 6 - name: virtualStorage2 7 gitalyReplicas: 5 8 maxUnavailable: 2
迁移到 Praefect 时,Praefect 的虚拟存储不能命名为 `default`。这是因为必须始终至少有一个存储命名为 `default`,因此该名称已被非 Praefect 配置使用。

然后可以按照迁移到 Gitaly 群集 的说明将数据从 default 存储移动到 virtualStorage2。如果在 global.gitaly.internal.names 下定义了其他存储,请确保也从这些存储中迁移存储库。

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

yaml
1global: 2 praefect: 3 enabled: true 4 replaceInternalGitaly: true 5 virtualStorages: 6 - name: default 7 gitalyReplicas: 4 8 maxUnavailable: 1 9 - name: virtualStorage2 10 gitalyReplicas: 5 11 maxUnavailable: 2

可以再次遵循迁移到 Gitaly 群集 的说明,将数据从 virtualStorage2 移动到新添加的 default 存储(如果需要)。

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

创建数据库#

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

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

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

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

    默认情况下,shared-secrets 任务将为您生成一个密钥。

    1. 获取密码:

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

      sql
      \password praefect
  4. 创建数据库:

    sql
    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 字段。

    shell
    kubectl exec -it <Toolbox Pod> -- grep gitaly_address /srv/gitlab/config/gitlab.yml
用于生成内部 Praefect Pod 的自定义签名证书的基本脚本[可以在这个仓库中找到](https://jihulab.com/gitlab-cn/charts/gitlab/blob/master/scripts/generate_certificates.sh)。用户可以使用或参考该脚本生成具有适当 SAN 属性的证书。
  1. 使用创建的证书创建一个 TLS 密钥。

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

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

yaml
1global: 2 gitaly: 3 tls: 4 enabled: true 5 praefect: 6 enabled: true 7 tls: 8 enabled: true 9 secretName: praefect-tls 10 virtualStorages: 11 - name: default 12 gitalyReplicas: 4 13 maxUnavailable: 1 14 tlsSecretName: default-tls 15 - name: vs2 16 gitalyReplicas: 5 17 maxUnavailable: 2 18 tlsSecretName: vs2-tls

安装命令行选项#

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

参数默认值描述
common.labels{}应用于此 chart 创建的所有对象的补充标签。
failover.enabledtruePraefect 是否应该在节点故障时执行故障转移
failover.readonlyAfterfalse节点在故障转移后是否应该处于只读模式
autoMigratetrue在启动时自动运行迁移
image.repositoryregistry.gitlab.com/gitlab-org/build/cng/gitaly默认的镜像仓库。Praefect 是作为 Gitaly 镜像的一部分捆绑的
podLabels{}补充 Pod 标签。不会用于选择器。
ntpHostpool.ntp.org配置 Praefect 应该请求当前时间的 NTP 服务器。
service.namepraefect要创建的服务的名称
service.typeClusterIP要创建的服务类型
service.internalPort8075Praefect pod 将监听的内部端口号
service.externalPort8075Praefect 服务在群集内暴露的端口号
init.resources
init.image
init.containerSecurityContext.allowPrivilegeEscalationfalseinitContainer 特定:控制进程是否可以获得比其父进程更多的权限
init.containerSecurityContext.runAsNonRoottrueinitContainer 特定:控制容器是否以非 root 用户运行
init.containerSecurityContext.capabilities.drop[ "ALL" ]initContainer 特定:移除容器的 Linux 能力
extraEnvFrom暴露其他数据源的额外环境变量列表
logging.level日志级别
logging.formatjson日志格式
logging.sentryDsnSentry DSN URL - 来自 Go 服务器的异常
logging.sentryEnvironment用于日志记录的 Sentry 环境
metrics.enabledtrue是否应该提供一个可供抓取的指标端点
metrics.port9236指标端点端口
metrics.separate_database_metricstrue如果为 true,则指标抓取不会执行数据库查询,设置为 false 可能会导致性能问题
metrics.path/metrics指标端点路径
metrics.serviceMonitor.enabledfalse如果应该创建 ServiceMonitor 以启用 Prometheus Operator 管理指标抓取,请注意启用此选项会移除 prometheus.io 抓取注释
affinity{}pod 分配的 亲和性规则
metrics.serviceMonitor.additionalLabels{}要添加到 ServiceMonitor 的其他标签
metrics.serviceMonitor.endpointConfig{}ServiceMonitor 的其他端点配置
securityContext.runAsUser1000
securityContext.fsGroup1000
securityContext.fsGroupChangePolicy更改卷的所有权和权限的策略(需要 Kubernetes 1.23)
securityContext.seccompProfile.typeRuntimeDefault要使用的 seccomp 配置文件
containerSecurityContext.allowPrivilegeEscalationfalse控制容器的进程是否可以获得比其父进程更多的权限
containerSecurityContext.runAsNonRoottrue控制容器是否以非 root 用户运行
containerSecurityContext.capabilities.drop[ "ALL" ]移除 Gitaly 容器的 Linux 能力
serviceAccount.annotations{}ServiceAccount 注释
serviceAccount.automountServiceAccountTokenfalse指示默认的 ServiceAccount 访问令牌是否应该安装在 pods 中
serviceAccount.createfalse指示是否应该创建 ServiceAccount
serviceAccount.enabledfalse指示是否要使用 ServiceAccount
serviceAccount.nameServiceAccount 的名称。如果未设置,则使用完整的 chart 名称
serviceLabels{}补充服务标签
statefulset.strategy{}允许配置 statefulset 使用的更新策略

serviceAccount#

此部分控制是否应该创建 ServiceAccount,以及是否应该在 pods 中安装默认的访问令牌。

名称类型默认值描述
annotationsMap{}ServiceAccount 注释。
automountServiceAccountTokenBooleanfalse控制是否应该在 pods 中安装默认的 ServiceAccount 访问令牌。您不应该启用此选项,除非某些 sidecar 需要它才能正常工作(例如,Istio)。
createBooleanfalse指示是否应该创建 ServiceAccount。
enabledBooleanfalse指示是否要使用 ServiceAccount。
nameStringServiceAccount 的名称。如果未设置,则使用完整的 chart 名称。

affinity#

有关更多信息,请参阅 affinity