极狐 GitLab

使用 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 配置。

参数默认值描述
annotationsPod 注解
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.enabledfalse是否应使用 Gitaly GPG 签名
gpgSigning.secret用于 Gitaly GPG 签名的密钥名称。
gpgSigning.keyGPG 密钥中包含 Gitaly GPG 签名密钥的键。
image.pullPolicyAlwaysGitaly 镜像拉取策略
image.pullSecrets镜像仓库的密钥
image.repositoryregistry.gitlab.com/gitlab-org/build/cng/gitalyGitaly 镜像仓库
image.tagmasterGitaly 镜像标签
init.image.repositoryinitContainer 镜像
init.image.taginitContainer 镜像标签
init.containerSecurityContextinitContainer 特定的 securityContext
init.containerSecurityContext.allowPrivilegeEscalationfalseinitContainer 特定:控制进程是否可以获取比其父进程更多的权限
init.containerSecurityContext.runAsNonRoottrueinitContainer 特定:控制容器是否以非 root 用户运行
init.containerSecurityContext.capabilities.drop[ "ALL" ]initContainer 特定:移除容器的 Linux 能力
internal.names[]- defaultStatefulSet 存储的有序名称
serviceLabels{}补充服务标签
service.externalPort8075Gitaly 服务公开的端口
service.internalPort8075Gitaly 内部端口
service.namegitalyService 对象中 Gitaly 所在的 Service 端口名称。
service.typeClusterIPGitaly 服务类型
service.clusterIPNone您可以在 Service 创建请求中指定自己的集群 IP 地址。这遵循 Kubernetes Service 对象的 clusterIP 的相同约定。如果 service.type 为 LoadBalancer,则不得设置此项。
service.loadBalancerIP如果未设置,将创建一个临时 IP 地址。这遵循 Kubernetes Service 对象的 loadbalancerIP 配置的相同约定。
service.trafficDistribution在 Service 上设置 spec.trafficDistribution。默认不设置。
serviceAccount.annotations{}ServiceAccount 注解
serviceAccount.automountServiceAccountTokenfalse指示是否应在 pod 中挂载默认 ServiceAccount 访问令牌
serviceAccount.createfalse指示是否应创建 ServiceAccount
serviceAccount.enabledfalse指示是否使用 ServiceAccount
serviceAccount.nameServiceAccount 的名称。如果未设置,则使用完整的 chart 名称
securityContext.fsGroup1000应启动 pod 的组 ID
securityContext.fsGroupChangePolicy更改卷所有权和权限的策略(需要 Kubernetes 1.23)
securityContext.runAsUser1000应启动 pod 的用户 ID
securityContext.seccompProfile.typeRuntimeDefault要使用的 Seccomp 配置文件
shareProcessNamespacefalse允许使容器进程对同一 pod 中的所有其他容器可见
containerSecurityContext覆盖启动 Gitaly 容器时使用的容器 securityContext
containerSecurityContext.runAsUser1000允许覆盖启动 Gitaly 容器时使用的特定安全上下文用户 ID
containerSecurityContext.allowPrivilegeEscalationfalse控制 Gitaly 容器的进程是否可以获取比其父进程更多的权限
containerSecurityContext.runAsNonRoottrue控制 Gitaly 容器是否以非 root 用户运行
containerSecurityContext.capabilities.drop[ "ALL" ]移除 Gitaly 容器的 Linux 能力
tolerations[]用于 pod 分配的容忍标签
affinity{}用于 pod 分配的亲和性规则
persistence.accessModeReadWriteOnceGitaly 持久化访问模式
persistence.annotationsGitaly 持久化注解
persistence.enabledtrueGitaly 启用持久化标志
persistance.labelsGitaly 持久化标签
persistence.matchExpressions要绑定的标签表达式匹配
persistence.matchLabels要绑定的标签值匹配
persistence.size50GiGitaly 持久化卷大小
persistence.storageClass用于预配的 storageClassName
persistence.subPathGitaly 持久化卷挂载路径
priorityClassNameGitaly StatefulSet priorityClassName
logging.level日志级别
logging.formatjson日志格式
logging.sentryDsnSentry DSN URL - 来自 Go 服务器的异常
logging.sentryEnvironment用于日志记录的 Sentry 环境
shell.concurrency[]每个 RPC 端点的并发数。有关配置键,请参阅限制 RPC 并发数为 RPC 并发启用自适应
packObjectsCache.enabledfalse启用 Gitaly pack-objects 缓存
packObjectsCache.dir/home/git/repositories/+gitaly/PackObjectsCache存储缓存文件的目录
packObjectsCache.max_age5m缓存条目的生命周期
packObjectsCache.min_occurrences1创建缓存条目所需的最小计数
git.catFileCacheSizeGit cat-file 进程使用的缓存大小
git.config[][]Gitaly 在生成 Git 命令时应设置的 Git 配置
prometheus.grpcLatencyBuckets与 Gitaly 记录的 GRPC 方法调用直方图延迟对应的桶。需要以数组的字符串形式(例如 "[1.0, 1.5, 2.0]")作为输入
statefulset.strategy{}允许配置 StatefulSet 使用的更新策略
statefulset.livenessProbe.initialDelaySeconds0启动存活探针之前的延迟。如果启用了 startupProbe,则此项将设置为 0。
statefulset.livenessProbe.periodSeconds10执行存活探针的频率
statefulset.livenessProbe.timeoutSeconds3存活探针超时时间
statefulset.livenessProbe.successThreshold1存活探针在失败后被视为成功所需的最小连续成功次数
statefulset.livenessProbe.failureThreshold3存活探针在成功后被视为失败所需的最小连续失败次数
statefulset.readinessProbe.initialDelaySeconds0启动就绪探针之前的延迟。如果启用了 startupProbe,则此项将设置为 0。
statefulset.readinessProbe.periodSeconds5执行就绪探针的频率
statefulset.readinessProbe.timeoutSeconds3就绪探针超时时间
statefulset.readinessProbe.successThreshold1就绪探针在失败后被视为成功所需的最小连续成功次数
statefulset.readinessProbe.failureThreshold3就绪探针在成功后被视为失败所需的最小连续失败次数
statefulset.startupProbe.enabledtrue是否启用启动探针。
statefulset.startupProbe.initialDelaySeconds1启动启动探针之前的延迟
statefulset.startupProbe.periodSeconds1执行启动探针的频率
statefulset.startupProbe.timeoutSeconds1启动探针超时时间
statefulset.startupProbe.successThreshold1启动探针在失败后被视为成功所需的最小连续成功次数
statefulset.startupProbe.failureThreshold60启动探针在成功后被视为失败所需的最小连续失败次数
statefulset.revisionHistoryLimit要保留的先前修订版本数。未提供且未设置 global.revisionHistoryLimit 时,使用 Kubernetes 默认值。
metrics.enabledfalse是否应提供指标端点以供抓取
metrics.port9236指标端点端口
metrics.path/metrics指标端点路径
metrics.serviceMonitor.enabledfalse是否应创建 ServiceMonitor 以使 Prometheus Operator 能够管理指标抓取,请注意启用此项会移除 prometheus.io 抓取注解
metrics.serviceMonitor.additionalLabels{}要添加到 ServiceMonitor 的额外标签
metrics.serviceMonitor.endpointConfig{}ServiceMonitor 的额外端点配置
metrics.metricsPort已弃用请使用 metrics.port
gomemlimit.enabledtrue如果同时设置了 resources.limits.memory 限制,这将自动将 Gitaly 容器的 GOMEMLIMIT 环境变量设置为该限制值。用户可以通过将此值设置为 false 并在 extraEnv中设置 GOMEMLIMIT 来覆盖此值。这必须符合文档化的格式标准
cgroups.enabledfalseGitaly 具有内置的 cgroups 控制。配置后,Gitaly 会根据 Git 命令所操作的代码仓库将 Git 进程分配到某个 cgroup。此参数将启用代码仓库 cgroups。请注意,如果启用,仅支持 cgroups v2。
cgroups.initContainer.image.repositoryregistry.com/gitlab-org/build/cng/gitaly-init-cgroupsGitaly 镜像仓库
cgroups.initContainer.image.tagmasterGitaly 镜像标签
cgroups.initContainer.image.pullPolicyIfNotPresentGitaly 镜像拉取策略
cgroups.initContainer.securityContextinit-cgroups 容器的容器 securityContext。该映射按原样渲染,因此接受任何有效的容器级字段。
cgroups.initContainer.securityContext.runAsUser0init-cgroups 容器运行所用的用户 ID。必须为 0(root),以便容器可以设置 cgroup 所有权。
cgroups.initContainer.securityContext.runAsGroup0init-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.hierarchyRootgitalyGitaly 在其下创建组的父 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.countcgroups 池中的 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.maxCgroupsPerRepo1针对特定代码仓库的 Git 进程可以分布到的代码仓库 cgroup 数量。这使得可以为代码仓库 cgroup 配置更保守的 CPU 和内存限制,同时仍允许突发工作负载。例如,当 maxCgroupsPerRepo2memoryBytes 限制为 10GB 时,针对特定代码仓库的独立 Git 操作最多可消耗 20GB 内存。
gracefulRestartTimeout25Gitaly 关闭宽限期,即等待进行中请求完成的时间(秒)。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 设置(例如 gitdailyMaintenance)之上,并优先于它们。这些现有键仍然受支持,但建议使用 configuration

