使用 GitLab-Sidekiq chart

sidekiq 子 chart 提供了 Sidekiq workers 的可配置部署,明确设计用于跨多个具有单独可扩展性和配置的 Deployment 提供队列分离。

尽管这个 chart 提供了一个默认的 pods: 声明,如果你提供一个空的定义,将没有 workers。

要求

此 chart 取决于对 Redis、PostgreSQL 和 Gitaly 服务的访问,要么作为完整 GitLab chart 的一部分,要么作为可从该 chart 部署到的 Kubernetes 集群访问的外部服务提供。

设计选择

此 chart 创建了多个 Deployment 和关联的 ConfigMap。决定使用 ConfigMap 行为而不是使用 environment 属性或容器的 command 的附加参数会更清晰,以避免对命令长度的任何担忧。这种选择导致产生大量的 ConfigMap,但提供了每个 pod 应该做什么的非常清晰的定义。

配置

sidekiq chart 配置为三部分:chart 范围的外部服务chart 范围的默认值每个 Pod 的定义

安装命令行选项

下表包含可以使用 --set 标志提供给 helm install 命令的所有可能的 chart 配置:

参数 默认值 说明
annotations   Pod annotations
podLabels   补充 Pod 标签。 不会用于选择器。
common.labels   应用于此 chart 创建的所有对象的补充标签。
concurrency 20 Sidekiq default concurrency
deployment.strategy {} 允许配置 deployment 使用的更新策略。
deployment.terminationGracePeriodSeconds 30 Kubernetes 等待 pod 退出的秒数
enabled true Sidekiq 启用标记
extraContainers   包含的额外容器列表
extraInitContainers   包含的额外 init 容器列表
extraVolumeMounts   要添加的附加挂载卷列表
extraVolumes   要创建的附加卷列表
extraEnv   要暴露的附加环境变量列表
extraEnvFrom   要暴露的其它数据源的额外环境变量列表
gitaly.serviceName gitaly Gitaly service 名称
health_checks.port 3808 健康检查服务器端口
hpa.behavior {scaleDown: {stabilizationWindowSeconds: 300 }} 包含放大和缩小行为的规范(需要 autoscaling/v2beta2 或更高版本)
hpa.customMetrics [] 自定义指标包含用于计算所需副本数的规范(覆盖在 targetAverageUtilization 中配置的平均 CPU 利用率的默认使用值)
hpa.cpu.targetType AverageValue 设置自动缩放 CPU 目标类型,必须是 UtilizationAverageValue
hpa.targetAverageValue 350m 设置自动扩缩容目标值
hpa.cpu.targetAverageUtilization   设置自动缩放 CPU 目标利用率
hpa.memory.targetType   设置自动缩放内存目标类型,必须是 UtilizationAverageValue
hpa.memory.targetAverageValue   设置自动缩放内存目标值
hpa.memory.targetAverageUtilization   设置自动缩放内存目标利用率
hpa.minReplicas   最小副本数
hpa.maxReplicas   最大副本数
hpa.targetAverageValue   已弃用 设置自动缩放 CPU 目标值
minReplicas 2 最小副本数
maxReplicas 10 最大副本数
maxUnavailable 1 不可用 Pod 的最大数量限制
image.pullPolicy Always Sidekiq 镜像拉取策略
image.pullSecrets   镜像仓库的 Secrets
image.repository registry.jihulab.com/gitlab-cn/build/cng-images/gitlab-sidekiq Sidekiq 镜像仓库
image.tag   Sidekiq 镜像标签
init.image.repository   initContainer 镜像
init.image.tag   initContainer 镜像标签
logging.format default 对于 JSON 结构的日志,设置为 json
metrics.enabled true 指标端点是否可用于抓取
metrics.port 3807 指标端点端口
metrics.path /metrics 指标端点路径
metrics.log_enabled false 启用或禁用写入 sidekiq_exporter.log 的指标服务器日志
metrics.serviceMonitor.enabled false 是否创建 ServiceMonitor 使 Prometheus Operator 能够管理指标抓取,请注意启用此功能会删除 prometheus.io 抓取注释
metrics.serviceMonitor.additionalLabels {} 要添加到 ServiceMonitor 的其它标签
metrics.serviceMonitor.endpointConfig {} ServiceMonitor 的附加端点配置
metrics.annotations   已废弃 设置明确的指标注释。替换为模板内容。
psql.password.key psql-password psql secret 中保存 psql 密码的 key
psql.password.secret gitlab-postgres psql secret 名称
psql.port   设置 PostgreSQL 服务器端口。优先于 global.psql.port
redis.serviceName redis Redis service 名称
resources.requests.cpu 900m Sidekiq 最小所需的 CPU
resources.requests.memory 2G Sidekiq 最小所需的内存
resources.limits.memory   Sidekiq 最大所需的内存
timeout 25 Sidekiq job 超时时长
tolerations [] 分配给 Pod 的容忍标签
memoryKiller.daemonMode true 如果为 false,使用 legacy memory killer 模式
memoryKiller.maxRss 2000000 触发延迟关闭前的最大 RSS,以 KB 表示
memoryKiller.graceTime 900 触发关闭之前等待的时间,以秒表示
memoryKiller.shutdownWait 30 触发关闭后现有 job 完成的时间量,以秒表示
memoryKiller.hardLimitRss   在守护进程模式下以 KB 表示的立即关闭触发前的最大 RSS
memoryKiller.checkInterval 3 内存检查之间的时间量
livenessProbe.initialDelaySeconds 20 启动 liveness 探测前的延迟
livenessProbe.periodSeconds 60 多久执行一次 liveness 探测
livenessProbe.timeoutSeconds 30 liveness 探测超时时长
livenessProbe.successThreshold 1 liveness 探测失败后被视为成功的最小连续成功次数
livenessProbe.failureThreshold 3 探测成功后被视为失败的 liveness 探测的最小连续失败次数
readinessProbe.initialDelaySeconds 0 启动 readiness 探测前的延迟
readinessProbe.periodSeconds 10 多久执行一次 readiness 探测
readinessProbe.timeoutSeconds 2 readiness 探测超时时长
readinessProbe.successThreshold 1 readiness 探测失败后被视为成功的最小连续成功次数
readinessProbe.failureThreshold 3 探测成功后被视为失败的 readiness 探测的最小连续失败次数
securityContext.fsGroup 1000 在其下启动 Pod 的 Group ID
securityContext.runAsUser 1000 在其下启动 Pod 的 User ID
priorityClassName "" 允许配置podspriorityClassName,这用于在驱逐的情况下控制pod优先级

