使用 GitLab kas
chart
kas
子 chart 提供了 GitLab 代理服务器 (KAS) 的可配置部署。
代理服务器是您与 GitLab 一起安装的组件,管理 Kubernetes 的 GitLab 代理。
此 chart 依赖于对 GitLab API 和 Gitaly 服务器的访问。 当您启用此 chart 时,将部署一个 Ingress。
为了消耗最少的资源,kas
容器使用 distroless 镜像。
部署的服务由 Ingress 公开,该 Ingress 使用 WebSocket 代理 进行通信。
此代理允许与外部组件 agentk
的长期连接。agentk
是 Kubernetes 集群端代理对应物。
访问服务的路径取决于您的 Ingress 配置。
禁用代理服务器
极狐GitLab 代理服务器 (kas
) 默认启用。
要在极狐GitLab 实例上禁用它,请将 Helm 属性 global.kas.enabled
设置为 false
。
例如:
helm upgrade --install kas --set global.kas.enabled=false
指定 Ingress
当您将 chart 的 Ingress 与默认配置一起使用时,代理服务器的服务可在子域名上访问。
例如,对于 global.hosts.domain: example.com
,代理服务器可在 kas.example.com
访问。
KAS Ingress 可以使用与 global.hosts.domain
不同的域名。
设置 global.hosts.kas.name
,例如:
global.hosts.kas.name: kas.my-other-domain.com
此示例仅使用 kas.my-other-domain.com
作为 KAS Ingress 的 host。
其余服务(包括 GitLab、Registry、MinIO 等)使用 global.hosts.domain
中指定的域名。
安装命令行选项
下表包含可以使用 --set
标志提供给 helm install
命令的所有可能的 chart 配置。
参数 | 默认值 | 说明 | |
---|---|---|---|
affinity |
{} |
pod 分配的 Affinity 规则 | |
annotations |
{} |
Pod annotations | |
common.labels |
{} |
应用于此 chart 创建的所有对象的补充标签。 | |
securityContext.runAsUser |
65532 |
Pod 启动时使用的用户 ID | |
securityContext.runAsGroup |
65534 |
Pod 启动时使用的组 ID | |
securityContext.fsGroup |
65532 |
Pod 启动时使用的组 ID | |
securityContext.fsGroupChangePolicy |
修改卷归属和权限的策略(Kuberntes 版本需要为 1.23 | ||
securityContext.seccompProfile.type |
RuntimeDefault |
使用 Seccomp profile | |
containerSecurityContext.runAsUser |
65532 |
覆盖用于启动容器的容器 securityContext | |
containerSecurityContext.allowPrivilegeEscalation |
false |
用来控制容器进程是否可以比父进程拥有更高权限 | |
containerSecurityContext.runAsNonRoot |
true |
用来控制是否可以以非 root 用户运行容器 | |
containerSecurityContext.capabilities.drop |
[ "ALL" ] |
为 Gitaly 容器移除 Linux 能力 | |
extraContainers |
包含的额外容器列表 | ||
extraEnv |
要公开的更多环境变量列表 | ||
extraEnvFrom |
要公开的来自其他数据源的更多环境变量列表 | ||
init.containerSecurityContext |
{} |
初始化容器 securityContext 覆盖 | |
init.containerSecurityContext.allowPrivilegeEscalation |
false |
initContainer 说明:用来控制进程是否可以拥有比父进程更高的权限 | |
init.containerSecurityContext.runAsNonRoot |
true |
initContainer 说明:用来控制是否可以用非 root 用户运行容器 | |
init.containerSecurityContext.capabilities.drop |
[ "ALL" ] |
initContainer 说明:为容器移除 Linux 能力 | |
image.repository |
registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/kas |
镜像仓库 | |
image.tag |
v13.7.0 |
镜像标签 | |
hpa.behavior |
{scaleDown: {stabilizationWindowSeconds: 300 }} |
包含放大和缩小行为的规范(需要 autoscaling/v2beta2 或更高版本) |
|
hpa.customMetrics |
[] |
自定义指标包含用于计算所需副本数的规范(覆盖在 targetAverageUtilization 中配置的平均 CPU 利用率的默认使用值) |
|
hpa.cpu.targetType |
AverageValue |
设置自动缩放 CPU 目标类型,必须是 Utilization 或 AverageValue
|
|
hpa.targetAverageValue |
100m |
设置自动扩缩容目标值 | |
hpa.cpu.targetAverageUtilization |
设置自动缩放 CPU 目标利用率 | ||
hpa.memory.targetType |
设置自动缩放内存目标类型,必须是 Utilization 或 AverageValue
|
||
hpa.memory.targetAverageValue |
设置自动缩放内存目标值 | ||
hpa.memory.targetAverageUtilization |
设置自动缩放内存目标利用率 | ||
hpa.targetAverageValue |
已弃用 设置自动缩放 CPU 目标值 | ||
ingress.enabled |
如果 global.kas.enabled=true 默认值为 true
|
您可以使用 kas.ingress.enabled 打开或关闭。如果没有设置,您可以选择使用 global.ingress.enabled 来达到同样的目的。 |
|
ingress.apiVersion |
在 apiVersion 字段中使用的值。 |
||
ingress.annotations |
{} |
Ingress annotations | |
ingress.tls |
{} |
Ingress TLS 配置 | |
ingress.agentPath |
/ |
代理 API 端点的 Ingress 路径 | |
ingress.k8sApiPath |
/k8s-proxy |
Kubernetes API 端点的 Ingress 路径 | |
keda.enabled |
false |
使用 KEDA ScaledObjects 替代 HorizontalPodAutoscalers
|
|
keda.pollingInterval |
30 |
检查每个触发器的时间间隔 | |
keda.cooldownPeriod |
300 |
最后一个触发器报告有效后,在将资源缩放回 0 之前等待的时间 | |
keda.minReplicaCount |
KEDA 将资源缩减到的最小副本数,默认为 hpa.minReplicas
|
||
keda.maxReplicaCount |
KEDA 将资源扩展到的最大副本数,默认为 hpa.maxReplicas
|
||
keda.fallback |
KEDA 后备配置,请参阅文档 | ||
keda.hpaName |
KEDA 将创建的 HPA 资源的名称,默认为 keda-hpa-{scaled-object-name}
|
||
keda.restoreToOriginalReplicaCount |
指定删除 ScaledObject 后,目标资源是否应缩减至原始副本数 |
||
keda.behavior |
放大和缩小行为的 spec,默认为 hpa.behavior
|
||
keda.triggers |
用于激活目标资源扩展的触发器列表,默认为根据 hpa.cpu 和 hpa.memory 计算的触发器 |
||
metrics.enabled |
true |
指标端点是否可用于抓取 | |
metrics.path |
/metrics |
Metrics 端点路径。 | |
metrics.serviceMonitor.enabled |
false |
是否创建 ServiceMonitor 使 Prometheus Operator 能够管理指标抓取,请注意启用此功能会删除 prometheus.io 抓取注释 |
|
metrics.serviceMonitor.additionalLabels |
{} |
要添加到 ServiceMonitor 的其它标签 | |
metrics.serviceMonitor.endpointConfig |
{} |
ServiceMonitor 的附加端点配置 | |
metrics.podMonitor.enabled |
false |
是否 PodMonitor 应该被创建并开启 Prometheus Operator 来管理指标集。通过删除 prometheus.io 注释来启用。它不能同时和 metrics.serviceMonitor.enabled 使用 |
|
metrics.podMonitor.additionalLabels |
{} |
为 PodMonitor 添加的额外标签。 | |
metrics.podMonitor.endpointConfig |
{} |
为 PodMonitor 添加的额外端点配置。 | |
maxReplicas |
10 |
HPA maxReplicas
|
|
maxUnavailable |
1 |
HPA maxUnavailable
|
|
minReplicas |
2 |
HPA maxReplicas
|
|
nodeSelector |
为这个 Deployment 的 Pod 定义一个 nodeSelector(如果存在)。 |
||
observability.port |
8151 |
可观察性端点端口。用于指标和探测端点。 | |
observability.livenessProbe.path |
/liveness |
Liveness 探测端点的 URI。此值必须与 KAS 服务配置中的 observability.liveness_probe.url_path 值相匹配 |
|
observability.readinessProbe.path |
/readiness |
Readiness 端点的 URI。此值必须与 KAS 服务配置中的 observability.readiness_probe.url_path 值相匹配 |
|
serviceAccount.annotations |
{} |
Service account 注释 | |
podLabels |
{} |
补充 Pod 标签。 不会用于选择器。 | |
serviceLabels |
{} |
补充 service 标签 | |
common.labels |
应用于此 chart 创建的所有对象的补充标签。 | ||
redis.enabled |
true |
允许选择 KAS 功能不使用 Redis。警告:Redis 将很快成为硬依赖项,因此该键已被弃用。 | |
resources.requests.cpu |
75m |
GitLab Exporter 最小 CPU | |
resources.requests.memory |
100M |
GitLab Exporter 最小内存 | |
service.externalPort |
8150 |
外部端口(agentk 连接) | |
service.internalPort |
8150 |
内部端口(agentk 连接) | |
service.apiInternalPort |
8153 |
内部 API 的内部端口(用于 GitLab 后端) | |
service.loadBalancerIP |
nil |
当service.type 为LoadBalancer 时的自定义负载均衡器IP |
|
service.loadBalancerSourceRanges |
nil |
当service.type 为LoadBalancer 时的自定义负载均衡器源范围列表 |
|
service.kubernetesApiPort |
8154 |
用于在其上公开代理的 Kubernetes API 的外部端口 | |
service.privateApiPort |
8155 |
公开 kas 私有API的内部端口(用于kas ->kas 通信) |
|
privateApi.secret |
自动生成 | 用于对数据库进行身份验证的 secret 名称 | |
privateApi.key |
自动生成 |
privateApi.secret 中要使用的键的名称 |
|
privateApi.tls.enabled |
false |
已废弃:使用 global.kas.tls.enabled 。启用 kas pod 使用 TLS 相互通信。 |
|
privateApi.tls.secretName |
nil |
已废弃:使用 global.kas.tls.secretName 。包含证书及其关联密钥的 Kubernetes TLS 密钥的名称。如果 privateApi.tls 为 true ,则必须配置。 |
|
global.kas.service.apiExternalPort |
8153 |
内部 API 的外部端口(用于 GitLab 后端) | |
service.type |
ClusterIP |
Service 类型 | |
tolerations |
[] |
分配给 Pod 的容忍标签 | |
customConfig |
{} |
给定后,将默认的 kas 配置与这些值合并,优先考虑此处定义的值。 |
|
deployment.minReadySeconds |
0 |
在 kas pod 被认为准备好之前必须经过的最小秒数。 |
|
deployment.strategy |
{} |
允许配置 deployment 使用的更新策略 | |
deployment.terminationGracePeriodSeconds |
300 |
How much time in seconds a Pod is allowed to spend shutting down after receiving SIGTERM. | |
priorityClassName |
Priority class assigned to pods. |
启用 TLS 通信
在您的 kas
Pod 和其他 chart 组件之间启用 TLS 通信,through the global KAS attribute.
测试 kas
chart
要安装此 chart:
- 创建 Kubernetes 集群。
- 检出合并请求的工作分支。
-
从本地 chart 分支安装(或升级)极狐GitLab,默认情况下启用
kas
:helm upgrade --force --install gitlab . \ --timeout 600s \ --set global.hosts.domain=your.domain.com \ --set global.hosts.externalIP=XYZ.XYZ.XYZ.XYZ \ --set certmanager-issuer.email=your@email.com
-
使用 GDK 运行进程以配置和使用 GitLab Kubernetes 代理:(您也可以按照步骤手动配置和使用代理。)
- 从您的 GDK GitLab 仓库,移动到 QA 文件夹:
cd qa
。 -
执行以下命令,进行 QA 测试。
GITLAB_USERNAME=$ROOT_USER GITLAB_PASSWORD=$ROOT_PASSWORD GITLAB_ADMIN_USERNAME=$ROOT_USER GITLAB_ADMIN_PASSWORD=$ROOT_PASSWORD bundle exec bin/qa Test::Instance::All https://your.gitlab.domain/ -- --tag orchestrated --tag quarantine qa/specs/features/ee/api/7_configure/kubernetes/kubernetes_agent_spec.rb
您还可以自定义
agentk
版本以使用环境变量进行安装:GITLAB_AGENTK_VERSION=v13.7.1
。
- 从您的 GDK GitLab 仓库,移动到 QA 文件夹:
配置 KEDA
keda
部分用来控制是否应该安装 KEDA ScaledObjects
代替常规的 HorizontalPodAutoscalers
。此配置是可选的,可以在需要基于自定义或外部指标进行自动缩放时使用。
大多数设置默认为 hpa
部分中的值(如果适用)。
如果如下的值为 true,则会基于 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 | KEDA 缩容下限的最小值,默认值为 minReplicas
|
|
maxReplicaCount |
Integer | KEDA 扩容上限的最大值,默认值为 maxReplicas
|
|
fallback |
Map | KEDA 回掉配置,查看文档 | |
hpaName |
String | KEDA 即将创建的 HPA 的名称,默认为 keda-hpa-{scaled-object-name}
|
|
restoreToOriginalReplicaCount |
Boolean | 用来说明在 ScaledObject 被删除后,目标资源是否应该恢复到原先的副本数 |
|
behavior |
Map | 扩缩容行为说明,默认为 hpa.behavior
|
|
triggers |
Array | 触发目标资源扩容的触发器列表,默认触发器是基于 hpa.cpu 和 hpa.memory 计算得出的 |
keda
的使用示例可以查看 examples/keda/gitlab-shell.yml
。
serviceAccount
此部分用来控制是否应该创建一个 ServiceAccount 并确定是否应该将默认访问令牌挂载到 pod 中。
名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
annotations |
Map | {} |
ServiceAccount 注释。 |
automountServiceAccountToken |
Boolean | false |
用来控制默认的 ServiceAccount 访问令牌是否应该被挂载到 pod 中。您不应该启用它,除非有特殊的 sidecar 需求(比如在 istio 中)。 |
create |
Boolean | false |
是否应该创建 ServiceAccount。 |
enabled |
Boolean | false |
是否应该使用 ServiceAccount。 |
name |
String | ServiceAccount 名称。如未设置,将使用 chart 的完整名称。 |
affinity
详情可查看 affinity
。
开启调试日志
如要为 KAS 子 chart 开启调试日志,请将以下内容添加到 values.yaml
文件的 kas
部分中:
customConfig:
observability:
logging:
level: debug
grpc_level: debug