使用 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
| 25
| Sidekiq default concurrency |
deployment.strategy
| {}
| 允许配置 deployment 使用的更新策略。 |
deployment.terminationGracePeriodSeconds
| 30
| Kubernetes 等待 pod 退出的秒数 |
enabled
| true
| Sidekiq 启用标记 |
extraContainers
| 包含的额外容器列表 | |
extraInitContainers
| 包含的额外 init 容器列表 | |
extraVolumeMounts
| 要添加的附加挂载卷列表 | |
extraVolumes
| 要创建的附加卷列表 | |
extraEnv
| 要暴露的附加环境变量列表 | |
gitaly.serviceName
| gitaly
| Gitaly service 名称 |
hpa.targetAverageValue
| 350m
| 设置自动扩缩容目标值 |
minReplicas
| 2
| 最小副本数 |
maxReplicas
| 10
| 最大副本数 |
maxUnavailable
| 1
| 不可用 Pod 的最大数量限制 |
image.pullPolicy
| Always
| Sidekiq 镜像拉取策略 |
image.pullSecrets
| 镜像仓库的 Secrets | |
image.repository
| registry.gitlab.com/gitlab-org/build/cng/gitlab-sidekiq-ee
| Sidekiq 镜像仓库 |
image.tag
| Sidekiq 镜像标签 | |
init.image.repository
| initContainer 镜像 | |
init.image.tag
| initContainer 镜像标签 | |
logging.format
| default
| 对于 JSON 结构的日志,设置为 json
|
metrics.enabled
| true
| 切换 Prometheus metrics exporter |
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
| 5
| 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:Memory
的 1: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 容器。
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 服务器的端口。 |
注意: 当前的 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
。
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
concurrency
| Integer | 要同时处理的进程数。如果未提供,它将从 chart 范围的默认值中提取。 | |
name
| String | 用于命名此 pod 的 Deployment 和 ConfigMap 。 它应该保持简短,并且不应在任何两个条目之间重复。
| |
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.targetAverageValue
| String | 设置自动扩缩容目标值 | |
extraEnv
| Map | 要暴露的附加环境变量列表。 chart 范围的值被合并到其中,来自 pod 的值优先 | |
terminationGracePeriodSeconds
| 30
| Pod 需要优雅终止的可选持续时间(以秒为单位)。 |
queues
queues
值是一个字符串,包含要处理的以逗号分隔的队列列表。 默认情况下未设置,这意味着将处理所有队列。
字符串不应包含空格:merge,post_receive,process_commit
有效,但merge, post_receive, process_commit
无效。
任何将 job 添加到其中但没有没有至少一个 pod 的一部分的队列将不会被处理。<!–有关所有队列的完整列表,请参阅以下源文件:
negateQueues
negateQueues
与 queues
的格式相同,但它表示要忽略而不是处理的队列。
字符串不应包含空格:merge,post_receive,process_commit
有效,但merge, post_receive, process_commit
无效。
如果您有一个 pod 处理重要队列,而另一个 pod 处理其它队列,这将非常有用:它们可以使用相同的队列列表,一个在 queues
中,另一个在 negateQueues
中。
negateQueues
_不应该_与 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:
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