Chart 配置示例

resources

resources 允许您配置 Sidekiq pod 可以消耗的最小和最大资源量(内存和 CPU)。

Sidekiq pod 工作负载在不同部署之间差异很大。一般来说,据了解,每个 Sidekiq 进程大约消耗 1 vCPU 和 2 GB 内存。 垂直伸缩通常应与 vCPU:Memory1:2 比率保持一致。

以下是resources的使用示例:

resources:
  limits:
    memory: 5G
  requests:
    memory: 2G
    cpu: 900m

extraEnv

extraEnv 允许您在 Pod 的所有容器中暴露额外的环境变量。

extraEnv 示例如下:

extraEnv:
  SOME_KEY: some_value
  SOME_OTHER_KEY: some_other_value

当容器启动时,您可以确认环境变量是否暴露:

env | grep SOME
SOME_KEY=some_value
SOME_OTHER_KEY=some_other_value

您还可以为特定的 pod 设置 extraEnv

extraEnv:
  SOME_KEY: some_value
  SOME_OTHER_KEY: some_other_value
pods:
  - name: mailers
    queues: mailers
    extraEnv:
      SOME_POD_KEY: some_pod_value
  - name: catchall
    negateQueues: mailers

这将仅为 mailers pod 中的应用程序容器设置 SOME_POD_KEY。 Pod 级别的 extraEnv 设置不会添加到 init 容器

extraEnvFrom

extraEnvFrom 允许您从 pod 中的所有容器中的其它数据源,暴露其它环境变量。

下面是一个使用 extraEnvFrom 的示例:

extraEnvFrom:
  MY_NODE_NAME:
    fieldRef:
      fieldPath: spec.nodeName
  MY_CPU_REQUEST:
    resourceFieldRef:
      containerName: test-container
      resource: requests.cpu
  SECRET_THING:
    secretKeyRef:
      name: special-secret
      key: special_token
      # optional: boolean
  CONFIG_STRING:
    configMapKeyRef:
      name: useful-config
      key: some-string
      # optional: boolean

extraVolumes

extraVolumes 允许您在 chart 范围内配置 extra volumes。

extraVolumes 配置示例如下:

extraVolumes: |
  - name: example-volume
    persistentVolumeClaim:
      claimName: example-pvc

