使用 GitLab Webservice Chart
Tier: 基础版,专业版,旗舰版
Offering: 私有化部署
webservice 子 Chart 为 GitLab Rails Web 服务器提供每个 Pod 两个 Webservice 工作进程,这是单个 Pod 能够处理极狐GitLab 中任何 Web 请求所需的最低配置。
此 Chart 的 Pod 使用两个容器:gitlab-workhorse 和 webservice。 GitLab Workhorse 监听 8181 端口,并且应 始终 作为发往 Pod 的入站流量的目的地。 webservice 包含极狐GitLab Rails 代码库, 监听 8080 端口,并可用于指标收集。 webservice 不应直接接收正常流量。
要求
此 Chart 依赖 Redis、PostgreSQL、Gitaly 和 Registry 服务,这些服务可以是完整 GitLab Chart 的一部分,也可以是由此 Chart 部署到的 Kubernetes 集群可访问的外部服务。
配置
webservice Chart 的配置如下:全局设置、 部署设置、Ingress 设置、外部服务 和 Chart 设置。
安装命令行选项
下表包含可以通过 --set 标志提供给 helm install 命令的所有可能的 Chart 配置。
| 参数 | 默认值 | 描述 |
|---|---|---|
| annotations | Pod 注解 | |
| podLabels | 补充 Pod 标签。不用于选择器。 | |
| common.labels | 应用于此 Chart 创建的所有对象的补充标签。 | |
| deployment.terminationGracePeriodSeconds | 30 | Kubernetes 等待 Pod 退出的秒数,注意此值必须长于 shutdown.blackoutSeconds |
| deployment.livenessProbe.initialDelaySeconds | 20 | 启动存活探针前的延迟时间 |
| deployment.livenessProbe.periodSeconds | 60 | 执行存活探针的频率 |
| deployment.livenessProbe.timeoutSeconds | 30 | 存活探针超时时间 |
| deployment.livenessProbe.successThreshold | 1 | 存活探针失败后被视为成功所需的最小连续成功次数 |
| deployment.livenessProbe.failureThreshold | 3 | 存活探针成功后被视为失败所需的最小连续失败次数 |
| deployment.readinessProbe.initialDelaySeconds | 0 | 启动就绪探针前的延迟时间 |
| deployment.readinessProbe.periodSeconds | 10 | 执行就绪探针的频率 |
| deployment.readinessProbe.timeoutSeconds | 2 | 就绪探针超时时间 |
| deployment.readinessProbe.successThreshold | 1 | 就绪探针失败后被视为成功所需的最小连续成功次数 |
| deployment.readinessProbe.failureThreshold | 3 | 就绪探针成功后被视为失败所需的最小连续失败次数 |
| deployment.strategy | {} | 允许配置 Deployment 使用的更新策略。未提供时,使用集群默认值。 |
| deployment.revisionHistoryLimit | 要保留的先前修订版本数量。未提供且 global.revisionHistoryLimit 未设置时,使用 Kubernetes 默认值。 | |
| enabled | true | Webservice 启用标志 |
| extraContainers | 包含要添加的容器列表的多行字面量字符串 | |
| extraInitContainers | 要添加的额外初始化容器列表 | |
| extras.google_analytics_id | nil | 前端的 Google Analytics ID |
| extraVolumeMounts | 要执行的额外卷挂载列表 | |
| extraVolumes | 要创建的额外卷列表 | |
| extraEnv | 要暴露的额外环境变量列表 | |
| extraEnvFrom | 要从其他数据源暴露的额外环境变量列表 | |
| gitlab.webservice.workhorse.image | registry.gitlab.com/gitlab-org/build/cng/gitlab-workhorse-ee | Workhorse 镜像仓库 |
| gitlab.webservice.workhorse.tag | Workhorse 镜像标签 | |
| hpa.behavior | {scaleDown: {stabilizationWindowSeconds: 300 }} | 行为包含向上和向下扩缩行为的规范(需要 autoscaling/v2beta2 或更高版本) |
| hpa.customMetrics | [] | 自定义指标包含用于计算所需副本数的规范(覆盖在 targetAverageUtilization 中配置的默认平均 CPU 利用率) |
| hpa.cpu.targetType | AverageValue | 设置自动扩缩 CPU 目标类型,必须为 Utilization 或 AverageValue |
| hpa.cpu.targetAverageValue | 1 | 设置自动扩缩 CPU 目标值 |
| hpa.cpu.targetAverageUtilization | 设置自动扩缩 CPU 目标利用率 | |
| hpa.memory.targetType | 设置自动扩缩内存目标类型,必须为 Utilization 或 AverageValue | |
| hpa.memory.targetAverageValue | 设置自动扩缩内存目标值 | |
| hpa.memory.targetAverageUtilization | 设置自动扩缩内存目标利用率 | |
| hpa.targetAverageValue | 已弃用 设置自动扩缩 CPU 目标值 | |
| sshHostKeys.mount | false | 是否挂载包含公共 SSH 密钥的 GitLab Shell 密钥。 |
| sshHostKeys.mountName | ssh-host-keys | 挂载卷的名称。 |
| sshHostKeys.types | [dsa,rsa,ecdsa,ed25519] | 要挂载的 SSH 密钥类型列表。 |
| image.pullPolicy | Always | Webservice 镜像拉取策略 |
| image.pullSecrets | 镜像仓库的密钥 | |
| image.repository | registry.gitlab.com/gitlab-org/build/cng/gitlab-webservice-ee | Webservice 镜像仓库 |
| image.tag | Webservice 镜像标签 | |
| init.image.repository | initContainer 镜像 | |
| init.image.tag | initContainer 镜像标签 | |
| init.containerSecurityContext.runAsUser | 1000 | initContainer 特定:启动容器所用的用户 ID |
| init.containerSecurityContext.allowPrivilegeEscalation | false | initContainer 特定:控制进程是否可以获得比其父进程更多的权限 |
| init.containerSecurityContext.runAsNonRoot | true | initContainer 特定:控制容器是否以非 root 用户运行 |
| init.containerSecurityContext.capabilities.drop | [ "ALL" ] | initContainer 特定:移除容器的 Linux capabilities |
| keda.enabled | false | 使用 KEDA ScaledObjects 而不是 HorizontalPodAutoscalers |
| keda.pollingInterval | 30 | 检查每个触发器的间隔 |
| keda.cooldownPeriod | 300 | 在最后一个触发器报告活动后,将资源缩回 0 之前等待的时间 |
| keda.minReplicaCount | minReplicas | KEDA 将资源缩小的最小副本数。 |
| keda.maxReplicaCount | maxReplicas | KEDA 将资源扩大的最大副本数。 |
| keda.fallback | KEDA 回退配置,请参阅 文档 | |
| keda.hpaName | keda-hpa-{scaled-object-name} | KEDA 将创建的 HPA 资源名称。 |
| keda.restoreToOriginalReplicaCount | 指定在删除 ScaledObject 后,是否应将目标资源缩放回原始副本数 | |
| keda.behavior | hpa.behavior | 向上和向下扩缩行为的规范。 |
| keda.triggers | 激活目标资源扩缩的触发器列表,默认为根据 hpa.cpu 和 hpa.memory 计算的触发器 | |
| metrics.enabled | true | 是否应提供指标端点以供抓取 |
| metrics.port | 8083 | 指标端点端口 |
| metrics.listenAddr | null | 指标监听地址。默认为 null,即同时绑定 IPv4 和 IPv6。 |
| metrics.path | /metrics | 指标端点路径 |
| metrics.serviceMonitor.enabled | false | 是否应创建 ServiceMonitor 以使 Prometheus Operator 管理指标抓取,请注意启用此选项会移除 prometheus.io 抓取注解 |
| metrics.serviceMonitor.additionalLabels | {} | 要添加到 ServiceMonitor 的额外标签 |
| metrics.serviceMonitor.endpointConfig | {} | ServiceMonitor 的额外端点配置 |
| metrics.annotations | 已弃用 设置显式指标注解。已由模板内容替代。 | |
| metrics.tls.enabled | 为 metrics/web_exporter 端点启用 TLS。默认为 tls.enabled。 | |
| metrics.tls.secretName | metrics/web_exporter 端点 TLS 证书和密钥的 Secret。默认为 tls.secretName。 | |
| monitoring.ipWhitelist | [0.0.0.0/0, ::/0] | 监控端点的 IP 白名单列表 |
| monitoring.exporter.listenAddr | null | 指标监听地址。默认为 null,即同时绑定 IPv4 和 IPv6。 |
| monitoring.exporter.enabled | false | 启用 Web 服务器以暴露 Prometheus 指标,如果指标端口设置为监控导出器端口,则此设置会被 metrics.enabled 覆盖 |
| monitoring.exporter.port | 8083 | 指标导出器使用的端口号 |
| psql.password.key | psql-password | psql Secret 中 psql 密码的键 |
| psql.password.secret | gitlab-postgres | psql Secret 名称 |
| psql.port | 设置 PostgreSQL 服务器端口。优先于 global.psql.port | |
| puma.disableWorkerKiller | true | 禁用 Puma 工作进程内存杀手 |
| puma.workerMaxMemory | Puma 工作进程杀手的内存上限(以兆字节为单位) | |
| puma.threads.min | 4 | Puma 线程数下限 |
| puma.threads.max | 4 | Puma 线程数上限 |
| puma.bindIp6 | true | 使用 Puma 绑定 IPv6 地址。当 IPv6 不可用时自动回退到 IPv4。 |
| rack_attack.git_basic_auth | {} | 详细信息请参阅 极狐GitLab 文档 |
| global.registry.api.port | 5000 | Registry 端口 |
| global.registry.api.protocol | http | Registry 协议 |
| global.registry.api.serviceName | registry | Registry 服务名称 |
| global.registry.enabled | true | 启用容器镜像仓库集成(控制项目菜单中的仓库链接以及极狐GitLab 应用是否联系 Registry,例如在删除或转移项目时)。设置为 false 以完全禁用容器镜像仓库功能。 |
| global.registry.tokenIssuer | gitlab-issuer | Registry 令牌颁发者 |
| replicaCount | 1 | Webservice 副本数 |
| resources.requests.cpu | 300m | Webservice 最低 CPU |
| resources.requests.memory | 1.5G | Webservice 最低内存 |
| service.externalPort | 8080 | Webservice 暴露端口 |
| securityContext.fsGroup | 1000 | 启动 Pod 所用的组 ID |
| securityContext.runAsUser | 1000 | 启动 Pod 所用的用户 ID |
| securityContext.fsGroupChangePolicy | 更改卷所有者和权限的策略(需要 Kubernetes 1.23) | |
| securityContext.seccompProfile.type | RuntimeDefault | 要使用的 Seccomp 配置文件 |
| containerSecurityContext | 覆盖启动容器所用的 securityContext | |
| containerSecurityContext.runAsUser | 1000 | 允许覆盖启动容器所用的特定安全上下文用户 ID |
| containerSecurityContext.allowPrivilegeEscalation | false | 控制 Gitaly 容器的进程是否可以获得比其父进程更多的权限 |
| containerSecurityContext.runAsNonRoot | true | 控制 Gitaly 容器是否以非 root 用户运行 |
| containerSecurityContext.capabilities.drop | [ "ALL" ] | 移除 Gitaly 容器的 Linux capabilities |
| serviceAccount.automountServiceAccountToken | false | 指示是否应将默认 ServiceAccount 访问令牌挂载到 Pod 中 |
| serviceAccount.create | false | 指示是否应创建 ServiceAccount |
| serviceAccount.enabled | false | 指示是否使用 ServiceAccount |
| serviceAccount.name | ServiceAccount 的名称。如果未设置,则使用完整的 Chart 名称 | |
| serviceLabels | {} | 补充服务标签 |
| service.internalPort | 8080 | Webservice 内部端口 |
| service.type | ClusterIP | Webservice 服务类型 |
| service.workhorseExternalPort | 8181 | Workhorse 暴露端口 |
| service.workhorseInternalPort | 8181 | Workhorse 内部端口 |
| service.loadBalancerIP | 分配给 LoadBalancer 的 IP 地址(如果云提供商支持) | |
| service.loadBalancerSourceRanges | 允许访问 LoadBalancer 的 IP CIDR 列表(如果支持)。service.type = LoadBalancer 时必需 | |
| shell.authToken.key | secret | shell Secret 中 shell 令牌的键 |
| shell.authToken.secret | {Release.Name}-gitlab-shell-secret | Shell 令牌 Secret |
| shell.port | nil | UI 生成的 SSH URL 中使用的端口号 |
| shutdown.blackoutSeconds | 10 | 收到关闭信号后保持 Webservice 运行的秒数。必须短于 deployment.terminationGracePeriodSeconds。同时配置 workhorse 健康检查监听器(如果启用)的关闭延迟。 |
| tls.enabled | false | Webservice TLS 启用 |
| tls.secretName | {Release.Name}-webservice-tls | Webservice TLS Secret。secretName 必须指向 Kubernetes TLS Secret。 |
| tolerations | [] | Pod 分配的容忍标签 |
| trusted_proxies | [] | 详细信息请参阅 极狐GitLab 文档 |
| workhorse.logFormat | json | 日志格式。有效格式:json、structured、text |
| workerProcesses | 2 | Webservice 工作进程数 |
| workhorse.keywatcher | true | 将 workhorse 订阅到 Redis。任何处理 /api/* 请求的部署都必须启用此选项,但对于其他部署可以安全禁用 |
| workhorse.shutdownTimeout | global.webservice.workerTimeout + 1 (秒) | 等待所有 Web 请求从 Workhorse 清除的时间。示例:1min、65s。 |
| workhorse.adoptCfRayHeader | false | 如果存在,采用传入的 Cf-Ray 头作为关联 ID。更多详情请参阅 Workhorse 文档。 |
| workhorse.trustedCIDRsForPropagation | 可信任用于传播关联 ID 的 CIDR 块列表。要使其生效,还必须在 workhorse.extraArgs 中使用 -propagateCorrelationID 选项。更多详情请参阅 Workhorse 文档。 | |
| workhorse.trustedCIDRsForXForwardedFor | 可用于通过 X-Forwarded-For HTTP 头解析实际客户端 IP 的 CIDR 块列表。这与 workhorse.trustedCIDRsForPropagation 一起使用。更多详情请参阅 Workhorse 文档。 | |
| workhorse.metadata.zipReaderLimitBytes | 限制 zip 读取器的可选字节数。在极狐GitLab 16.9 中引入。更多详情请参阅 Workhorse 文档。 | |
| workhorse.containerSecurityContext | 覆盖启动容器所用的 securityContext | |
| workhorse.containerSecurityContext.runAsUser | 1000 | 启动容器所用的用户 ID |
| workhorse.containerSecurityContext.allowPrivilegeEscalation | false | 控制容器的进程是否可以获得比其父进程更多的权限 |
| workhorse.containerSecurityContext.runAsNonRoot | true | 控制容器是否以非 root 用户运行 |
| workhorse.containerSecurityContext.capabilities.drop | [ "ALL" ] | 移除 Gitaly 容器的 Linux capabilities |
| workhorse.livenessProbe.initialDelaySeconds | 20 | 启动存活探针前的延迟时间 |
| workhorse.livenessProbe.periodSeconds | 60 | 执行存活探针的频率 |
| workhorse.livenessProbe.timeoutSeconds | 30 | 存活探针超时时间 |
| workhorse.livenessProbe.successThreshold | 1 | 存活探针失败后被视为成功所需的最小连续成功次数 |
| workhorse.livenessProbe.failureThreshold | 3 | 存活探针成功后被视为失败所需的最小连续失败次数 |
| workhorse.healthcheckListener.enabled | false | 启用 workhorse 健康检查监听器并禁用默认的 Puma 就绪探针。允许更可靠且更少波动地检测就绪状态。在极狐GitLab 18.5 中引入。 |
| workhorse.healthcheckListener.port | 8182 | 健康检查监听器使用的端口号。 |
| workhorse.healthcheckListener.pumaControl | true | 查询 Puma 控制应用而不是 Puma 就绪端点。 |
| workhorse.healthcheckListener.checkInterval | 10s | 对上游 Puma 服务器进行连续健康状态检查的时间间隔。 |
| workhorse.healthcheckListener.timeout | 5s | Puma 检查请求的超时时间。 |
| workhorse.healthcheckListener.maxConsecutiveFailures | 1 | 将 workhorse 标记为未就绪前的失败次数。 |
| workhorse.healthcheckListener.minSuccessfullProbes | 1 | workhorse 被视为就绪前的成功探针次数。 |
| workhorse.healthcheckListener.railsSkipInterval | 0s | 成功处理请求后恢复 Puma 就绪检查前的延迟时间。默认禁用。 |
| workhorse.loadShedding.enabled | false | 启用负载削减,当 Puma 的请求积压超过阈值时返回 503。 |
| workhorse.loadShedding.backlogThreshold | 50 | 开始丢弃负载的积压阈值。 |
| workhorse.loadShedding.backlogHysteresis | 0.8 | 停用时的滞后因子(0.0 到 1.0)。当积压低于阈值 * 滞后因子时,负载削减停用。 |
| workhorse.loadShedding.retryAfterSeconds | 0 | 削减负载时 Retry-After 头的值(秒)。使用 0 表示立即重试(推荐用于 Kubernetes)。 |
| workhorse.loadShedding.statusCode | 503 | 削减负载时返回的 HTTP 状态码。使用自定义代码(如 529)以区分负载削减与其他 503 错误。 |
| workhorse.loadShedding.strategy | max | 计算有效积压的策略:“max”(默认)或“sum”。 |
| workhorse.loadShedding.checkInterval | 1s | 采样 Puma 积压指标的频率。与健康检查间隔无关。 |
| workhorse.loadShedding.timeout | 5s | 控制服务器请求的超时时间。 |
| workhorse.monitoring.exporter.enabled | false | 启用 workhorse 以暴露 Prometheus 指标,此设置会被 workhorse.metrics.enabled 覆盖 |
| workhorse.monitoring.exporter.port | 9229 | workhorse Prometheus 指标使用的端口号 |
| workhorse.monitoring.exporter.tls.enabled | false | 设置为 true 时,在指标端点启用 TLS。这需要 为 Workhorse 启用 TLS。 |
| workhorse.metrics.enabled | true | 是否应提供 workhorse 指标端点以供抓取 |
| workhorse.metrics.port | 8083 | Workhorse 指标端点端口 |
| workhorse.metrics.path | /metrics | Workhorse 指标端点路径 |
| workhorse.metrics.serviceMonitor.enabled | false | 是否应创建 ServiceMonitor 以使 Prometheus Operator 管理 Workhorse 指标抓取 |
| workhorse.metrics.serviceMonitor.additionalLabels | {} | 要添加到 Workhorse ServiceMonitor 的额外标签 |
| workhorse.metrics.serviceMonitor.endpointConfig | {} | Workhorse ServiceMonitor 的额外端点配置 |
| workhorse.readinessProbe.initialDelaySeconds | 0 | 启动就绪探针前的延迟时间 |
| workhorse.readinessProbe.periodSeconds | 10 | 执行就绪探针的频率 |
| workhorse.readinessProbe.timeoutSeconds | 2 | 就绪探针超时时间 |
| workhorse.readinessProbe.successThreshold | 1 | 就绪探针失败后被视为成功所需的最小连续成功次数 |
| workhorse.readinessProbe.failureThreshold | 3 | 就绪探针成功后被视为失败所需的最小连续失败次数 |
| workhorse.imageScaler.maxProcs | 2 | 可并发运行的图像缩放进程的最大数量 |
| workhorse.imageScaler.maxFileSizeBytes | 250000 | 缩放器处理的图像的最大文件大小(字节) |
| workhorse.tls.verify | true | 设置为 true 时,强制 NGINX Ingress 验证 Workhorse 的 TLS 证书。对于自定义 CA,您还需要设置 workhorse.tls.caSecretName。对于自签名证书,必须设置为 false。如果使用 Gateway API,Gateway API 控制器始终验证证书。 |
| workhorse.tls.secretName | {Release.Name}-workhorse-tls | 包含 TLS 密钥和证书对的 TLS Secret 的名称。启用 Workhorse TLS 时必需。 |
| workhorse.tls.caSecretName | 包含 CA 证书的 Secret 名称。这不是 TLS Secret,且必须只有 ca.crt 键。这用于 NGINX 的 TLS 验证。 | |
| workhorse.circuitBreaker.enabled | false | 是否启用熔断器 |
| workhorse.circuitBreaker.timeout | 60 | 熔断器打开时转换到半开状态的持续时间(秒) |
| workhorse.circuitBreaker.interval | 180. | 熔断器关闭时清除连续失败的持续时间(秒) |
| workhorse.circuitBreaker.maxRequests | 1. | 熔断器半开时打开所需的失败请求数 |
| workhorse.circuitBreaker.consecutiveFailures | 5. | 熔断器关闭时打开所需的连续失败请求数 |
| webServer | puma | 选择用于请求处理的 Web 服务器(Webservice/Puma) |
| priorityClassName | "" | 允许配置 Pod 的 priorityClassName,用于在驱逐时控制 Pod 优先级 |
| antiAffinity | "" | 允许您覆盖 Chart 全局值中的 antiAffinity 值,默认从全局读取,可设置为 soft 或 hard |
Chart 配置示例
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 14deployments: 15 default: 16 extraEnvFrom: 17 CONFIG_STRING: 18 configMapKeyRef: 19 name: useful-config 20 key: some-string 21 # optional: boolean
image.pullSecrets
pullSecrets 允许您通过认证私有仓库来为 Pod 拉取镜像。
有关私有仓库及其认证方法的更多详细信息,请参阅 Kubernetes 文档。
以下是 pullSecrets 的使用示例:
yaml1image: 2 repository: my.webservice.repository 3 pullPolicy: Always 4 pullSecrets: 5 - name: my-secret-name 6 - name: my-secondary-secret-name
serviceAccount
此部分控制是否应创建 ServiceAccount,以及是否应将默认访问令牌挂载到 Pod 中。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| annotations | 映射(Map) | {} | ServiceAccount 注解。 |
| automountServiceAccountToken | 布尔值(Boolean) | false | 控制是否应将默认 ServiceAccount 访问令牌挂载到 Pod 中。除非某些边车需要它才能正常工作(例如 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"
annotations
annotations 允许您向 Webservice Pod 添加注解。例如:
yamlannotations: kubernetes.io/example-annotation: annotation-value
strategy
deployment.strategy 允许您更改 Deployment 更新策略。它定义了更新 Deployment 时如何重新创建 Pod。未提供时,使用集群默认值。 例如,如果您不想在滚动更新开始时创建额外的 Pod,并将最大不可用 Pod 数更改为 50%:
yamldeployment: strategy: rollingUpdate: maxSurge: 0 maxUnavailable: 50%
您也可以将更新策略类型更改为 Recreate,但请注意,这会在调度新 Pod 之前终止所有 Pod,并且在新 Pod 启动之前 Web UI 将不可用。在这种情况下,您无需定义 rollingUpdate,只需定义 type:
yamldeployment: strategy: type: Recreate
更多详细信息,请参阅 Kubernetes 文档。
TLS
一个 Webservice Pod 运行两个容器:
- gitlab-workhorse
- webservice
gitlab-workhorse
Workhorse 支持 Web 和指标端点的 TLS。这将保护 Workhorse 与其他组件之间的通信,特别是 nginx-ingress、 gitlab-shell 和 gitaly。TLS 证书应在通用名称(CN)或主题备用名称(SAN)中包含 Workhorse 服务主机名(例如 RELEASE-webservice-default.default.svc)。如果设置了 global.clusterDomain,请改用完全限定的 服务主机名。
请注意,可以存在多个 Webservice 部署, 因此您需要为不同的服务名称准备 TLS 证书。这 可以通过多个 SAN 或通配符证书来实现。
生成 TLS 证书后,为其创建一个 Kubernetes TLS Secret。您还需要创建 另一个仅包含 TLS 证书的 CA 证书且带有 ca.crt 键的 Secret。
可以通过将 global.workhorse.tls.enabled 设置为 true 来为 gitlab-workhorse 容器启用 TLS。您可以相应地传递自定义 Secret 名称给 gitlab.webservice.workhorse.tls.secretName 和 global.certificates.customCAs。
当 gitlab.webservice.workhorse.tls.verify 为 true(默认情况下)时,您 还需要将 CA 证书 Secret 名称传递给 gitlab.webservice.workhorse.tls.caSecretName。 这对于自签名证书和自定义 CA 是必需的。NGINX 使用此 Secret 来验证 Workhorse 的 TLS 证书。
yaml1global: 2 workhorse: 3 tls: 4 enabled: true 5 certificates: 6 customCAs: 7 - secret: gitlab-workhorse-ca 8gitlab: 9 webservice: 10 workhorse: 11 tls: 12 verify: true 13 # secretName: gitlab-workhorse-tls 14 caSecretName: gitlab-workhorse-ca 15 monitoring: 16 exporter: 17 enabled: true 18 tls: 19 enabled: true
gitlab-workhorse 容器指标端点上的 TLS 继承自 global.workhorse.tls.enabled。请注意,仅当为 Workhorse 启用 TLS 时,指标端点上的 TLS 才可用。指标监听器使用由 gitlab.webservice.workhorse.tls.secretName 指定的相同 TLS 证书。
用于指标端点的 TLS 证书可能需要对包含的主题备用名称(SAN)进行额外考虑,特别是如果使用附带的 Prometheus Helm Chart。更多信息,请参阅 配置 Prometheus 抓取启用 TLS 的端点。
webservice
启用 TLS 的主要用例是通过 HTTPS 为 抓取 Prometheus 指标 提供加密。
为了让 Prometheus 使用 HTTPS 抓取 /metrics/ 端点,需要对证书的 CommonName 属性或 SubjectAlternativeName 条目进行额外配置。请参阅 配置 Prometheus 抓取启用 TLS 的端点 了解这些要求。
可以通过设置 gitlab.webservice.tls.enabled 在 webservice 容器上启用 TLS:
yamlgitlab: webservice: tls: enabled: true # secretName: gitlab-webservice-tls
secretName 必须指向 Kubernetes TLS Secret。 例如,要使用本地证书和密钥创建 TLS Secret:
shellkubectl create secret tls <secret name> --cert=path/to/puma.crt --key=path/to/puma.key
使用此 Chart 的基础版
默认情况下,Helm Charts 使用极狐GitLab 企业版。如果需要,您 可以使用基础版。了解更多关于 两者之间的差异。
要使用基础版,请将 image.repository 设置为 registry.gitlab.com/gitlab-org/build/cng/gitlab-webservice-ce,并将 workhorse.image 设置为 registry.gitlab.com/gitlab-org/build/cng/gitlab-workhorse-ce。
全局设置
我们在 Charts 之间共享一些通用的全局设置。有关常见配置选项(例如极狐GitLab 和 Registry 主机名),请参阅 全局文档。
部署设置
此 Chart 能够创建多个 Deployment 对象及其相关 资源。此功能允许使用基于路径的路由将发往极狐GitLab 应用的请求分发到多组 Pod 之间。
此 Map 的键(此示例中的 default)是每个 Deployment 的“名称”。default 将创建一个名为 RELEASE-webservice-default 的 Deployment、Service、HorizontalPodAutoscaler、PodDisruptionBudget 和 可选的 Ingress。
任何未提供的属性都将继承自 gitlab-webservice Chart 的默认值。
yaml1deployments: 2 default: 3 ingress: 4 path: # Does not inherit or default. Leave blank to disable Ingress. 5 pathType: Prefix 6 provider: nginx 7 annotations: 8 # inherits `ingress.anntoations` 9 proxyConnectTimeout: # inherits `ingress.proxyConnectTimeout` 10 proxyReadTimeout: # inherits `ingress.proxyReadTimeout` 11 proxyBodySize: # inherits `ingress.proxyBodySize` 12 deployment: 13 annotations: # map 14 labels: # map 15 # inherits `deployment` 16 pod: 17 labels: # additional labels to .podLabels 18 annotations: # map 19 # inherit from .Values.annotations 20 service: 21 labels: # additional labels to .serviceLabels 22 annotations: # additional annotations to .service.annotations 23 # inherits `service.annotations` 24 hpa: 25 minReplicas: # defaults to .minReplicas 26 maxReplicas: # defaults to .maxReplicas 27 metrics: # optional replacement of HPA metrics definition 28 # inherits `hpa` 29 pdb: 30 maxUnavailable: # inherits `maxUnavailable` 31 resources: # `resources` for `webservice` container 32 # inherits `resources` 33 workhorse: # map 34 # inherits `workhorse` 35 extraEnv: # 36 # inherits `extraEnv` 37 extraEnvFrom: # 38 # inherits `extraEnvFrom` 39 puma: # map 40 # inherits `puma` 41 workerProcesses: # inherits `workerProcesses` 42 shutdown: 43 # inherits `shutdown` 44 nodeSelector: # map 45 # inherits `nodeSelector` 46 tolerations: # array 47 # inherits `tolerations` 48 priorityClassName: # inherits `priorityClassName`
部署 Ingress
每个 deployments 条目都将继承 Chart 范围的 Ingress 设置。此处提供的任何值都将覆盖这些设置。除了 path 之外,所有设置都与这些设置相同。
yaml1webservice: 2 deployments: 3 default: 4 ingress: 5 path: / 6 api: 7 ingress: 8 path: /api
path 属性直接填充到 Ingress 的 path 属性中,并允许控制定向到每个服务的 URI 路径。在上面的示例中, default 充当 catch-all 路径,而 api 接收 /api 下的所有流量。
您可以通过将 path 设置为空来禁用为给定 Deployment 创建关联的 Ingress 资源。请参阅下文,其中 internal-api 将永远不会接收外部流量。
yaml1webservice: 2 deployments: 3 default: 4 ingress: 5 path: / 6 api: 7 ingress: 8 path: /api 9 internal-api: 10 ingress: 11 path:
Ingress 设置
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| ingress.apiVersion | 字符串(String) | 用于 apiVersion 字段的值。 | |
| ingress.annotations | 映射(Map) | 请参阅 下文 | 这些注解将用于每个 Ingress。例如:ingress.annotations."nginx\.ingress\.kubernetes\.io/enable-access-log"=true。 |
| ingress.configureCertmanager | 布尔值(Boolean) | 切换 Ingress 注解 cert-manager.io/issuer 和 acme.cert-manager.io/http01-edit-in-place。更多信息请参阅 GitLab Pages 的 TLS 要求。 | |
| ingress.enabled | 布尔值(Boolean) | false | 控制是否为支持它们的服务创建 Ingress 对象的设置。当为 false 时,使用 global.ingress.enabled 设置值。 |
| ingress.proxyBodySize | 字符串(String) | 512m | 请参阅下文。 |
| ingress.serviceUpstream | 布尔值(Boolean) | true | 请参阅下文。 |
| ingress.tls.enabled | 布尔值(Boolean) | true | 设置为 false 时,您为 GitLab Webservice 禁用 TLS。这主要适用于无法在 Ingress 级别使用 TLS 终止的情况,例如在 Ingress Controller 之前有 TLS 终止代理时。 |
| ingress.tls.secretName | 字符串(String) | (空) | 包含极狐GitLab URL 有效证书和密钥的 Kubernetes TLS Secret 的名称。未设置时,使用 global.ingress.tls.secretName 值。 |
| ingress.tls.smardcardSecretName | 字符串(String) | (空) | 如果启用,包含极狐GitLab 智能卡 URL 有效证书和密钥的 Kubernetes TLS Secret 的名称。未设置时,使用 global.ingress.tls.secretName 值。 |
| ingress.tls.useGeoClass | 布尔值(Boolean) | false | 使用 Geo Ingress 类(global.geo.ingressClass)覆盖 IngressClass。主要 Geo 站点必需。 |
annotations
annotations 用于在 Webservice Ingress 上设置注解。
serviceUpstream
这通过告诉 NGINX 直接联系 Service 本身作为上游,有助于更均匀地平衡 Webservice Pod 的流量。更多信息,请参阅 NGINX 文档。
要覆盖此设置,请设置:
yamlgitlab: webservice: ingress: serviceUpstream: "false"
proxyBodySize
proxyBodySize 用于设置 NGINX 代理的最大请求体大小。这通常 需要允许比默认值更大的 Docker 镜像。 它等同于 Linux 软件包安装 中的 nginx['client_max_body_size'] 配置。 作为替代方案, 您也可以使用以下两个参数之一来设置请求体大小:
- gitlab.webservice.ingress.annotations."nginx\.ingress\.kubernetes\.io/proxy-body-size"
- global.ingress.annotations."nginx\.ingress\.kubernetes\.io/proxy-body-size"
额外 Ingress
可以通过设置 extraIngress.enabled=true 来部署额外的 Ingress。该 Ingress 命名为默认 Ingress 并带有 -extra 后缀,并支持与默认 Ingress 相同的设置。
Gateway API
如果 GitLab Chart 配置为 通过 Gateway API 暴露,则每个 部署都将作为规则添加到 webservice Chart 的 HTTPRoute 中。
您可以通过将部署的 .rules=[] 设置为空来禁用给定部署在 HTTPRoute 中的规则。
yaml1webservice: 2 deployments: 3 default: 4 gatewayRoute: 5 rules: 6 - matches: 7 - path: 8 type: PathPrefix 9 value: / 10 timeouts: 11 request: "20s" 12 backendRequest: "20s" 13 filters: 14 - type: RequestHeaderModifier 15 requestHeaderModifier: 16 remove: 17 - X-Forwarded-Host 18 api: 19 gatewayRoute: 20 rules: 21 - matches: 22 - path: 23 type: PathPrefix 24 value: /api 25 internal-api: 26 gatewayRoute: 27 rules: []
每条规则支持 matches、timeouts 和 filters。Filters 接受一个 Gateway API HTTPRouteFilter 对象列表。
Gateway 与 Workhorse 之间的 TLS
当 Workhorse TLS 启用时,您可以为每个 部署配置一个 BackendTLSPolicy,以便 Gateway 验证到每个 Workhorse 后端的 TLS 连接。设置 workhorse.tls.enabled: true 并在部署级别提供 CA Secret:
yaml1global: 2 workhorse: 3 tls: 4 enabled: true 5gitlab: 6 webservice: 7 workhorse: 8 tls: 9 enabled: true 10 caSecretName: workhorse-tls-ca 11 deployments: 12 api: 13 workhorse: 14 tls: 15 enabled: true 16 caSecretName: workhorse-api-tls-ca
验证主机名默认为服务 DNS 名称(<service-name>.<namespace>.svc,或当设置 global.clusterDomain 时的完全限定名称)。 使用 backendTLSPolicy.hostname 覆盖它:
yamlgitlab: webservice: backendTLSPolicy: hostname: workhorse.example.internal
验证 caCertificateRefs 默认为 kind: Secret 的对象。Secret 和 ConfigMap 均受支持。 使用 backendTLSPolicy.kind 覆盖它:
yamlgitlab: webservice: backendTLSPolicy: kind: ConfigMap
有关完整详细信息,请参阅 Gateway API 文档。
自定义 ClientTrafficPolicy
当使用 Envoy Gateway 时,Chart 会为 main(gitlab-web)、geo(gitlab-web-geo)和 smartcard(gitlab-smartcard-web) 监听器渲染作用域限定的 ClientTrafficPolicies。这些策略优先于 Webservice 监听器的网关范围 gatewayApiResources.envoy.clientTrafficPolicySpec。
要为监听器自定义策略,请在 clientTrafficPolicy.<variant>.spec 下设置其规范:
yaml1gitlab: 2 webservice: 3 clientTrafficPolicy: 4 main: 5 spec: 6 path: 7 escapedSlashesAction: KeepUnchanged 8 enableProxyProtocol: true
当您省略 spec.targetRefs 时,Chart 会注入匹配的 Gateway 监听器,因此您只需 设置要更改的字段。这恢复了为 Webservice 监听器配置 ClientTrafficPolicy 行为的能力。更多信息,请参阅 议题 6571。
Envoy Gateway 的 HTTP/2 流控窗口默认值为:
- 流为 64 KiB。
- 连接为 1 MiB。
单个 HTTP/2 流受 initialStreamWindowSize / RTT 限制, 因此 64 KiB 的默认值在约 200 毫秒往返时间内将单个流限制为大约 300 KiB/s。
这些默认值尤其影响极狐GitLab Geo,其中辅助 站点通过高延迟站点间链路将 git 请求作为单个 HTTP/2 请求代理到主站点。
因此,main 和 geo 策略提高了这些默认值:
- http2.initialStreamWindowSize: 8Mi
- http2.initialConnectionWindowSize: 16Mi
您可以按上述方式为每个监听器覆盖这些值。在 spec 中覆盖一个键 会保留其他默认值,因为 Helm 会合并映射。
更多信息,请参阅 议题 6582。
Gateway 超时
当使用 Envoy Gateway 时,Chart 会渲染一个 BackendTrafficPolicy ,目标是 Webservice HTTPRoute,并具有以下默认超时:
| 超时 | Envoy Gateway 字段 | 默认值 |
|---|---|---|
| 上游连接建立 | spec.timeout.tcp.connectTimeout | 300s |
| 流不活动 | spec.timeout.http.streamIdleTimeout | 3600s |
| 绝对请求截止时间 | gatewayRoute.rules[].timeouts | 0s (禁用) |
streamIdleTimeout 是一个不活动超时:只要数据在任一方向流动,它就会重置,因此长时间运行的下载、上传和 WebSocket 连接在流量流动时不会中断,只有真正空闲的流 才会被回收。绝对 HTTPRoute 超时默认保持禁用(0s),因为绝对截止时间会终止合法的长时间运行的传输,无论其活动状态如何。
如果您要从 NGINX Ingress 迁移,请参阅 这些设置如何映射到 NGINX Ingress 超时选项。
要更改默认值,请在 backendTrafficPolicy.spec 下整体覆盖规范。例如,要使用更严格的值:
yaml1gitlab: 2 webservice: 3 backendTrafficPolicy: 4 spec: 5 timeout: 6 tcp: 7 connectTimeout: 15s 8 http: 9 streamIdleTimeout: 600s
当您省略 spec.targetRefs 时,Chart 会注入 Webservice HTTPRoute。设置 backendTrafficPolicy.spec: null 以跳过渲染策略。
避免完全禁用不活动超时。有限超时是针对慢速客户端(Slowloris 式)攻击的纵深防御层。客户端 连接行为还可以通过 ClientTrafficPolicy 进一步加强:例如, spec.timeout.http.requestReceivedTimeout 限制客户端传递完整请求所需的时间,而 spec.connection 配置连接限制。 Chart 对这些不设置默认值,因为它们可能会中断合法的 慢速上传。如果您的部署在 Gateway 前面没有边缘代理或 WAF,请考虑使用它们。
Gateway 不强制执行请求体大小限制:Envoy 流式传输请求 体没有大小上限,大小限制由极狐GitLab 本身强制执行 (例如,max_attachment_size、LFS 和产物限制)。
资源
内存请求/限制
每个 Pod 生成的工作进程数等于 workerProcesses,每个工作进程都使用 一些基线内存。我们建议:
- 每个工作进程至少 1.25GB(requests.memory)
- 每个工作进程最多 1.5GB,外加主进程 1GB(limits.memory)
请注意,所需资源取决于用户生成的工作负载,并可能根据极狐GitLab 应用中的更改或升级而在未来发生变化。
默认值:
yaml1workerProcesses: 2 2resources: 3 requests: 4 memory: 2.5G # = 2 * 1.25G 5# limits: 6# memory: 4G # = (2 * 1.5G) + 950M
配置 4 个工作进程时:
yaml1workerProcesses: 4 2resources: 3 requests: 4 memory: 5G # = 4 * 1.25G 5# limits: 6# memory: 7G # = (4 * 1.5G) + 950M
紧密打包或整合环境
在使用激进装箱或节点整合的 Kubernetes 环境中 (例如,由启用了整合功能的 Karpenter 管理的 EKS 集群),节点 根据 Pod 请求(而非限制)进行配置和整合。当 limits.memory 高于 requests.memory 时,紧密打包的节点可能会耗尽内存,因为 Webservice Pod 使用的内存超出了其请求量,导致内存不足(OOM) 终止。这些 OOM 终止表现为间歇性 502 错误。
因此,AWS Karpenter 最佳实践建议 在使用整合功能时,将所有非 CPU 资源的请求设置为等于限制。
在这些环境中,对于四个工作进程:
- 将 requests.memory 设置为等于 limits.memory,并留出额外空间: 9GB 而不是标准的 7GB。
- 启用 Puma Worker Killer 以便在 Pod 达到其内存限制之前优雅地重启过大的工作进程。这可以防止导致 502 错误的 OOM 终止。
yaml1workerProcesses: 4 2resources: 3 requests: 4 memory: 9G # equal to limits, per Karpenter consolidation best practice 5 limits: 6 memory: 9G 7puma: 8 disableWorkerKiller: false 9 workerMaxMemory: 1500 # MB per worker (~6GB total for 4 workers), matches the current default
默认的 workerMaxMemory 由 DEFAULT_PUMA_WORKER_RSS_LIMIT_MB 定义。 工作进程杀手不会立即生效:内存看门狗会按间隔(默认 60 秒)检查工作进程内存使用情况,并且工作进程必须连续多次(默认五次)超过 workerMaxMemory,这些也都在该文件中定义。因此,工作进程可能会在几分钟内超过 workerMaxMemory,因此请将 limits.memory 保持在所有工作进程的 workerMaxMemory 总和之上。
Redis
Redis 文档已整合到 globals 页面中。请查阅该页面以获取最新的 Redis 配置选项。
PostgreSQL
PostgreSQL 文档已整合到 globals 页面中。请查阅该页面以获取最新的 PostgreSQL 配置选项。
Webservice 部署中的 dependencies initContainer 会运行脚本来检查:
- 极狐GitLab 的依赖项是否可用。
- PostgreSQL 的数据库迁移是否已执行。
您可以使用 Webservice chart 的 extraEnv 配置键来控制这些脚本的行为。支持两个环境变量:
- BYPASS_POST_DEPLOYMENT=true:如果所有常规迁移都已执行,且仅有部署后迁移待处理,则依赖项检查通过。
- BYPASS_SCHEMA_VERSION=true(不推荐):即使常规迁移尚未执行,依赖项检查也会通过。使用此环境变量可能导致 Rails 部署在启动后出错,因为数据库模式与应用程序代码的预期不匹配。
Gitaly
yaml1global: 2 gitaly: 3 ## These settings are used by Gitaly clients: GitLab Rails, GitLab Shell, Workhorse. 4 client: 5 maxAttempts: 4 6 maxBackoff: '1.4s'
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| maxAttempts | 整数(Integer) | 4 | Gitaly 客户端在向客户端返回错误之前,失败时尝试重新发送请求的最大次数。 |
| maxBackoff | 字符串(String) | '1.4s' | Gitaly 客户端在向客户端返回错误之前重试请求的最长时间(以秒为单位)。 |
其他 Gitaly 设置由 全局设置 配置。请参阅 Gitaly 配置文档。
Registry
yaml1registry: 2 host: registry.example.com 3 port: 443 4 api: 5 protocol: http 6 host: registry.example.com 7 serviceName: registry 8 port: 5000 9 tokenIssuer: gitlab-issuer 10 certificate: 11 secret: gitlab-registry 12 key: registry-auth.key
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| api.host | 字符串(String) | 要使用的 Registry 服务器的主机名。如果使用了 api.serviceName,则可以省略此项。 | |
| api.port | 整数(Integer) | 5000 | 连接 Registry API 的端口。 |
| api.protocol | 字符串(String) | Webservice 用于访问 Registry API 的协议。 | |
| api.serviceName | 字符串(String) | registry | 运行 Registry 服务器的 service 的名称。如果此项存在且未设置 api.host,chart 将使用服务的主机名(以及当前的 .Release.Name)来替代 api.host 的值。当 Registry 作为整个 GitLab chart 的一部分使用时,这很方便。 |
| certificate.key | 字符串(String) | Secret 中 key 的名称,该 Secret 存放将作为 auth.token.rootcertbundle 提供给 registry 容器的证书包。 | |
| certificate.secret | 字符串(String) | Kubernetes Secret 的名称,该 Secret 存放用于验证极狐GitLab 实例创建的令牌的证书包。 | |
| host | 字符串(String) | 用于在极狐GitLab UI 中向用户提供 Docker 命令的外部主机名。如果未设置,则回退到 registry.hostname 模板中设置的值。该模板根据 global.hosts 中设置的值确定 registry 主机名。有关更多信息,请参阅 Globals 文档。 | |
| port | 整数(Integer) | 主机名中使用的外部端口。使用端口 80 或 443 将导致 URL 使用 http/https 格式。其他端口将全部使用 http,并将端口附加到主机名末尾,例如 http://registry.example.com:8443。 | |
| tokenIssuer | 字符串(String) | gitlab-issuer | 认证令牌签发者的名称。此名称必须与 Registry 配置中使用的名称匹配,因为它会在发送时合并到令牌中。默认值 gitlab-issuer 与我们在 Registry chart 中使用的默认值相同。 |
Chart 设置
以下值用于配置 Webservice Pod。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| workerProcesses | 整数(Integer) | 2 | 每个 Pod 运行的 Webservice worker 数量。您的集群中必须至少有 2 个 worker,极狐GitLab 才能正常运行。请注意,增加 workerProcesses 将使每个 worker 所需的内存增加约 400MB,因此您应相应更新 Pod 的 resources。 |
| minReplicas | 整数(Integer) | 2 | 最小副本数 |
| maxReplicas | 整数(Integer) | 10 | 最大副本数 |
| maxUnavailable | 整数(Integer) | 1 | 最大不可用 Pod 数量限制 |
指标
可以使用 metrics.enabled 值启用指标,并使用极狐GitLab 监控导出器来暴露指标端口。Pod 会被赋予 Prometheus 注解,或者如果 metrics.serviceMonitor.enabled 为 true,则会创建 Prometheus Operator ServiceMonitor。也可以从 /-/metrics 端点抓取指标,但这需要在管理区域启用 极狐GitLab Prometheus 指标。GitLab Workhorse 指标也可以通过 workhorse.metrics.enabled 暴露,但这些指标无法使用 Prometheus 注解收集,因此需要将 workhorse.metrics.serviceMonitor.enabled 设置为 true,或使用外部 Prometheus 配置。
GitLab Shell
GitLab Shell 在与 Webservice 通信时使用认证令牌。请使用共享的 Secret 与 GitLab Shell 和 Webservice 共享该令牌。
yamlshell: authToken: secret: gitlab-shell-secret key: secret port:
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| authToken.key | 字符串(String) | 定义包含 authToken 的密钥(见下文)中键的名称。 | |
| authToken.secret | 字符串(String) | 定义要从中拉取的 Kubernetes Secret 的名称。 | |
| port | 整数(Integer) | 22 | 在极狐GitLab UI 中生成 SSH URL 时使用的端口号。由 global.shell.port 控制。 |
WebServer 选项
当前版本的 chart 支持 Puma Web 服务器。
Puma 特有选项:
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| puma.workerMaxMemory | 整数(Integer) | Puma worker killer 的最大内存(以兆字节为单位) | |
| puma.threads.min | 整数(Integer) | 4 | Puma 线程的最小数量 |
| puma.threads.max | 整数(Integer) | 4 | Puma 线程的最大数量 |
Workhorse 负载削减
负载削减通过返回配置的 HTTP 状态码来保护 Puma 免受过载影响,当请求积压超过配置的阈值时,允许反向代理将请求重试到其他实例。
要启用负载削减,请配置 loadShedding 参数:
yaml1gitlab: 2 webservice: 3 workhorse: 4 loadShedding: 5 enabled: true 6 backlogThreshold: 50 7 retryAfterSeconds: 0 8 statusCode: 503 9 strategy: max
- backlogThreshold 指定触发负载削减的积压请求数。
- retryAfterSeconds 设置响应中 Retry-After 头的值。
- statusCode 设置在削减负载时返回的 HTTP 状态码(默认值:503)。使用自定义代码(如 529)可以将负载削减响应与由数据库超时或 Gitaly 问题引起的其他 503 错误区分开来。
- strategy 决定有效积压的计算方式:
- max:使用所有 Puma worker 中的最大积压(默认)。
- sum:使用所有 Puma worker 的积压总和。
代理配置
为使负载削减有效工作,您的反向代理必须配置为在收到 503 响应时重试请求。这可以确保请求被分发到健康的实例。
有关 NGINX 示例,请在 Ingress 上配置以下注解:
yamlingress: annotations: nginx.ingress.kubernetes.io/proxy-next-upstream: "http_503" nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "3" nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "10s"
这些设置告诉 NGINX:
- 在 503 响应时重试(负载削减会生成此响应)。
- 在放弃前最多尝试 3 次。
- 重试最多等待 10 秒。
您只应在 503 响应时重试,这是负载削减生成的特定信号。 避免在其他状态码(如 504(网关超时))或错误条件下重试,因为这会通过在中断期间重试可能在后端全部失败的请求来放大负载。
对于其他反向代理,请查阅其文档以了解等效的重试配置。关键是确保 503 响应会触发对其他后端实例的重试。
配置 networkpolicy
本节控制 NetworkPolicy。 此配置是可选的,用于将 Pod 的 Egress 和 Ingress 限制到特定端点。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| enabled | 布尔值(Boolean) | false | 此设置启用 NetworkPolicy |
| ingress.enabled | 布尔值(Boolean) | false | 当设置为 true 时,Ingress 网络策略将被激活。除非指定规则,否则这将阻止所有 Ingress 连接。 |
| ingress.rules | 数组(Array) | [] | Ingress 策略的规则,详情请参阅 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource 和下面的示例 |
| egress.enabled | 布尔值(Boolean) | false | 当设置为 true 时,Egress 网络策略将被激活。除非指定规则,否则这将阻止所有 egress 连接。 |
| egress.rules | 数组(Array) | [] | egress 策略的规则,详情请参阅 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource 和下面的示例 |
网络策略示例
如果启用了 Prometheus 导出器,webservice 服务需要来自 NGINX Ingress 和多个极狐GitLab Pod 的 Ingress 连接。通常它需要到多个位置的 Egress 连接。 此示例添加了以下网络策略:
- 允许 Ingress 请求:
- 从 gitaly、gitlab-pages、gitlab-shell、kas、mailroom 和 nginx-ingress Pod 到端口 8181
- 从 Prometheus Pod 到端口 8080、8083 和 9229
- 允许 Egress 请求:
- 到 gitaly Pod 的端口 8075
- 到 kas Pod 的端口 8153
- 到 kube-dns 的端口 53
- 到 registry Pod 的端口 5000
- 到外部数据库 172.16.0.10/32 的端口 5432
- 到外部 Redis 172.16.0.11/32 的端口 6379
- 到互联网 0.0.0.0/0 的端口 443
- 到 AWS VPC 端点(如 S3 或 STS)172.16.1.0/24 的端口 443
提供的示例仅供参考,可能不完整。Webservice 需要出站连接到公共互联网,以访问 外部对象存储 上的镜像。该示例基于以下假设:kube-dns 部署在 kube-system 命名空间中,prometheus 部署在 monitoring 命名空间中,nginx-ingress 部署在 nginx-ingress 命名空间中。
yaml1networkpolicy: 2 enabled: true 3 ingress: 4 enabled: true 5 rules: 6 - from: 7 - podSelector: 8 matchLabels: 9 app: gitaly 10 ports: 11 - port: 8181 12 - from: 13 - podSelector: 14 matchLabels: 15 app: gitlab-pages 16 ports: 17 - port: 8181 18 - from: 19 - podSelector: 20 matchLabels: 21 app: gitlab-shell 22 ports: 23 - port: 8181 24 - from: 25 - podSelector: 26 matchLabels: 27 app: kas 28 ports: 29 - port: 8181 30 - from: 31 - podSelector: 32 matchLabels: 33 app: mailroom 34 ports: 35 - port: 8181 36 - from: 37 - namespaceSelector: 38 matchLabels: 39 kubernetes.io/metadata.name: nginx-ingress 40 podSelector: 41 matchLabels: 42 app: nginx-ingress 43 component: controller 44 ports: 45 - port: 8181 46 - from: 47 - namespaceSelector: 48 matchLabels: 49 kubernetes.io/metadata.name: monitoring 50 podSelector: 51 matchLabels: 52 app: prometheus 53 component: server 54 release: gitlab 55 ports: 56 - port: 9229 57 - port: 8080 58 - port: 8083 59 egress: 60 enabled: true 61 rules: 62 - to: 63 - podSelector: 64 matchLabels: 65 app: gitaly 66 ports: 67 - port: 8075 68 - to: 69 - podSelector: 70 matchLabels: 71 app: kas 72 ports: 73 - port: 8153 74 - to: 75 - ipBlock: 76 cidr: 0.0.0.0/0 77 except: 78 - 10.0.0.0/8 79 ports: 80 - port: 443 81 - to: 82 - ipBlock: 83 cidr: 172.16.0.10/32 84 ports: 85 - port: 5432 86 - to: 87 - ipBlock: 88 cidr: 172.16.0.11/32 89 ports: 90 - port: 6379 91 - to: 92 - namespaceSelector: 93 matchLabels: 94 kubernetes.io/metadata.name: kube-system 95 podSelector: 96 matchLabels: 97 k8s-app: kube-dns 98 ports: 99 - port: 53 100 protocol: UDP
LoadBalancer 服务
如果 service.type 设置为 LoadBalancer,您可以选择指定 service.loadBalancerIP,以使用用户指定的 IP 创建 LoadBalancer(如果您的云提供商支持)。
当 service.type 设置为 LoadBalancer 时,您还必须设置 service.loadBalancerSourceRanges,以限制可以访问 LoadBalancer 的 CIDR 范围(如果您的云提供商支持)。 目前这是必需的,因为存在一个指标端口被暴露的问题。
有关 LoadBalancer 服务类型的更多信息,请参阅 Kubernetes 文档
yamlservice: type: LoadBalancer loadBalancerIP: 1.2.3.4 loadBalancerSourceRanges: - 10.0.0.0/8
配置 KEDA
此 keda 部分允许安装 KEDA ScaledObjects 而不是常规的 HorizontalPodAutoscalers。 此配置是可选的,当需要基于自定义或外部指标进行自动扩缩时可以使用。
大多数设置默认使用 hpa 部分中设置的值(如适用)。
如果满足以下条件,将根据 hpa 部分中设置的 CPU 和内存阈值自动添加 CPU 和内存触发器:
- 未设置 triggers。
- 相应的 request.cpu.request 或 request.memory.request 设置也设置为非零值。
如果未设置任何触发器,则不会创建 ScaledObject。
有关这些设置的更多详细信息,请参阅 KEDA 文档。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| enabled | 布尔值(Boolean) | false | 使用 KEDA ScaledObjects 而不是 HorizontalPodAutoscalers |
| pollingInterval | 整数(Integer) | 30 | 检查每个触发器的间隔 |
| cooldownPeriod | 整数(Integer) | 300 | 在最后一个触发器报告活动后,将资源缩回 0 之前等待的时间 |
| minReplicaCount | 整数(Integer) | minReplicas | KEDA 将资源缩容到的最小副本数。 |
| maxReplicaCount | 整数(Integer) | maxReplicas | KEDA 将资源扩容到的最大副本数。 |
| fallback | 映射(Map) | KEDA 回退配置,请参阅 文档 | |
| hpaName | 字符串(String) | keda-hpa-{scaled-object-name} | KEDA 将创建的 HPA 资源的名称。 |
| restoreToOriginalReplicaCount | 布尔值(Boolean) | 指定在删除 ScaledObject 后,是否应将目标资源缩放回原始副本数 | |
| behavior | 映射(Map) | hpa.behavior | 扩容和缩容行为的规范。 |
| triggers | 数组(Array) | 激活目标资源扩缩的触发器列表,默认为根据 hpa.cpu 和 hpa.memory 计算的触发器 |