映射的键计划弃用。

以下是 configuration的使用示例:

yaml
configuration: 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_addrtlsprometheus_listen_addr)也会被忽略,因为它们必须与 chart 创建的 Service 端口和挂载的证书匹配。请改为通过 global.gitaly.tlsmetrics 进行配置。

extraEnv#

extraEnv 允许您在 pod 中的所有容器中公开额外的环境变量。

以下是 extraEnv的使用示例:

yaml
extraEnv: SOME_KEY: some_value SOME_OTHER_KEY: some_other_value

容器启动后,您可以确认环境变量已公开:

shell
env | grep SOME SOME_KEY=some_value SOME_OTHER_KEY=some_other_value

extraEnvFrom#

extraEnvFrom 允许您在 pod 中的所有容器中从其他数据源公开额外的环境变量。

以下是 extraEnvFrom的使用示例:

yaml
1extraEnvFrom: 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的使用示例

yaml
1image: 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 中挂载默认访问令牌。

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

tolerations#

tolerations 允许您在带有污点的工作节点上调度 pod

以下是 tolerations的使用示例:

yaml
1tolerations: 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的使用示例:

yaml
annotations: kubernetes.io/example-annotation: annotation-value

priorityClassName#

priorityClassName 允许您为 Gitaly pod 分配 PriorityClass