extraVolumeMounts

extraVolumeMounts 允许您在 chart 范围内配置所有容器上的 extra volumeMounts。

extraVolumeMounts 配置示例如下:

extraVolumeMounts: |
  - name: example-volume-mount
    mountPath: /etc/example

image.pullSecrets

pullSecrets 允许您对私有仓库进行身份验证,以拉取 pod 的镜像。

有关私有仓库及其身份验证方法的其它详细信息,请参见 Kubernetes 文档

下面是一个使用 pullSecrets 的例子:

image:
  repository: my.sidekiq.repository
  pullPolicy: Always
  pullSecrets:
  - name: my-secret-name
  - name: my-secondary-secret-name

tolerations

tolerations 允许您调度 Pod 到受污染的工作节点上。

下面是一个使用 tolerations 的例子:

tolerations:
- key: "node_label"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"
- key: "node_label"
  operator: "Equal"
  value: "true"
  effect: "NoExecute"

annotations

annotations 允许您向 registry pod 添加 annotation。

下面是 annotations 的一个使用示例:

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

外部服务

此 chart 应附加到与 Webservice chart 相同的 Redis、PostgreSQL 和 Gitaly 实例。外部服务的值将填入到所有 Sidekiq pod 共享的 ConfigMap 中。

Redis

redis:
  host: rank-racoon-redis
  port: 6379
  sentinels:
    - host: sentinel1.example.com
      port: 26379
  password:
    secret: gitlab-redis
    key: redis-password
名称 类型 默认值 说明
host String   要使用的数据库的 Redis 服务器的主机名。可以省略并使用 serviceName 代替。 如果使用 Redis Sentinels,则需要将 host 属性设置为 sentinel.conf 中指定的集群名称。
password.key String   定义 Secret(下方)中包含密码的 key 的名称。
password.secret String   定义要拉取的 Kubernetes Secret 的名称。
port Integer 6379 连接 Redis 服务器的端口
serviceName String redis 运行 Redis 数据库的 service 的名称。如果该配置存在,且 host 的值不存在 , 则 chart 将服务的主机名替换 host 的值。
sentinels.[].host String   用于 Redis HA 设置的 Redis Sentinel 服务器的主机名。
sentinels.[].port Integer 26379 连接 Redis Sentinel 服务器的端口。
note当前的 Redis Sentinel 仅支持与 GitLab chart 分开部署的 Sentinel。因此,应使用 redis.install=false 禁用通过 GitLab chart 的 Redis 部署。 在部署 GitLab chart 之前,需要手动创建包含 Redis 密码的 Secret。

PostgreSQL

psql:
  host: rank-racoon-psql
  serviceName: pgbouncer
  port: 5432
  database: gitlabhq_production
  username: gitlab
  preparedStatements: false
  password:
    secret: gitlab-postgres
    key: psql-password
名称 类型 默认值 说明
host String   要使用数据库所在的 PostgreSQL 服务器的主机名。如果使用本 chart 部署的 PostgreSQL,则可以省略此项。
serviceName String   运行 PostgreSQL 数据库的 service 的名称。如果该配置存在,且 host 的值不存在 , 则 chart 将服务的主机名替换 host 的值。
database String gitlabhq_production 要在 PostgreSQL 服务器上使用的数据库的名称。
password.useSecret Boolean true 控制从 Secret 还是从文件中读取密码。
password.file String   定义包含 PostgreSQL 密码的文件路径。如果 password.useSecret 设置为 true,则忽略该配置。
password.key String   定义 Secret 中包含密码的 key 的名称。如果 password.useSecret 设置为 false,则忽略该配置。
password.secret String   定义要拉取的 Kubernetes Secret 的名称,如果 password.useSecret 设置为 false,则忽略该配置。
port Integer 5432 连接 PostgreSQL 服务器的端口。
username String gitlab 用于对数据库进行身份验证的用户名。
preparedStatements Boolean false 在与 PostgreSQL 服务器通信时,是否使用 prepared statements。

Gitaly

gitaly:
  internal:
    names:
      - default
      - default2
  external:
    - name: node1
      hostname: node1.example.com
      port: 8079
  authToken:
    secret: gitaly-secret
    key: token
