使用 GitLab-Gitaly chart
Tier: 基础版,专业版,旗舰版
Offering: 私有化部署
gitaly 子 chart 提供可配置的 Gitaly 服务器部署。
要求
此 chart 依赖对 Workhorse 服务的访问,该服务可以是完整 GitLab chart 的一部分,也可以作为可从部署此 chart 的 Kubernetes 集群访问的外部服务提供。
设计选择
此 chart 中使用的 Gitaly 容器还包含 GitLab Shell 代码库,以便对尚未移植到 Gitaly 中的 Git 代码仓库执行操作。Gitaly 容器内部包含一份 GitLab Shell 容器的副本,因此我们还需要在此 chart 中配置 GitLab Shell。
配置
gitaly chart 的配置分为两部分:外部服务和 chart 设置。
默认情况下,部署 GitLab chart 时会将 Gitaly 作为组件部署。如果单独部署 Gitaly,需要将 global.gitaly.enabled 设置为 false,并按照外部 Gitaly 文档中的说明执行额外配置。
安装命令行选项
下表包含可使用 --set 标志提供给 helm install 命令的所有可能的 chart 配置。
| 参数 | 默认值 | 描述 |
|---|---|---|
| annotations | Pod 注解 | |
| backup.goCloudUrl | 服务器端 Gitaly 备份的对象存储 URL。 | |
| common.labels | {} | 应用于此 chart 创建的所有对象的补充标签。 |
| configuration | {} | 透传块,会渲染到 Gitaly config.toml中。会合并到下方映射的设置之上并优先于它们。请参阅 configuration。 |
| podLabels | 补充 Pod 标签。不会用于选择器。 | |
| external[].hostname | - "" | 外部节点的主机名 |
| external[].name | - "" | 外部节点存储的名称 |
| external[].port | - "" | 外部节点的端口 |
| extraContainers | 多行字面量样式字符串,包含要纳入的容器列表 | |
| extraInitContainers | 要纳入的额外 init 容器列表 | |
| extraVolumeMounts | 要执行的额外卷挂载列表 | |
| extraVolumes | 要创建的额外卷列表 | |
| extraEnv | 要公开的额外环境变量列表 | |
| extraEnvFrom | 要从其他数据源公开的额外环境变量列表 | |
| gitaly.serviceName | 生成的 Gitaly 服务的名称。覆盖 global.gitaly.serviceName,默认为 <RELEASE-NAME>-gitaly | |
| gpgSigning.enabled | false | 是否应使用 Gitaly GPG 签名。 |
| gpgSigning.secret | 用于 Gitaly GPG 签名的密钥名称。 | |
| gpgSigning.key | GPG 密钥中包含 Gitaly GPG 签名密钥的键。 | |
| image.pullPolicy | Always | Gitaly 镜像拉取策略 |
| image.pullSecrets | 镜像仓库的密钥 | |
| image.repository | registry.gitlab.com/gitlab-org/build/cng/gitaly | Gitaly 镜像仓库 |
| image.tag | master | Gitaly 镜像标签 |
| init.image.repository | initContainer 镜像 | |
| init.image.tag | initContainer 镜像标签 | |
| init.containerSecurityContext | initContainer 特定的 securityContext | |
| init.containerSecurityContext.allowPrivilegeEscalation | false | initContainer 特定:控制进程是否可以获取比其父进程更多的权限 |
| init.containerSecurityContext.runAsNonRoot | true | initContainer 特定:控制容器是否以非 root 用户运行 |
| init.containerSecurityContext.capabilities.drop | [ "ALL" ] | initContainer 特定:移除容器的 Linux 能力 |
| internal.names[] | - default | StatefulSet 存储的有序名称 |
| serviceLabels | {} | 补充服务标签 |
| service.externalPort | 8075 | Gitaly 服务公开的端口 |
| service.internalPort | 8075 | Gitaly 内部端口 |
| service.name | gitaly | Service 对象中 Gitaly 所在的 Service 端口名称。 |
| service.type | ClusterIP | Gitaly 服务类型 |
| service.clusterIP | None | 您可以在 Service 创建请求中指定自己的集群 IP 地址。这遵循 Kubernetes Service 对象的 clusterIP 的相同约定。如果 service.type 为 LoadBalancer,则不得设置此项。 |
| service.loadBalancerIP | 如果未设置,将创建一个临时 IP 地址。这遵循 Kubernetes Service 对象的 loadbalancerIP 配置的相同约定。 | |
| service.trafficDistribution | 在 Service 上设置 spec.trafficDistribution。默认不设置。 | |
| serviceAccount.annotations | {} | ServiceAccount 注解 |
| serviceAccount.automountServiceAccountToken | false | 指示是否应在 pod 中挂载默认 ServiceAccount 访问令牌 |
| serviceAccount.create | false | 指示是否应创建 ServiceAccount |
| serviceAccount.enabled | false | 指示是否使用 ServiceAccount |
| serviceAccount.name | ServiceAccount 的名称。如果未设置,则使用完整的 chart 名称 | |
| securityContext.fsGroup | 1000 | 应启动 pod 的组 ID |
| securityContext.fsGroupChangePolicy | 更改卷所有权和权限的策略(需要 Kubernetes 1.23) | |
| securityContext.runAsUser | 1000 | 应启动 pod 的用户 ID |
| securityContext.seccompProfile.type | RuntimeDefault | 要使用的 Seccomp 配置文件 |
| shareProcessNamespace | false | 允许使容器进程对同一 pod 中的所有其他容器可见 |
| containerSecurityContext | 覆盖启动 Gitaly 容器时使用的容器 securityContext | |
| containerSecurityContext.runAsUser | 1000 | 允许覆盖启动 Gitaly 容器时使用的特定安全上下文用户 ID |
| containerSecurityContext.allowPrivilegeEscalation | false | 控制 Gitaly 容器的进程是否可以获取比其父进程更多的权限 |
| containerSecurityContext.runAsNonRoot | true | 控制 Gitaly 容器是否以非 root 用户运行 |
| containerSecurityContext.capabilities.drop | [ "ALL" ] | 移除 Gitaly 容器的 Linux 能力 |
| tolerations | [] | 用于 pod 分配的容忍标签 |
| affinity | {} | 用于 pod 分配的亲和性规则 |
| persistence.accessMode | ReadWriteOnce | Gitaly 持久化访问模式 |
| persistence.annotations | Gitaly 持久化注解 | |
| persistence.enabled | true | Gitaly 启用持久化标志 |
| persistance.labels | Gitaly 持久化标签 | |
| persistence.matchExpressions | 要绑定的标签表达式匹配 | |
| persistence.matchLabels | 要绑定的标签值匹配 | |
| persistence.size | 50Gi | Gitaly 持久化卷大小 |
| persistence.storageClass | 用于预配的 storageClassName | |
| persistence.subPath | Gitaly 持久化卷挂载路径 | |
| priorityClassName | Gitaly StatefulSet priorityClassName | |
| logging.level | 日志级别 | |
| logging.format | json | 日志格式 |
| logging.sentryDsn | Sentry DSN URL - 来自 Go 服务器的异常 | |
| logging.sentryEnvironment | 用于日志记录的 Sentry 环境 | |
| shell.concurrency[] | 每个 RPC 端点的并发数。有关配置键,请参阅限制 RPC 并发数和为 RPC 并发启用自适应。 | |
| packObjectsCache.enabled | false | 启用 Gitaly pack-objects 缓存 |
| packObjectsCache.dir | /home/git/repositories/+gitaly/PackObjectsCache | 存储缓存文件的目录 |
| packObjectsCache.max_age | 5m | 缓存条目的生命周期 |
| packObjectsCache.min_occurrences | 1 | 创建缓存条目所需的最小计数 |
| git.catFileCacheSize | Git cat-file 进程使用的缓存大小 | |
| git.config[] | [] | Gitaly 在生成 Git 命令时应设置的 Git 配置 |
| prometheus.grpcLatencyBuckets | 与 Gitaly 记录的 GRPC 方法调用直方图延迟对应的桶。需要以数组的字符串形式(例如 "[1.0, 1.5, 2.0]")作为输入 | |
| statefulset.strategy | {} | 允许配置 StatefulSet 使用的更新策略 |
| statefulset.livenessProbe.initialDelaySeconds | 0 | 启动存活探针之前的延迟。如果启用了 startupProbe,则此项将设置为 0。 |
| statefulset.livenessProbe.periodSeconds | 10 | 执行存活探针的频率 |
| statefulset.livenessProbe.timeoutSeconds | 3 | 存活探针超时时间 |
| statefulset.livenessProbe.successThreshold | 1 | 存活探针在失败后被视为成功所需的最小连续成功次数 |
| statefulset.livenessProbe.failureThreshold | 3 | 存活探针在成功后被视为失败所需的最小连续失败次数 |
| statefulset.readinessProbe.initialDelaySeconds | 0 | 启动就绪探针之前的延迟。如果启用了 startupProbe,则此项将设置为 0。 |
| statefulset.readinessProbe.periodSeconds | 5 | 执行就绪探针的频率 |
| statefulset.readinessProbe.timeoutSeconds | 3 | 就绪探针超时时间 |
| statefulset.readinessProbe.successThreshold | 1 | 就绪探针在失败后被视为成功所需的最小连续成功次数 |
| statefulset.readinessProbe.failureThreshold | 3 | 就绪探针在成功后被视为失败所需的最小连续失败次数 |
| statefulset.startupProbe.enabled | true | 是否启用启动探针。 |
| statefulset.startupProbe.initialDelaySeconds | 1 | 启动启动探针之前的延迟 |
| statefulset.startupProbe.periodSeconds | 1 | 执行启动探针的频率 |
| statefulset.startupProbe.timeoutSeconds | 1 | 启动探针超时时间 |
| statefulset.startupProbe.successThreshold | 1 | 启动探针在失败后被视为成功所需的最小连续成功次数 |
| statefulset.startupProbe.failureThreshold | 60 | 启动探针在成功后被视为失败所需的最小连续失败次数 |
| statefulset.revisionHistoryLimit | 要保留的先前修订版本数。未提供且未设置 global.revisionHistoryLimit 时,使用 Kubernetes 默认值。 | |
| metrics.enabled | false | 是否应提供指标端点以供抓取 |
| metrics.port | 9236 | 指标端点端口 |
| metrics.path | /metrics | 指标端点路径 |
| metrics.serviceMonitor.enabled | false | 是否应创建 ServiceMonitor 以使 Prometheus Operator 能够管理指标抓取,请注意启用此项会移除 prometheus.io 抓取注解 |
| metrics.serviceMonitor.additionalLabels | {} | 要添加到 ServiceMonitor 的额外标签 |
| metrics.serviceMonitor.endpointConfig | {} | ServiceMonitor 的额外端点配置 |
| metrics.metricsPort | 已弃用请使用 metrics.port | |
| gomemlimit.enabled | true | 如果同时设置了 resources.limits.memory 限制,这将自动将 Gitaly 容器的 GOMEMLIMIT 环境变量设置为该限制值。用户可以通过将此值设置为 false 并在 extraEnv中设置 GOMEMLIMIT 来覆盖此值。这必须符合文档化的格式标准。 |
| cgroups.enabled | false | Gitaly 具有内置的 cgroups 控制。配置后,Gitaly 会根据 Git 命令所操作的代码仓库将 Git 进程分配到某个 cgroup。此参数将启用代码仓库 cgroups。请注意,如果启用,仅支持 cgroups v2。 |
| cgroups.initContainer.image.repository | registry.com/gitlab-org/build/cng/gitaly-init-cgroups | Gitaly 镜像仓库 |
| cgroups.initContainer.image.tag | master | Gitaly 镜像标签 |
| cgroups.initContainer.image.pullPolicy | IfNotPresent | Gitaly 镜像拉取策略 |
| cgroups.initContainer.securityContext | init-cgroups 容器的容器 securityContext。该映射按原样渲染,因此接受任何有效的容器级字段。 | |
| cgroups.initContainer.securityContext.runAsUser | 0 | init-cgroups 容器运行所用的用户 ID。必须为 0(root),以便容器可以设置 cgroup 所有权。 |
| cgroups.initContainer.securityContext.runAsGroup | 0 | init-cgroups 容器运行所用的组 ID。 |
| cgroups.initContainer.securityContext.privileged | 当为 true 时,以特权模式运行 init-cgroups 容器。在强制执行严格安全策略的集群上是必需的,例如使用 restricted SCC 的 OpenShift。 | |
| cgroups.initContainer.securityContext.allowPrivilegeEscalation | 控制 init-cgroups 容器进程是否可以获取比其父进程更多的权限。当 privileged 也为 true 时,设置为 true。 | |
| cgroups.mountpoint | /etc/gitlab-secrets/gitaly-pod-cgroup | 父 cgroup 目录的挂载位置。 |
| cgroups.hierarchyRoot | gitaly | Gitaly 在其下创建组的父 cgroup,预期由 Gitaly 运行所用的用户和组拥有。 |
| cgroups.memoryBytes | 对 Gitaly 生成的所有 Git 进程统一施加的总内存限制。0 表示无限制。 | |
| cgroups.cpuShares | 对 Gitaly 生成的所有 Git 进程统一施加的 CPU 限制。0 表示无限制。最大值为 1024 份额,代表 100% 的 CPU。 | |
| cgroups.cpuQuotaUs | 用于在 cgroups 的进程超过此配额值时对其进行限流。我们将 cpuQuotaUs 设置为 100ms,因此 1 核为 100000。0 表示无限制。 | |
| cgroups.repositories.count | cgroups 池中的 cgroup 数量。每次生成新的 Git 命令时,Gitaly 会根据该命令所针对的代码仓库将其分配到其中一个 cgroup。循环哈希算法会将 Git 命令分配到这些 cgroup,因此针对某个代码仓库的 Git 命令始终会被分配到同一个 cgroup。 | |
| cgroups.repositories.memoryBytes | 对代码仓库 cgroup 中包含的所有 Git 进程施加的总内存限制。0 表示无限制。此值不能超过顶层 memoryBytes 的值。 | |
| cgroups.repositories.cpuShares | 对代码仓库 cgroup 中包含的所有 Git 进程施加的 CPU 限制。0 表示无限制。最大值为 1024 份额,代表 100% 的 CPU。此值不能超过顶层 cpuShares 的值。 | |
| cgroups.repositories.cpuQuotaUs | 对代码仓库 cgroup 中包含的所有 Git 进程施加的 cpuQuotaUs。Git 进程不能使用超过给定配额的量。我们将 cpuQuotaUs 设置为 100ms,因此 1 核为 100000。0 表示无限制。 | |
| cgroups.repositories.maxCgroupsPerRepo | 1 | 针对特定代码仓库的 Git 进程可以分布到的代码仓库 cgroup 数量。这使得可以为代码仓库 cgroup 配置更保守的 CPU 和内存限制,同时仍允许突发工作负载。例如,当 maxCgroupsPerRepo 为 2 且 memoryBytes 限制为 10GB 时,针对特定代码仓库的独立 Git 操作最多可消耗 20GB 内存。 |
| gracefulRestartTimeout | 25 | Gitaly 关闭宽限期,即等待进行中请求完成的时间(秒)。Pod 的 terminationGracePeriodSeconds 设置为此值 + 5 秒。 |
| timeout.uploadPackNegotiation | 请参阅配置协商超时。 | |
| timeout.uploadArchiveNegotiation | 请参阅配置协商超时。 | |
| dailyMaintenance.disabled | 允许禁用每日后台维护。 | |
| dailyMaintenance.duration | 每日后台维护的最长持续时间。例如 "1h" 或 "45m"。 | |
| dailyMaintenance.startHour | 每日后台维护的起始分钟。 | |
| dailyMaintenance.startMinute | 每日后台维护的起始分钟。 | |
| dailyMaintenance.storages | 要执行每日后台维护的存储名称数组。例如 [ "default" ]。 | |
| bundleUri.goCloudUrl | 请参阅 Bundle URI 文档。 |
Chart 配置示例
configuration
configuration 是一个透传块,其内容会直接渲染到 Gitaly config.toml中。其键与 Gitaly 配置结构一致,因此可以在此提供任何 Gitaly 设置。
在 configuration 下设置的值会合并到 chart 现有的 Gitaly 设置(例如 git 和 dailyMaintenance)之上,并优先于它们。这些现有键仍然受支持,但建议使用 configuration。
映射的键计划弃用。
以下是 configuration的使用示例:
yamlconfiguration: git: catfile_cache_size: 100 daily_maintenance: start_hour: 23
以下部分由 chart 管理,如果在 configuration 下设置将被忽略,因为它们的值仅在 Gitaly pod 启动时确定:
- storage:从 pod 的主机名派生
- auth:从挂载的密钥中读取的令牌
- cgroups:从 pod 的 cgroup 路径读取的挂载点
如果在 configuration 下设置,prometheus 部分也会被忽略,因为其 grpc_latency_buckets 值需要特殊格式,而透传编码无法生成该格式。请改为通过 prometheus.grpcLatencyBuckets 进行配置。
如果在 configuration 下设置,TLS 和指标监听设置(tls_listen_addr、tls 和 prometheus_listen_addr)也会被忽略,因为它们必须与 chart 创建的 Service 端口和挂载的证书匹配。请改为通过 global.gitaly.tls 和 metrics 进行配置。
extraEnv
extraEnv 允许您在 pod 中的所有容器中公开额外的环境变量。
以下是 extraEnv的使用示例:
yamlextraEnv: SOME_KEY: some_value SOME_OTHER_KEY: some_other_value
容器启动后,您可以确认环境变量已公开:
shellenv | grep SOME SOME_KEY=some_value SOME_OTHER_KEY=some_other_value
extraEnvFrom
extraEnvFrom 允许您在 pod 中的所有容器中从其他数据源公开额外的环境变量。
以下是 extraEnvFrom的使用示例:
yaml1extraEnvFrom: 2 MY_NODE_NAME: 3 fieldRef: 4 fieldPath: spec.nodeName 5 MY_CPU_REQUEST: 6 resourceFieldRef: 7 containerName: test-container 8 resource: requests.cpu 9 SECRET_THING: 10 secretKeyRef: 11 name: special-secret 12 key: special_token 13 # optional: boolean 14 CONFIG_STRING: 15 configMapKeyRef: 16 name: useful-config 17 key: some-string 18 # optional: boolean
image.pullSecrets
pullSecrets 允许您向私有镜像仓库进行身份验证,以便为 pod 拉取镜像。
有关私有镜像仓库及其身份验证方法的更多详细信息,请参阅 Kubernetes 文档。
以下是 pullSecrets的使用示例
yaml1image: 2 repository: my.gitaly.repository 3 tag: latest 4 pullPolicy: Always 5 pullSecrets: 6 - name: my-secret-name 7 - name: my-secondary-secret-name
serviceAccount
本节控制是否应创建 ServiceAccount 以及是否应在 pod 中挂载默认访问令牌。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| annotations | Map | {} | ServiceAccount 注解。 |
| automountServiceAccountToken | Boolean | false | 控制是否应在 pod 中挂载默认 ServiceAccount 访问令牌。除非某些边车(例如 Istio)需要它才能正常工作,否则不应启用此项。 |
| create | Boolean | false | 指示是否创建 ServiceAccount。 |
| enabled | Boolean | false | 指示是否使用 ServiceAccount。 |
| name | String | ServiceAccount 的名称。如果未设置,则使用完整的 chart 名称。 |
tolerations
tolerations 允许您在带有污点的工作节点上调度 pod
以下是 tolerations的使用示例:
yaml1tolerations: 2- key: "node_label" 3 operator: "Equal" 4 value: "true" 5 effect: "NoSchedule" 6- key: "node_label" 7 operator: "Equal" 8 value: "true" 9 effect: "NoExecute"
affinity
有关更多信息,请参阅 affinity。
annotations
annotations 允许您向 Gitaly pod 添加注解。
以下是 annotations的使用示例:
yamlannotations: kubernetes.io/example-annotation: annotation-value
priorityClassName
priorityClassName 允许您为 Gitaly pod 分配 PriorityClass。
以下是 priorityClassName的使用示例:
yamlpriorityClassName: persistence-enabled
git.config
git.config 允许您为 Gitaly 生成的所有 Git 命令添加配置。接受 git-config(1)中记录的配置,以 key / value 对的形式提供,如下所示。
yaml1git: 2 config: 3 - key: "pack.threads" 4 value: 4 5 - key: "fsck.missingSpaceBeforeDate" 6 value: ignore
cgroups
为防止资源耗尽,Gitaly 使用 cgroups 根据所操作的代码仓库将 Git 进程分配到某个 cgroup。每个 cgroup 都有内存和 CPU 限制,确保系统稳定性并防止资源饱和。
init-cgroups init 容器在 Gitaly 启动之前运行,并配置 cgroup 所有权,以便 Gitaly 可以管理 cgroups。该 init 容器:
- 必须以 root 身份运行(runAsUser: 0)。
- 挂载一个对 /sys/fs/cgroup 具有写访问权限的卷。
以下示例对代码仓库 cgroups 进行了超额订阅,为它们分配的组合资源超过父 cgroup 限制,因此单个代码仓库可以突发而无需提高整体限制。有关更多信息,请参阅配置超额订阅。
yaml1gitlab: 2 gitaly: 3 cgroups: 4 enabled: true 5 # Total limit across all repository cgroups 6 memoryBytes: 64424509440 # 60GiB 7 cpuShares: 1024 8 cpuQuotaUs: 1200000 # 12 cores 9 # Per repository limits, 1000 repository cgroups 10 repositories: 11 count: 1000 12 memoryBytes: 32212254720 # 30GiB 13 cpuShares: 512 14 cpuQuotaUs: 400000 # 4 cores
init-cgroups 容器安全上下文
init-cgroups 容器的安全上下文通过 cgroups.initContainer.securityContext 配置。该映射会直接渲染到容器清单中,因此接受 Kubernetes SecurityContext中任何有效的字段。无法识别的字段或 Pod 级字段会导致 Kubernetes API 验证错误,而不会被静默忽略。
在强制执行严格安全策略的集群上,例如使用 restricted 安全上下文约束(SCC)的 OpenShift,init-cgroups 容器还需要 privileged: true 和 allowPrivilegeEscalation: true 才能执行必要的 cgroup 所有权更改。
以下示例以特权容器方式运行 init-cgroups,以满足 OpenShift restricted SCC 的要求。
yaml1gitlab: 2 gitaly: 3 cgroups: 4 enabled: true 5 initContainer: 6 securityContext: 7 runAsUser: 0 8 runAsGroup: 0 9 runAsNonRoot: false 10 privileged: true 11 allowPrivilegeEscalation: true
外部服务
此 chart 应附加到 Workhorse 服务。
Workhorse
yamlworkhorse: host: workhorse.example.com serviceName: webservice port: 8181
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| host | String | Workhorse 服务器的主机名。可以省略此项而改用 serviceName。 | |
| port | Integer | 8181 | 连接到 Workhorse 服务器的端口。 |
| serviceName | String | webservice | 运行 Workhorse 服务器的 service的名称。如果存在此项且未提供 host,chart 将使用该服务的主机名(以及当前的 .Release.Name)来替代 host 值。当 Workhorse 作为整体 GitLab chart 的一部分使用时,这很方便。 |
Chart 设置
以下值用于配置 Gitaly Pod。
Gitaly 使用认证令牌向 Workhorse 和 Sidekiq 服务进行身份验证。认证令牌的密钥和键来自 global.gitaly.authToken 值。此外,Gitaly 容器包含一份 GitLab Shell 的副本,其中有一些可以设置的配置。Shell 的 authToken 来自 global.shell.authToken 值。
Git 代码仓库持久化
此 chart 会预配一个 PersistentVolumeClaim,并为 Git 代码仓库数据挂载相应的持久卷。为此,您需要在 Kubernetes 集群中拥有可用的物理存储。如果您更愿意使用 emptyDir,请通过以下方式禁用 PersistentVolumeClaim:persistence.enabled: false。
Gitaly 的持久化设置用于 volumeClaimTemplate,该模板应对所有 Gitaly pod 有效。您不应包含旨在引用单个特定卷的设置(例如 volumeName)。如果您想引用特定卷,需要手动创建 PersistentVolumeClaim。
部署后,您无法通过我们的设置更改这些内容。在 StatefulSet中,VolumeClaimTemplate 是不可变的。
yaml1persistence: 2 enabled: true 3 storageClass: standard 4 accessMode: ReadWriteOnce 5 size: 50Gi 6 matchLabels: {} 7 matchExpressions: [] 8 subPath: "data" 9 annotations: {}
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| accessMode | String | ReadWriteOnce | 设置 PersistentVolumeClaim 中请求的 accessMode。有关详细信息,请参阅 Kubernetes 访问模式文档。 |
| enabled | Boolean | true | 设置是否对代码仓库数据使用 PersistentVolumeClaims。如果为 false,则使用 emptyDir 卷。 |
| matchExpressions | Array | 接受一个标签条件对象数组,在选择要绑定的卷时用于匹配。这用于 PersistentVolumeClaim的 selector 部分。请参阅卷文档。 | |
| matchLabels | Map | 接受一个标签名称和标签值的 Map,在选择要绑定的卷时用于匹配。这用于 PersistentVolumeClaim的 selector 部分。请参阅卷文档。 | |
| size | String | 50Gi | 为数据持久化请求的最小卷大小。 |
| storageClass | String | 在 Volume Claim 上设置 storageClassName 以进行动态预配。未设置或为 null 时,将使用默认预配器。如果设置为连字符,则禁用动态预配。 | |
| subPath | String | 设置卷内要挂载的路径,而不是卷根目录。如果 subPath 为空,则使用根目录。 | |
| annotations | Map | 在 Volume Claim 上设置注解以进行动态预配。有关详细信息,请参阅 Kubernetes 注解文档。 |
通过 TLS 运行 Gitaly
本节指的是使用 Helm chart 在集群内运行 Gitaly。如果您使用外部 Gitaly 实例并希望使用 TLS 与其通信,请参阅外部 Gitaly 文档。
Gitaly 支持通过 TLS 与其他组件通信。这由 global.gitaly.tls.enabled 和 global.gitaly.tls.secretName 设置控制。请按照以下步骤通过 TLS 运行 Gitaly:
-
Helm chart 期望提供证书以通过 TLS 与 Gitaly 通信。此证书应适用于所有存在的 Gitaly 节点。因此,每个 Gitaly 节点的所有主机名都应作为主题备用名称(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
用于为内部 Gitaly pod 生成自定义签名证书的基本脚本可在此代码仓库中找到。用户可以使用或参考该脚本生成具有正确 SAN 属性的证书。
该脚本涵盖部分地址(.svc)和完全限定地址(.svc.cluster.local)。无论是否设置 global.clusterDomain,证书都保持有效。如果您的集群使用不同的域,请将其作为 CLUSTER_DOMAIN 传入:
shellCLUSTER_DOMAIN=k8s.example ./scripts/generate_certificates.sh gitaly
上一步中的 gitaly_address 值显示了证书必须涵盖哪些名称。
-
使用创建的证书创建 k8s TLS 密钥。
shellkubectl create secret tls gitaly-server-tls --cert=gitaly.crt --key=gitaly.key -
通过传入 --set global.gitaly.tls.enabled=true 重新部署 Helm chart。
全局服务器钩子
Gitaly StatefulSet 支持全局服务器钩子。钩子脚本在 Gitaly pod 上运行,因此仅限于 Gitaly 容器中可用的工具。
钩子使用 ConfigMaps 填充,可以通过适当设置以下值来使用:
- global.gitaly.hooks.preReceive.configmap
- global.gitaly.hooks.postReceive.configmap
- global.gitaly.hooks.update.configmap
要填充 ConfigMap,您可以将 kubectl 指向一个脚本目录:
shellkubectl create configmap MAP_NAME --from-file /PATH/TO/SCRIPT/DIR
对极狐GitLab 创建的提交进行 GPG 签名
Gitaly 能够对通过极狐GitLab UI(例如 WebIDE)创建的所有提交,以及由极狐GitLab 创建的提交(例如合并提交和压缩提交)进行 GPG 签名。
-
使用您的 GPG 私钥创建 k8s 密钥。
shellkubectl create secret generic gitaly-gpg-signing-key --from-file=signing_key=/path/to/gpg_signing_key.gpg -
在您的 values.yaml中启用 GPG 签名。
yaml1gitlab: 2 gitaly: 3 gpgSigning: 4 enabled: true 5 secret: gitaly-gpg-signing-key 6 key: signing_key
服务器端备份
此 chart 支持 Gitaly 服务器端备份。要使用它们:
-
创建一个存储桶来存储备份。
-
配置对象存储凭据和存储 URL。
yaml1gitlab: 2 gitaly: 3 extraEnvFrom: 4 # Mount the existing object store secret to the expected environment variables. 5 AWS_ACCESS_KEY_ID: 6 secretKeyRef: 7 name: <Rails object store secret> 8 key: aws_access_key_id 9 AWS_SECRET_ACCESS_KEY: 10 secretKeyRef: 11 name: <Rails object store secret> 12 key: aws_secret_access_key 13 backup: 14 # This is the connection string for Gitaly server side backups. 15 goCloudUrl: <object store connection URL>有关您的对象存储后端所需的环境变量和存储 URL 格式,请参阅 Gitaly 文档。