ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于 Bitnami Helm Chart 在 Kubernetes 上部署 GitLab Runner 的完整实战指南

基于 Bitnami Helm Chart 在 Kubernetes 上部署 GitLab Runner 的完整实战指南 云原生容器编排【免费下载链接】chartsBitnami Helm Charts项目地址https://gitcode.com/GitHub_Trending/charts30/charts点击查看免费下载GitLab Runner 是 GitLab 安装的辅助组件用 Go 编写负责执行 CI/CD 作业并将结果回传给 GitLab。本指南以仓库中的 Bitnami gitlab-runner Helm chart当前 chart 版本 1.1.9应用版本 18.3.0为蓝本系统讲解如何在 Kubernetes 集群上通过 Helm 部署、注册、配置并监控 GitLab Runner。读完本文你将掌握从获取注册令牌、连接 GitLab 实例到自定义 runner 配置k8s 执行器、默认 Job 镜像、开启 Prometheus 指标采集、配置 Session Server Ingress、管理 RBAC 与资源配额的全套实战能力并了解底层模板的实现机制。GitLab Runner 与 Chart 概述GitLab Runner 是一个独立运行的进程主动轮询 GitLab 服务器获取待执行的 CI/CD 作业在本地或远程执行器上运行作业后回传结果。本 Chart 将其打包为 Kubernetes Deployment 形式默认使用kubernetes执行器即每个 Job 会动态创建独立的 Pod 来运行。Chart 元数据信息见 Chart.yaml依赖 Bitnamicommon库2.x.x包含gitlab-runner与gitlab-runner-helper两个镜像默认bitnami/gitlab-runner:18.3.0-debian-12-r0helper 镜像用于执行 Git 克隆、缓存打包等 Job 辅助步骤。为什么选择 Bitnami Secure ImagesBSI本 Chart 配套的镜像是 Bitnami 基于 Photon Linux 构建的安全加固镜像主要特点常用开源软件的加固安全镜像接近零漏洞Near-Zero Vulnerabilities通过 VEX 声明、KEV 与 EPSS 评分提供漏洞分类与优先级排序面向合规提供 FIPS、STIG 与离线air-gap选项附带 SBOM 物料清单通过 in-toto 提供软件供应链来源证明与 Bitnami 系列 Helm Chart 一等公民式集成。每个镜像都附带安全元数据可通过 Bitnami 公开目录查看。若需要旧一代基于 Debian 的镜像可参考 Bitnami Legacy 仓库。镜像的标签与摘要等细节可在 values.yaml 的image与helperImage段落中调整。前置条件Kubernetes 1.23Helm 3.8.0。此外若要集成 Prometheus 监控需预先部署可用的 Prometheus 或 Prometheus Operator可选用本仓库的 bitnami/prometheus 或 bitnami/kube-prometheus。安装 Chart快速安装TL;DRhelm install my-release oci://registry-1.docker.io/bitnamicharts/gitlab-runner通用形式为helm install my-release oci://REGISTRY_NAME/REPOSITORY_NAME/gitlab-runner其中REGISTRY_NAME与REPOSITORY_NAME需替换为你所使用的 Helm Chart 仓库例如 Bitnami 官方为REGISTRY_NAMEregistry-1.docker.io、REPOSITORY_NAMEbitnamicharts。可用helm list查看所有已部署的 release。通过参数定制安装Chart 的全部可配置参数见后文 参数详解 一节可在安装时用--set keyvalue[,keyvalue]指定例如开启 RBAChelm install my-release \ --set rbac.createtrue oci://registry-1.docker.io/bitnamicharts/gitlab-runner也可以将参数写入 YAML 文件后通过-f传入helm install my-release -f values.yaml oci://registry-1.docker.io/bitnamicharts/gitlab-runner默认参数文件为 values.yaml。未提供 GitLab 地址与令牌时的处理模板 NOTES.txt 中实现了gitlab-runner.canDeploy校验若安装时未提供gitlabUrl与runnerToken或existingSecretChart 仍会安装但提示通过helm upgrade补全参数helm upgrade --namespace NAMESPACE my-release oci://registry-1.docker.io/bitnamicharts/gitlab-runner \ --set gitlabUrlYOUR_GITLAB_HOST,runnerTokenYOUR_RUNNER_TOKEN或使用已有 Secrethelm upgrade --namespace NAMESPACE my-release oci://registry-1.docker.io/bitnamicharts/gitlab-runner \ --set gitlabUrlYOUR_GITLAB_HOST,existingSecretYOUR_SECRET连接 GitLab 实例GitLab Runner 必须连接一个已存在的 GitLab 安装。在 GitLab 侧需要在 CI/CD 管理面板中创建一个 runner获取 runner 注册令牌部署时设置runnerToken或通过existingSecret引用包含令牌的 Secret以及gitlabUrl带协议的 GitLab 服务器地址如https://gitlab.example.com回到 GitLab 实例中检查 runner 的注册状态。令牌的传递方式从 secret.yaml 可以看到Chart 默认会创建一个Opaque类型的 Secret其runner-token键通过common.secrets.passwords.manage模板从runnerToken取值生成若设置existingSecret则跳过创建直接使用已有 Secret。在 deployment.yaml 中该 Secret 被以 projected volume 挂载到/secrets目录再由 configmap-scripts.yaml 中的entrypoint脚本读取并导出为CI_SERVER_TOKEN环境变量供注册流程使用。此外Chart 还支持existingCacheSecret包含分布式缓存凭据S3/GCS/Azure的 SecretexistingConfigMap包含配置与脚本的 ConfigMap设置后跳过默认 ConfigMap 生成existingCertsSecret连接 GitLab 实例所需的自定义证书 Secret将挂载到/home/gitlab-runner/.gitlab-runner/certs/extraConfig向默认config.toml追加额外配置。设置 Runner 配置runners.configChart 部署的 runner 默认使用kubernetes执行器。通过修改runners.config可以定制默认配置例如更换默认 Job 镜像runners: config: | [[runners]] [runners.kubernetes] namespace {{ include common.names.namespace . }} image bitnami/os-shell模板中的值支持 Helm 模板语法如common.names.namespace这类模板函数在渲染时求值。values.yaml 中默认的runners.config使用gitlab-runner.image、gitlab-runner.helper.image与gitlab-runner.imagePullSecretsRaw等模板函数动态生成runners: config: | [[runners]] [runners.kubernetes] namespace {{ include common.names.namespace . }} image {{ include gitlab-runner.image . }} helper_image {{ include gitlab-runner.helper.image . }} image_pull_secrets [{{ include gitlab-runner.imagePullSecretsRaw . }}]配置在模板中的落点configmap.yaml 会把runners.config渲染为config.template.toml同时把concurrent、check_interval、log_level、log_format、listen_address指标、session_server等全局配置渲染进config.tomlconfigmap-scripts.yaml 中的register-the-runner脚本会执行/entrypoint register完成注册--template-config指向config.template.toml若设置runners.configPath则指向该绝对路径可配合extraVolumes挂载已有配置注册时若runners.name与runners.maximumTimeout有值会分别附加--name与--maximum-timeout参数runners.runUntagged与runners.protected决定是否附加--run-untaggedtrue与--access-levelref_protected。当检测到认证令牌以glrt-开头时GitLab 15 起的新格式会重置这些标志位因为新令牌格式已内嵌标签与保护属性注册脚本最多重试 30 次每次失败后 sleep 5 秒全部失败则容器退出exit 1。全局并发与日志参数runners.config之外以下参数直接影响 runner 的全局行为渲染进config.tomlconcurrent最大并发作业数默认10checkInterval检查 GitLab 构建的时间间隔秒默认3shutdownTimeout强制关闭前等待的秒数默认0logLevel/logFormat日志级别默认info与格式默认runnerconnectionMaxAgeTLS keepalive 连接的最大存活时间默认15msentryDsnRunner 的 Sentry DSN配置后写入sentry_dsn。部署形态与生命周期Deployment 结构deployment.yaml 中主容器gitlab-runner使用dumb-init作为启动入口参数为/configmaps/entrypoint。entrypoint 脚本的执行流程见 configmap-scripts.yaml将config.toml复制到配置目录若启用 Session Server先启动脚本解析 Service 地址与端口并回写配置从/secrets中读取缓存凭据S3/GCS/Azure与令牌并导出环境变量执行register-the-runner完成注册执行pre-entrypoint-script对应preEntrypointScript参数最后exec /entrypoint run --usergitlab-runner --working-directory/home/gitlab-runner启动 runner 主进程。优雅退出与反注册默认unregisterRunnerstrue此时 Deployment 配置了preStop生命周期钩子Pod 终止前会执行/entrypoint unregister --all-runners将所有 runner 从 GitLab 注销参见 deployment.yaml 的lifecycle段。若设置了lifecycleHooks则以用户自定义钩子为准。探针ProbeslivenessProbe默认启用执行check-live脚本先检查进程存在再调用gitlab-runner verify --url验证 runner 是否 alive/valid超时退出码 143/124 视为不确定而非失败readinessProbe默认启用通过pgrep gitlab.*runner检测主进程startupProbe默认关闭同样以pgrep检查。均支持customStartupProbe/customLivenessProbe/customReadinessProbe完全自定义。资源请求与限制Resources所有容器都可通过resources参数设置 requests 与 limits生产环境务必按实际场景设置。示例resources: requests: cpu: 2 memory: 512Mi limits: cpu: 3 memory: 1024Mi为简化设置Chart 提供resourcesPreset预设值可选none、nano、micro、small、medium、large、xlarge、2xlarge默认small。其实现位于 Bitnamicommon库的_resources.tpl模板通过common.resources.preset自动生成 resources 段参见 deployment.yaml 的渲染逻辑。需要说明的是生产环境不推荐使用resourcesPreset因为它无法完全贴合你的具体工作负载设置resources后预设会被忽略。容器资源管理的更多细节可参考 Kubernetes 官方文档。Rolling 与 Immutable 镜像标签生产环境强烈建议使用不可变immutable标签避免同一标签被更新为不同镜像时部署内容在无感知情况下发生变化。Bitnami 会在主容器发布新版本、出现重大变更或存在关键漏洞时发布新版 Chart 并更新其镜像。可在 values 中通过image.tag、image.digestsha256:...设置后将覆盖 tag锁定镜像版本helperImage同理。启用 RBAC 安全设置rbac.createtrue即可为 GitLab Runner 启用基于角色的访问控制RBAC。相关模板 cluster-role.yaml 会生成ClusterRolerbac.clusterWideAccesstrue时或命名空间级Role默认规则对核心 API 组的*资源授予*权限可通过rbac.rules自定义规则列表设置后覆盖默认规则。相关参数rbac.clusterWideAccess是否允许 runner 集群级访问默认falserbac.rules要添加到 RBAC Role 权限中的规则列表serviceAccount.create是否创建 ServiceAccount默认trueserviceAccount.name自定义名称serviceAccount.annotations为注解automountServiceAccountToken是否在 Pod 中挂载 SA Token默认true。设置 Pod 亲和性Chart 允许通过affinity参数自定义 Pod 亲和性规则。作为替代也可以使用 Bitnamicommon库提供的亲和性预设podAffinityPresetPod 亲和性预设可选soft或hard默认podAntiAffinityPresetPod 反亲和预设默认softnodeAffinityPreset.type/key/values节点亲和性预设。注意一旦设置affinity上述三个预设均会被忽略参见 deployment.yaml 中affinity的条件渲染逻辑。此外还支持topologySpreadConstraints、nodeSelector、tolerations、priorityClassName、schedulerName、terminationGracePeriodSeconds等调度参数。网络策略NetworkPolicyChart 默认启用 NetworkPolicynetworkPolicy.enabledtrue关键参数networkPolicy.allowExternal策略模型true表示接受任何来源的入站连接默认false则仅允许带正确 client 标签的 Pod 访问networkPolicy.allowExternalEgress是否允许访问任意端口与目标默认truenetworkPolicy.kubeAPIServerPorts可访问的 Kubernetes 组件端点列表kube-apiserver/kubelet默认[443, 6443, 8443, 10250]可按集群设置收紧以提升安全性networkPolicy.extraIngress/extraEgress追加自定义入站/出站规则networkPolicy.ingressNSMatchLabels/ingressNSPodMatchLabels允许来自其他命名空间流量的标签匹配。Session Server 与 IngressGitLab Runner 的交互式 Web 终端功能依赖 Session ServerChart 为其提供了 Service 与 Ingress 支持。启用后模板 configmap.yaml 会写入[session_server]段session_timeout、listen_address 0.0.0.0:port、advertise_addressdeployment.yaml 会注入SESSION_SERVER_ADDRESS环境变量并开放http-session端口。启用 Session ServersessionServer: enabled: true sessionTimeout: 1800 # 会话超时秒 service: type: ClusterIP # ClusterIP / NodePort / LoadBalancer ports: sessionServer: 9000启用后可通过 NOTES.txt 输出提示获取访问地址集群内为gitlab-runner-session-server.namespace.svc.clusterDomain集群外可根据 Service 类型使用 NodePort、LoadBalancer 或kubectl port-forward。底层 configmap-scripts.yaml 中的set-session-server-address/set-session-server-port脚本会通过 Kubernetes API 解析 Service 的 ClusterIP/外部地址与 NodePort 并回写配置。配置 Ingress若集群中安装了 Ingress Controller如 nginx-ingress-controller 或 contour可通过sessionServer.ingress.enabledtrue启用 IngresssessionServer: ingress: enabled: true hostname: session-server.example.com # 默认 session-server.local path: / ingressClassName: nginx tls: true # 为该 host 启用 TLS annotations: cert-manager.io/cluster-issuer: cluster-issuer-name # cert-manager 自动签发多主机场景可设置sessionServer.ingress.extraHosts数组每个元素需指定 name、path 及必要的注解与sessionServer.ingress.extraTLS。启用 TLS 后 Chart 将生成 HTTPS URL应用在 443 端口提供访问TLS Secret 可以来自sessionServer.ingress.secrets以 PEM 格式自定义证书key 与 certificatecert-manager通过注解自动创建sessionServer.ingress.selfSignedtrue由 Helm 生成自签名证书。注意TLS Secret 必须真实存在否则 Ingress 记录不会生效。额外规则可使用extraRules定义。需说明的是并非所有注解都被所有 Ingress Controller 支持具体以各控制器文档为准。Prometheus 指标集成设置metrics.enabledtrue后Chart 会暴露 GitLab Runner 原生的 Prometheus 端点在 configmap.yaml 中为config.toml写入listen_address :9252并在 metrics-svc.yaml 中创建名为fullname-metrics的 Service默认端口9252同时自动附加prometheus.io/scrape: true、prometheus.io/port: 9252、prometheus.io/path: /metrics注解便于 Prometheus 自动抓取。集成 Prometheus OperatorServiceMonitor若使用 Prometheus Operator可设置metrics.serviceMonitor.enabledtrue同时要求metrics.enabledtrue。模板 servicemonitor.yaml 会创建monitoring.coreos.com/v1的 ServiceMonitor抓取/metrics端点。常用参数metrics.serviceMonitor.namespacePrometheus 所在命名空间metrics.serviceMonitor.interval/scrapeTimeout抓取间隔与超时metrics.serviceMonitor.labels/annotations附加标签与注解metrics.serviceMonitor.honorLabels标签冲突时是否优先保留指标自身标签metrics.serviceMonitor.metricRelabelings/relabelings指标重打标签metrics.serviceMonitor.selectorPrometheus 实例的 selector 标签。前提条件集群中必须已安装 Prometheus Operator 的 CRD否则会报如下错误no matches for kind ServiceMonitor in version monitoring.coreos.com/v1可通过安装本仓库的 bitnami/kube-prometheus Chart 来获得所需的 CRD 与 Prometheus Operator。参数详解全局参数Global parameters名称描述默认值global.imageRegistry全局 Docker 镜像仓库global.imagePullSecrets全局 Docker 仓库 Secret 名称数组[]global.security.allowInsecureImages允许跳过镜像校验falseglobal.compatibility.openshift.adaptSecurityContext适配 OpenShift restricted-v2 SCC移除 runAsUser、runAsGroup、fsGroup 交由平台默认 ID。可选auto检测到 OpenShift 时应用/force总是应用/disabled不应用auto通用参数Common parameters名称描述默认值kubeVersion强制目标 Kubernetes 版本未设置时使用 Helm capabilitiesapiVersions覆盖 .Capabilities 报告的 Kubernetes API 版本[]clusterDomainKubernetes 集群域cluster.localnameOverride部分覆盖 fullname 模板保留 release 名fullnameOverride完全覆盖 fullname 模板namespaceOverride完全覆盖命名空间commonLabels/commonAnnotations为所有部署资源添加标签/注解{}extraDeploy随 release 部署的额外对象数组[]diagnosticMode.enabled启用诊断模式禁用所有探针并覆盖命令falsediagnosticMode.command/args覆盖所有容器的命令/参数[sleep]/[infinity]GitLab Runner 参数镜像相关image.registry、image.repository、image.digest设置后覆盖 tag、image.pullPolicy默认IfNotPresent、image.pullSecretshelper 镜像同构helperImage.*默认仓库bitnami/gitlab-runner-helper。连接与注册名称描述默认值gitlabUrlGitLab 服务器 URL带协议用于注册 runnerrunnerToken添加新 runner 的令牌existingSecret包含 runner 令牌的 Secret 名称existingCacheSecret包含分布式缓存凭据的 Secret 名称existingConfigMap包含配置和脚本的 ConfigMap 名称existingCertsSecret连接 GitLab 实例的自定义证书 SecretextraConfig追加到默认配置文件的额外配置unregisterRunners终止前注销所有 runnertrue运行行为名称描述默认值concurrent最大并发作业数10shutdownTimeout强制关闭前等待秒数0checkInterval检查 GitLab 构建间隔秒3logLevel日志级别infologFormat日志格式runnersentryDsnSentry DSNconnectionMaxAgeTLS keepalive 连接最大存活时间15mpreEntrypointScript入口点之前执行的命令updateStrategy.type更新策略RollingUpdatereplicaCountrunner 节点副本数1automountServiceAccountTokenPod 中挂载 SA TokentruehostAliases部署 host aliases[]自动扩缩容autoscaling.vpa.enabled默认false含annotations、controlledResources、maxAllowed、minAllowed、updatePolicy.updateModeAutoautoscaling.hpa.enabled含minReplicas、maxReplicas、targetCPU、targetMemory。RBAC 与服务账户rbac.create默认true、rbac.clusterWideAccess、rbac.rulesserviceAccount.create默认true、serviceAccount.name、serviceAccount.automountServiceAccountToken、serviceAccount.annotations。端口与容器containerPorts.metrics默认9252、containerPorts.sessionServer默认8093、dnsPolicy默认ClusterFirst、command、args、lifecycleHooks、extraEnvVars、extraEnvVarsCM、extraEnvVarsSecret、extraArgs、sidecars、initContainers、podLabels、podAnnotations、priorityClassName、schedulerName、terminationGracePeriodSeconds。调度与高可用podAffinityPresetsoft/hard、podAntiAffinityPreset默认soft、nodeAffinityPreset.type/key/values、affinity、topologySpreadConstraints、nodeSelector、tolerationspdb.create默认true、pdb.minAvailable、pdb.maxUnavailable。网络策略见上文 NetworkPolicy 一节默认networkPolicy.enabledtrue、allowExternaltrue、allowExternalEgresstrue。资源与探针resourcesPreset默认small、resources生产推荐startupProbe默认关闭/livenessProbe默认开启/readinessProbe默认开启各自的enabled、initialDelaySeconds、periodSeconds、timeoutSeconds、failureThreshold、successThresholdcustomStartupProbe、customLivenessProbe、customReadinessProbe。安全上下文containerSecurityContext.enabled默认true、seLinuxOptions、runAsUser/runAsGroup默认1001、runAsNonRoottrue、privilegedfalse、readOnlyRootFilesystemtrue、allowPrivilegeEscalationfalse、capabilities.drop[ALL]、seccompProfile.typeRuntimeDefaultpodSecurityContext.enabled、fsGroupChangePolicyAlways、sysctls、supplementalGroups、fsGroup1001。extraVolumes/extraVolumeMounts可用于在readOnlyRootFilesystem: true下挂载emptyDir提供可写临时目录。Runner 配置runners.configk8s 执行器下 Job Pod 的配置、runners.configPath已有配置文件的绝对路径、runners.executor默认kubernetes、runners.name、runners.maximumTimeout、runners.runUntagged默认true、runners.protected默认true。Session Server 与 Metrics 参数Session ServersessionServer.enabled默认false、sessionServer.sessionTimeout默认1800、sessionServer.service.typeClusterIP、ports.sessionServer9000、nodePorts、labels、clusterIP、loadBalancerIP、loadBalancerSourceRanges、externalTrafficPolicy、annotations、extraPorts、sessionAffinityNone、sessionAffinityConfig。Ingress位于sessionServer.ingress下enabled、pathTypeImplementationSpecific、apiVersion、hostname默认session-server.local、ingressClassName、path默认/、annotations、tls、selfSigned、extraHosts、extraPaths、extraTls、secrets、extraRules。Metricsmetrics.enabled默认false、metrics.service.typeClusterIP、ports.metrics9252、nodePorts、labels、clusterIP、loadBalancerIP、loadBalancerSourceRanges、externalTrafficPolicy、annotations、extraPorts、sessionAffinity、sessionAffinityConfigmetrics.serviceMonitor.enabled还需metrics.enabledtrue、namespace、annotations、labels、jobLabel、honorLabels、interval、scrapeTimeout、metricRelabelings、relabelings、selector。诊断与排障诊断模式设置diagnosticMode.enabledtrue后所有探针会被禁用容器命令被覆盖为sleep infinity可自定义command/args便于进入 Pod 排查问题kubectl get pods --namespace NAMESPACE -l app.kubernetes.io/instancemy-release kubectl exec --namespace NAMESPACE -ti POD_NAME -- bash常规检查kubectl get pods --namespace NAMESPACE -l app.kubernetes.io/instancemy-release检查 GitLab 实例中的集成状态runner 注册状态。常见问题可参考 Bitnami 官方 Helm Chart 排障指南。底层排障线索从模板实现看可重点检查configmap-scripts.yaml 中的check-live脚本会调用gitlab-runner verify --url若 runner 注册失效liveness 探针会持续失败并触发 Pod 重启注册失败令牌错误、网络不通会在 entrypoint 日志中体现为Registration attempt N of 30的重试信息最终容器退出码为 1若使用自签名证书连接 GitLab务必设置existingCertsSecret将 CA 证书挂载到/home/gitlab-runner/.gitlab-runner/certs/否则注册与通信会因证书校验失败而中断。总结通过 Bitnami 的 gitlab-runner Chart可以在 Kubernetes 上快速获得一个生产可用的 GitLab Runner它默认以kubernetes执行器运行、自动完成注册与反注册生命周期管理支持通过runners.config深度定制 Job Pod 配置并原生集成 Prometheus 指标与 Prometheus Operator 的 ServiceMonitor。在生产环境中建议优先使用不可变镜像标签、显式配置resources、开启 RBAC 并依据集群实际环境收紧 NetworkPolicy 与安全上下文参数从而获得安全、稳定、可观测的 CI/CD 执行底座。赞分享云原生容器编排【免费下载链接】chartsBitnami Helm Charts项目地址https://gitcode.com/GitHub_Trending/charts30/charts点击查看免费下载相关推荐在 Kubernetes 上部署 Discourse 论坛Bitnami Helm Chart 完整实战指南在 Kubernetes 上部署 Discourse 论坛Bitnami Helm Chart 完整实战指南 Discourse 是一款自带版主与治理机制的开云原生容器编排kubernetes-handbook 实战基于 Helm Chart 在 Kubernetes 上部署 MongoDBBitnami MongoDB Chart 深度解析kubernetes handbook 实战基于 Helm Chart 在 Kubernetes 上部署 MongoDBBitnami MongoDB Ch教程云原生容器编排Bitnami Argo CD Helm Chart 完整指南在 Kubernetes 上部署 GitOps 持续交付平台Bitnami Argo CD Helm Chart 完整指南在 Kubernetes 上部署 GitOps 持续交付平台 Argo CD 是一种基于 Git云原生容器编排上一篇requests库文件上传功能Multipart请求实现详解下一篇magnetW插件依赖更新工具自动化与安全检查创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表