名称 类型 默认值 说明
host String   要使用的 Gitaly 服务器的主机名,可以省略以 serviceName 代替。
serviceName String gitaly 运行 Gitaly 服务器的 service 名称。 果该配置存在,且 host 的值不存在 , 则 chart 将服务的主机名(当前为 .Release.Name)替换 host 的值。这样使用 Gitaly 作为整个 chart 一部分时很方便。
port Integer 8075 Gitaly 服务器连接的端口。
authToken.key String   secret 中 包含认证令牌的 key。
authToken.secret String   拉取的 Kubernetes Secret 的名称。

Metrics

默认情况下,每个 pod 都启用了 Prometheus metrics exporter。只有在管理中心启用 GitLab Prometheus 指标时,指标才可用。exporter 在端口 3807 上公开了一个 /metrics 端点。启用指标后,会添加 annottation 到每个 pod,允许 Prometheus 服务器发现和抓取公开的指标。

Chart 范围的默认值

如果值不是基于每个 pod 呈现的,则以下值将在 chart 范围内使用。

Name Type Default Description
concurrency Integer 25 要同时处理的进程数。
timeout Integer 4 Sidekiq 关闭超时。Sidekiq 收到 TERM 信号后,强制关闭其进程之前的秒数。
memoryKiller.checkInterval Integer 3 内存检查之间的时间量
memoryKiller.maxRss Integer 2000000 触发延迟关闭前的最大 RSS,单位为 KB
memoryKiller.graceTime Integer 900 给定 Pod 触发关闭之前等待的时间
memoryKiller.shutdownWait Integer 30 触发关闭后,现有 job 完成给定 Pod 的时间量
minReplicas Integer 2 最小副本数
maxReplicas Integer 10 最大副本数
maxUnavailable Integer 1 不可用 Pod 的最大数量限制

Per-pod 设置

pods 声明提供了 worker pod 的所有属性的声明。这些将被模板化为 Deployment,它们的 Sidekiq 实例具有单独的ConfigMap

note设置默认包括一个设置为监控所有队列的 pod。对 pods 部分进行更改将使用不同的 pod 配置覆盖默认 pod。 除了默认值外,它不会添加新的 pod。
名称 类型 默认值 说明
concurrency Integer   要同时处理的进程数。如果未提供,它将从 chart 范围的默认值中提取。
name String   用于命名此 pod 的 DeploymentConfigMap。 它应该保持简短,并且不应在任何两个条目之间重复。
queues String   查看下方文档
negateQueues String   已废弃查看下方文档
queueSelector Boolean false 已废弃,使用队列选择器。
timeout Integer   Sidekiq 关闭超时。 Sidekiq 收到 TERM 信号后,强制关闭其进程之前的秒数。 如果未提供,它将从 chart 范围的默认值中提取。这个值必须小于 terminationGracePeriodSeconds
resources     每个 pod 都可以提供自己的 resources 需求,这些需求将被添加到为其创建的 Deployment 中(如果存在),与 Kubernetes 文档相匹配。
nodeSelector     每个 pod 都可以配置一个 nodeSelector 属性,该属性将添加到为其创建的 Deployment 中(如果存在),与 Kubernetes 文档相匹配。
memoryKiller.checkInterval Integer 3 内存检查之间的时间量
memoryKiller.maxRss Integer 2000000 覆盖给定 pod 的最大 RSS。
memoryKiller.graceTime Integer 900 覆盖给定 Pod 触发关闭之前等待的时间
memoryKiller.shutdownWait Integer 30 覆盖触发关闭后,现有 job 完成给定 Pod 的时间量
minReplicas Integer 2 最小实例数
maxReplicas Integer 10 最大示例数
maxUnavailable Integer 1 不可用 Pod 的最大数量限制
podLabels {} {} 补充 Pod 标签。不会用于选择器。
strategy   {} 允许配置 deployment 使用的更新策略。
extraVolumes String   要创建的附加卷列表
extraVolumeMounts String   要添加的附加挂载卷列表
priorityClassName String "" 允许配置 pod priorityClassName,这用于在驱逐的情况下控制 pod 优先级
hpa.behavior {scaleDown: {stabilizationWindowSeconds: 300 }} 包含放大和缩小行为的规范(需要 autoscaling/v2beta2 或更高版本)  
hpa.customMetrics [] 自定义指标包含用于计算所需副本数的规范(覆盖在 targetAverageUtilization 中配置的平均 CPU 利用率的默认使用值)  
hpa.cpu.targetType AverageValue 设置自动缩放 CPU 目标类型,必须是 UtilizationAverageValue  
hpa.targetAverageValue 350m 设置自动扩缩容目标值  
hpa.cpu.targetAverageUtilization   设置自动缩放 CPU 目标利用率  
hpa.memory.targetType   设置自动缩放内存目标类型,必须是 UtilizationAverageValue  
hpa.memory.targetAverageValue   设置自动缩放内存目标值  
hpa.memory.targetAverageUtilization   设置自动缩放内存目标利用率  
hpa.minReplicas   最小副本数  
hpa.maxReplicas   最大副本数  
hpa.targetAverageValue   已弃用 设置自动缩放 CPU 目标值  
extraEnv Map   要暴露的附加环境变量列表。 chart 范围的值被合并到其中,来自 pod 的值优先
extraEnvFrom Map   要暴露的其它数据源的额外环境变量列表
terminationGracePeriodSeconds 30 Pod 需要优雅终止的可选持续时间(以秒为单位)。  

