使用 Praefect chart (alpha)
Praefect chart 用于管理使用 Helm chart 部署的 GitLab 安装中的 Gitaly 集群。
已知限制和议题
- 数据库必须手动创建。
- 不支持从现有的 Gitaly 设置迁移到 Praefect。
- 集群大小固定:Gitaly 集群目前不支持自动伸缩。
- 升级到 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
迁移到 Praefect
当从独立的 Gitaly 实例迁移到 Praefect 设置时,global.praefect.replaceInternalGitaly
可以设置为 false
。
这确保在创建新的 Praefect 管理的 Gitaly 实例时保留现有的 Gitaly 实例。
global:
praefect:
enabled: true
replaceInternalGitaly: false
virtualStorages:
- name: virtualStorage2
gitalyReplicas: 5
maxUnavailable: 2
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 正常工作。
-
登录到您的数据库实例:
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
-
创建数据库用户:
CREATE ROLE praefect WITH LOGIN;
-
设置数据库用户的密码。
默认情况下,
shared-secrets
作业将为您生成一个 secret。-
获取密码:
kubectl get secret RELEASE_NAME-praefect-dbsecret -o jsonpath="{.data.secret}" | base64 --decode
-
在
psql
提示符中设置密码:\password praefect
-
-
创建数据库:
CREATE 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
字段。kubectl exec -it <Toolbox Pod> -- grep gitaly_address /srv/gitlab/config/gitlab.yml
-
使用创建的证书创建 TLS Secret。
kubectl create secret tls <secret name> --cert=praefect.crt --key=praefect.key
-
通过传递附加参数
--set global.praefect.tls.enabled=true --set global.praefect.tls.secretName=<secret name>
重新部署 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.gitlab.com/gitlab-org/build/cng/gitaly
| 要使用的默认镜像仓库。 Praefect 作为 Gitaly 镜像的一部分捆绑在一起 |
podLabels | {}
| 补充 Pod 标签。 不会用于选择器。 |
service.name | praefect
| 要创建的 service 的名称 |
service.type | ClusterIP | 要创建的 service 的类型 |
service.internalPort | 8075 | Praefect pod 将监听的内部端口号 |
service.externalPort | 8075 | Praefect service 应该在集群中暴露的端口号 |
init.resources | ||
init.image | ||
logging.level | 日志级别 | |
logging.format | json
| 日志格式 |
logging.sentryDsn | Sentry DSN URL - Go 服务器 | |
logging.rubySentryDsn | Sentry DSN URL -gitaly-ruby
| |
logging.sentryEnvironment | 用于日志记录的 Sentry 环境 | |
metrics.enabled | true | |
metrics.port | 9236 | |
securityContext.runAsUser | 1000 | |
securityContext.fsGroup | 1000 | |
serviceLabels | {}
| 补充的 service 标签 |
statefulset.strategy | {}
| 允许配置 statefulset 使用的更新策略。 |