以下是 priorityClassName的使用示例:

yaml
priorityClassName: persistence-enabled

git.config#

git.config 允许您为 Gitaly 生成的所有 Git 命令添加配置。接受 git-config(1)中记录的配置,以 key / value 对的形式提供,如下所示。

yaml
1git: 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 限制,因此单个代码仓库可以突发而无需提高整体限制。有关更多信息,请参阅配置超额订阅

yaml
1gitlab: 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: trueallowPrivilegeEscalation: true 才能执行必要的 cgroup 所有权更改。

以下示例以特权容器方式运行 init-cgroups,以满足 OpenShift restricted SCC 的要求。

yaml
1gitlab: 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#

yaml
workhorse: host: workhorse.example.com serviceName: webservice port: 8181
名称类型默认值描述
hostStringWorkhorse 服务器的主机名。可以省略此项而改用 serviceName
portInteger8181连接到 Workhorse 服务器的端口。
serviceNameStringwebservice运行 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 是不可变的。

yaml
1persistence: 2 enabled: true 3 storageClass: standard 4 accessMode: ReadWriteOnce 5 size: 50Gi 6 matchLabels: {} 7 matchExpressions: [] 8 subPath: "data" 9 annotations: {}
名称类型默认值描述
accessModeStringReadWriteOnce设置 PersistentVolumeClaim 中请求的 accessMode。有关详细信息,请参阅 Kubernetes 访问模式文档
enabledBooleantrue设置是否对代码仓库数据使用 PersistentVolumeClaims。如果为 false,则使用 emptyDir 卷。
matchExpressionsArray接受一个标签条件对象数组,在选择要绑定的卷时用于匹配。这用于 PersistentVolumeClaimselector 部分。请参阅卷文档
matchLabelsMap接受一个标签名称和标签值的 Map,在选择要绑定的卷时用于匹配。这用于 PersistentVolumeClaimselector 部分。请参阅卷文档
sizeString50Gi为数据持久化请求的最小卷大小。
storageClassString在 Volume Claim 上设置 storageClassName 以进行动态预配。未设置或为 null 时,将使用默认预配器。如果设置为连字符,则禁用动态预配。
subPathString设置卷内要挂载的路径,而不是卷根目录。如果 subPath 为空,则使用根目录。
annotationsMap在 Volume Claim 上设置注解以进行动态预配。有关详细信息,请参阅 Kubernetes 注解文档