queues

queues 值是一个字符串,包含要处理的以逗号分隔的队列列表。 默认情况下未设置,这意味着将处理所有队列。

字符串不应包含空格:merge,post_receive,process_commit 有效,但merge, post_receive, process_commit 无效。

任何将 job 添加到其中但没有没有至少一个 pod 的一部分的队列将不会被处理

有关所有队列的完整列表,请参阅以下源文件:

  1. app/workers/all_queues.yml
  2. ee/app/workers/all_queues.yml

negateQueues

negateQueuesqueues 的格式相同,但它表示要忽略而不是处理的队列。

字符串不应包含空格:merge,post_receive,process_commit 有效,但merge, post_receive, process_commit 无效。

如果您有一个 pod 处理重要队列,而另一个 pod 处理其它队列,这将非常有用:它们可以使用相同的队列列表,一个在 queues 中,另一个在 negateQueues 中。

notenegateQueues _不应该_与 queues 一起提供,因为它没有任何效果。

pod 条目示例

pods:
  - name: immediate
    concurrency: 10
    minReplicas: 2  # defaults to inherited value
    maxReplicas: 10 # defaults to inherited value
    maxUnavailable: 5 # defaults to inherited value
    queues: merge,post_receive,process_commit
    extraVolumeMounts: |
      - name: example-volume-mount
        mountPath: /etc/example
    extraVolumes: |
      - name: example-volume
        persistentVolumeClaim:
          claimName: example-pvc
    resources:
      limits:
        cpu: 800m
        memory: 2Gi
    hpa:
      cpu:
        targetType: Value
        targetAverageValue: 350m

配置 networkpolicy

此部分控制 registry NetworkPolicy。 该设置可选,用于限制 registry 的 egress and Ingress 到特定端点。

名称 类型 默认值 说明
enabled Boolean false 此设置为 registry 启用 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.rules Array [] 出口策略规则,详细信息参见 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource 和下面的例子

Network Policy 示例

Sidekiq service 仅需要 Prometheus exporter的 Ingress 连接(如果启用),并且通常需要到各个地方的 Egress 连接。 此示例添加以下网络策略:

  • 所有来自 TCP 10.0.0.0/8 端口 3807 网络的 Ingress 请求都允许用于指标导出
  • DNS 允许在 UDP 10.0.0.0/8 端口 53 上对网络的所有 Egress 请求
  • PostgreSQL 允许在 TCP 10.0.0.0/8 端口 5432 上向网络发出的所有 Egress 请求
  • Redis 允许通过 TCP 10.0.0.0/8 端口 6379 向网络发出所有 Egress 请求
  • 其他对 10.0.0.0/8 本地网络的 Egress 请求受到限制
  • 允许在 10.0.0.0/8 之外的出口请求

请注意,提供的示例仅为示例,可能并不完整。

请注意,对于外部对象存储 上的镜像,Sidekiq 服务需要与公共 Internet 的出站连接

networkpolicy:
  enabled: true
  ingress:
    enabled: true
    rules:
      - from:
        - ipBlock:
            cidr: 10.0.0.0/8
        ports:
        - port: 3807
  egress:
    enabled: true
    rules:
      - to:
        - ipBlock:
            cidr: 10.0.0.0/8
        ports:
        - port: 53
          protocol: UDP
      - to:
        - ipBlock:
            cidr: 10.0.0.0/8
        ports:
        - port: 5432
          protocol: TCP
      - to:
        - ipBlock:
            cidr: 10.0.0.0/8
        ports:
        - port: 6379
          protocol: TCP
      - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except:
            - 10.0.0.0/8