使用 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 目标类型,必须是 UtilizationAverageValue  
hpa.targetAverageValue 100m 设置自动扩缩容目标值  
hpa.cpu.targetAverageUtilization   设置自动缩放 CPU 目标利用率  
hpa.memory.targetType   设置自动缩放内存目标类型,必须是 UtilizationAverageValue  
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.cpuhpa.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   为这个 DeploymentPod 定义一个 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.typeLoadBalancer 时的自定义负载均衡器IP  
service.loadBalancerSourceRanges nil service.typeLoadBalancer 时的自定义负载均衡器源范围列表  
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.tlstrue,则必须配置。  
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:

  1. 创建 Kubernetes 集群。
  2. 检出合并请求的工作分支。
  3. 从本地 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
    
  4. 使用 GDK 运行进程以配置和使用 GitLab Kubernetes 代理:(您也可以按照步骤手动配置和使用代理。)

    1. 从您的 GDK GitLab 仓库,移动到 QA 文件夹:cd qa
    2. 执行以下命令,进行 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

配置 KEDA

keda 部分用来控制是否应该安装 KEDA ScaledObjects 代替常规的 HorizontalPodAutoscalers。此配置是可选的,可以在需要基于自定义或外部指标进行自动缩放时使用。

大多数设置默认为 hpa 部分中的值(如果适用)。

如果如下的值为 true,则会基于 hpa 部分中设置的 CPU 和内存阈值自动添加 CPU 和内存触发器:

  • 未 设置triggers
  • request.cpu.requestrequest.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.cpuhpa.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