通过 TLS 运行 Gitaly#

本节指的是使用 Helm chart 在集群内运行 Gitaly。如果您使用外部 Gitaly 实例并希望使用 TLS 与其通信,请参阅外部 Gitaly 文档

Gitaly 支持通过 TLS 与其他组件通信。这由 global.gitaly.tls.enabledglobal.gitaly.tls.secretName 设置控制。请按照以下步骤通过 TLS 运行 Gitaly:

  1. Helm chart 期望提供证书以通过 TLS 与 Gitaly 通信。此证书应适用于所有存在的 Gitaly 节点。因此,每个 Gitaly 节点的所有主机名都应作为主题备用名称(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

用于为内部 Gitaly pod 生成自定义签名证书的基本脚本可在此代码仓库中找到。用户可以使用或参考该脚本生成具有正确 SAN 属性的证书。

该脚本涵盖部分地址(.svc)和完全限定地址(.svc.cluster.local)。无论是否设置 global.clusterDomain,证书都保持有效。如果您的集群使用不同的域,请将其作为 CLUSTER_DOMAIN 传入:

shell
CLUSTER_DOMAIN=k8s.example ./scripts/generate_certificates.sh gitaly

上一步中的 gitaly_address 值显示了证书必须涵盖哪些名称。

  1. 使用创建的证书创建 k8s TLS 密钥。

    shell
    kubectl create secret tls gitaly-server-tls --cert=gitaly.crt --key=gitaly.key
  2. 通过传入 --set global.gitaly.tls.enabled=true 重新部署 Helm chart。

全局服务器钩子#

Gitaly StatefulSet 支持全局服务器钩子。钩子脚本在 Gitaly pod 上运行,因此仅限于 Gitaly 容器中可用的工具。

钩子使用 ConfigMaps 填充,可以通过适当设置以下值来使用:

  1. global.gitaly.hooks.preReceive.configmap
  2. global.gitaly.hooks.postReceive.configmap
  3. global.gitaly.hooks.update.configmap

要填充 ConfigMap,您可以将 kubectl 指向一个脚本目录:

shell
kubectl create configmap MAP_NAME --from-file /PATH/TO/SCRIPT/DIR

对极狐GitLab 创建的提交进行 GPG 签名#

Gitaly 能够对通过极狐GitLab UI(例如 WebIDE)创建的所有提交,以及由极狐GitLab 创建的提交(例如合并提交和压缩提交)进行 GPG 签名

  1. 使用您的 GPG 私钥创建 k8s 密钥。

    shell
    kubectl create secret generic gitaly-gpg-signing-key --from-file=signing_key=/path/to/gpg_signing_key.gpg
  2. 在您的 values.yaml中启用 GPG 签名。

    yaml
    1gitlab: 2 gitaly: 3 gpgSigning: 4 enabled: true 5 secret: gitaly-gpg-signing-key 6 key: signing_key

服务器端备份#

此 chart 支持 Gitaly 服务器端备份。要使用它们:

  1. 创建一个存储桶来存储备份。

  2. 配置对象存储凭据和存储 URL。

    yaml
    1gitlab: 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 文档

  3. 使用 backup-utility 启用服务器端备份