使用 Praefect chart
- Tier: 基础版, 专业版, 旗舰版
- Offering: 私有化部署
- Status: Experiment
Praefect chart 用于管理通过 Helm chart 部署的极狐GitLab 安装中的 Gitaly 群集。
已知的限制和问题
- 数据库必须手动创建。
- 群集大小是固定的:Gitaly 群集当前不支持自动扩展。
- 在群集中使用 Praefect 实例来管理群集外的 Gitaly 实例不支持。
要求
该 chart 使用 Gitaly chart。global.gitaly 中的设置用于配置此 chart 创建的实例。这些设置的文档可以在 Gitaly chart 文档 中找到。
Important: global.gitaly.tls 与 global.praefect.tls 是独立的。它们需要单独配置。
默认情况下,此 chart 将创建 3 个 Gitaly 副本。
配置
默认情况下,该 chart 是禁用的。要在 chart 部署中启用它,请设置 global.praefect.enabled=true。
副本
部署的默认副本数量为 3。可以通过设置 global.praefect.virtualStorages[].gitalyReplicas 来更改所需的副本数量。例如:
yaml1global: 2 praefect: 3 enabled: true 4 virtualStorages: 5 - name: default 6 gitalyReplicas: 4 7 maxUnavailable: 1
多个虚拟存储
可以配置多个虚拟存储(请参阅 Gitaly 群集 文档)。例如:
yaml1global: 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(每个虚拟存储一个)。
管理员可以配置新存储库的存储位置。
持久性
可以为每个虚拟存储提供持久性配置。
yaml1global: 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 文档)。
yaml1global: 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
从独立 Gitaly 实例迁移到 Praefect 设置时,可以将 global.praefect.replaceInternalGitaly 设置为 false。这确保在创建新的由 Praefect 管理的 Gitaly 实例时保留现有的 Gitaly 实例。
yaml1global: 2 praefect: 3 enabled: true 4 replaceInternalGitaly: false 5 virtualStorages: 6 - name: virtualStorage2 7 gitalyReplicas: 5 8 maxUnavailable: 2
然后可以按照迁移到 Gitaly 群集 的说明将数据从 default 存储移动到 virtualStorage2。如果在 global.gitaly.internal.names 下定义了其他存储,请确保也从这些存储中迁移存储库。
在存储库迁移到 virtualStorage2 后,如果在 Praefect 配置中添加了名为 default 的存储,则可以将 replaceInternalGitaly 设置回 true。
yaml1global: 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 功能正常。
-
登录到您的数据库实例:
shellkubectl exec -it $(kubectl get pods -l app.kubernetes.io/name=postgresql -o custom-columns=NAME:.metadata.name --no-headers) -- bashshellPGPASSWORD=$(echo $POSTGRES_POSTGRES_PASSWORD) psql -U postgres -d template1 -
创建数据库用户:
sqlCREATE ROLE praefect WITH LOGIN; -
设置数据库用户密码。
默认情况下,shared-secrets 任务将为您生成一个密钥。
-
获取密码:
shellkubectl get secret RELEASE_NAME-praefect-dbsecret -o jsonpath="{.data.secret}" | base64 --decode -
在 psql 提示符中设置密码:
sql\password praefect
-
-
创建数据库:
sqlCREATE DATABASE praefect WITH OWNER praefect;
在 TLS 上运行 Praefect
Praefect 支持通过 TLS 与客户端和 Gitaly 节点进行通信。这由设置 global.praefect.tls.enabled 和 global.praefect.tls.secretName 控制。要在 TLS 上运行 Praefect,请按照以下步骤操作:
-
Helm chart 期望提供一个证书,以便通过 TLS 与 Praefect 通信。此证书应适用于所有存在的 Praefect 节点。因此,应将这些节点的每个主机名添加为证书的 Subject Alternate Name (SAN),或者您可以使用通配符。
要了解要使用的主机名,请检查 Toolbox Pod 中的文件 /srv/gitlab/config/gitlab.yml,并检查在 repositories.storages 键下指定的各个 gitaly_address 字段。
shellkubectl exec -it <Toolbox Pod> -- grep gitaly_address /srv/gitlab/config/gitlab.yml
-
使用创建的证书创建一个 TLS 密钥。
shellkubectl create secret tls <secret name> --cert=praefect.crt --key=praefect.key -
通过传递 --set global.praefect.tls.enabled=true 重新部署 Helm chart。
在 TLS 上运行 Gitaly 时,必须为每个虚拟存储提供一个密钥名称。
yaml1global: 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.enabled | true | Praefect 是否应该在节点故障时执行故障转移 |
| failover.readonlyAfter | false | 节点在故障转移后是否应该处于只读模式 |
| autoMigrate | true | 在启动时自动运行迁移 |
| image.repository | registry.gitlab.com/gitlab-org/build/cng/gitaly | 默认的镜像仓库。Praefect 是作为 Gitaly 镜像的一部分捆绑的 |
| podLabels | {} | 补充 Pod 标签。不会用于选择器。 |
| ntpHost | pool.ntp.org | 配置 Praefect 应该请求当前时间的 NTP 服务器。 |
| service.name | praefect | 要创建的服务的名称 |
| service.type | ClusterIP | 要创建的服务类型 |
| service.internalPort | 8075 | Praefect pod 将监听的内部端口号 |
| service.externalPort | 8075 | Praefect 服务在群集内暴露的端口号 |
| init.resources | ||
| init.image | ||
| init.containerSecurityContext.allowPrivilegeEscalation | false | initContainer 特定:控制进程是否可以获得比其父进程更多的权限 |
| init.containerSecurityContext.runAsNonRoot | true | initContainer 特定:控制容器是否以非 root 用户运行 |
| init.containerSecurityContext.capabilities.drop | [ "ALL" ] | initContainer 特定:移除容器的 Linux 能力 |
| extraEnvFrom | 暴露其他数据源的额外环境变量列表 | |
| logging.level | 日志级别 | |
| logging.format | json | 日志格式 |
| logging.sentryDsn | Sentry DSN URL - 来自 Go 服务器的异常 | |
| logging.sentryEnvironment | 用于日志记录的 Sentry 环境 | |
| metrics.enabled | true | 是否应该提供一个可供抓取的指标端点 |
| metrics.port | 9236 | 指标端点端口 |
| metrics.separate_database_metrics | true | 如果为 true,则指标抓取不会执行数据库查询,设置为 false 可能会导致性能问题 |
| metrics.path | /metrics | 指标端点路径 |
| metrics.serviceMonitor.enabled | false | 如果应该创建 ServiceMonitor 以启用 Prometheus Operator 管理指标抓取,请注意启用此选项会移除 prometheus.io 抓取注释 |
| affinity | {} | pod 分配的 亲和性规则 |
| metrics.serviceMonitor.additionalLabels | {} | 要添加到 ServiceMonitor 的其他标签 |
| metrics.serviceMonitor.endpointConfig | {} | ServiceMonitor 的其他端点配置 |
| securityContext.runAsUser | 1000 | |
| securityContext.fsGroup | 1000 | |
| securityContext.fsGroupChangePolicy | 更改卷的所有权和权限的策略(需要 Kubernetes 1.23) | |
| securityContext.seccompProfile.type | RuntimeDefault | 要使用的 seccomp 配置文件 |
| containerSecurityContext.allowPrivilegeEscalation | false | 控制容器的进程是否可以获得比其父进程更多的权限 |
| containerSecurityContext.runAsNonRoot | true | 控制容器是否以非 root 用户运行 |
| containerSecurityContext.capabilities.drop | [ "ALL" ] | 移除 Gitaly 容器的 Linux 能力 |
| serviceAccount.annotations | {} | ServiceAccount 注释 |
| serviceAccount.automountServiceAccountToken | false | 指示默认的 ServiceAccount 访问令牌是否应该安装在 pods 中 |
| serviceAccount.create | false | 指示是否应该创建 ServiceAccount |
| serviceAccount.enabled | false | 指示是否要使用 ServiceAccount |
| serviceAccount.name | ServiceAccount 的名称。如果未设置,则使用完整的 chart 名称 | |
| serviceLabels | {} | 补充服务标签 |
| statefulset.strategy | {} | 允许配置 statefulset 使用的更新策略 |
serviceAccount
此部分控制是否应该创建 ServiceAccount,以及是否应该在 pods 中安装默认的访问令牌。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| annotations | Map | {} | ServiceAccount 注释。 |
| automountServiceAccountToken | Boolean | false | 控制是否应该在 pods 中安装默认的 ServiceAccount 访问令牌。您不应该启用此选项,除非某些 sidecar 需要它才能正常工作(例如,Istio)。 |
| create | Boolean | false | 指示是否应该创建 ServiceAccount。 |
| enabled | Boolean | false | 指示是否要使用 ServiceAccount。 |
| name | String | ServiceAccount 的名称。如果未设置,则使用完整的 chart 名称。 |
affinity
有关更多信息,请参阅 affinity。