
github/k8s-actions-runnerself-hosted-k8s-runner 是一个在 Kubernetes 集群中部署自托管 GitHub Actions Runner 的解决方案,旨在提供灵活、可扩展的工作流执行环境。该方案通过容器化方式运行 GitHub Actions Runner,结合 Kubernetes 的编排能力,实现 runners 的动态管理、自动扩缩容及生命周期控制,适用于需要自定义执行环境或对资源、网络有特定要求的场景。
repo(仓库级)或 admin:org(组织级)权限,用于 runner 注册。添加 Helm 仓库
bashhelm repo add self-hosted-k8s-runner [***] helm repo update
创建配置文件
创建 values.yaml 配置 runner 基本信息(示例内容见 4.4 节):
yamlgithub: owner: "<your-github-org-or-username>" # 组织/用户名 repository: "<your-repo-name>" # 可选,指定仓库(不填则为组织级 runner) token: "<your-github-pat>" # GitHub PAT(通过 Secret 注入更安全,见 4.3 节) runner: labels: ["k8s-runner", "custom-label"] # 自定义标签 resources: requests: cpu: "1" memory: "2Gi" limits: cpu: "2" memory: "4Gi" autoscaling: enabled: true minReplicas: 1 maxReplicas: 5
部署 Helm Chart
bashhelm install my-runner self-hosted-k8s-runner/self-hosted-k8s-runner -f values.yaml --namespace github-runner --create-namespace
创建 Secret 存储敏感信息
yaml# github-secret.yaml apiVersion: v1 kind: Secret metadata: name: github-runner-secret namespace: github-runner type: Opaque data: GITHUB_TOKEN: <base64-encoded-pat> # 替换为 PAT 的 Base64 编码值
应用配置:
bashkubectl apply -f github-secret.yaml -n github-runner
部署 Runner Deployment
创建 runner-deployment.yaml(核心配置示例):
yamlapiVersion: apps/v1 kind: Deployment metadata: name: github-runner namespace: github-runner spec: replicas: 2 # 初始 runner 数量 selector: matchLabels: app: github-runner template: metadata: labels: app: github-runner spec: containers: - name: runner image: machinelearningapps/self-hosted-k8s-runner:latest # 官方镜像 env: - name: GITHUB_OWNER value: "<your-github-org>" # 组织名或用户名 - name: GITHUB_REPOSITORY value: "<your-repo>" # 可选,指定仓库(不填则为组织级) - name: GITHUB_TOKEN valueFrom: secretKeyRef: name: github-runner-secret key: GITHUB_TOKEN - name: RUNNER_LABELS value: "k8s,linux,x64" # 自定义标签 resources: requests: cpu: "1" memory: "2Gi" limits: cpu: "2" memory: "4Gi"
应用部署:
bashkubectl apply -f runner-deployment.yaml -n github-runner
通过 Kubernetes HPA(Horizontal Pod Autoscaler)实现基于工作流队列的自动扩缩容:
yaml# hpa.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: github-runner-hpa namespace: github-runner spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: github-runner minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: github_actions_queue_length selector: matchLabels: owner: "<your-github-org>" repository: "<your-repo>" # 可选 target: type: Value value: 2 # 每个 runner 处理的队列长度阈值
应用 HPA 配置:
bashkubectl apply -f hpa.yaml -n github-runner
| 环境变量名 | 说明 | 必填 | 默认值 |
|---|---|---|---|
GITHUB_OWNER | GitHub 组织名或用户名(如 my-org 或 my-user) | 是 | - |
GITHUB_REPOSITORY | 目标仓库名(如 my-repo,仅仓库级 runner 需填) | 否 | - |
GITHUB_TOKEN | GitHub 个人访问令牌(需 repo 或 admin:org 权限) | 是 | - |
RUNNER_NAME | Runner 名称(支持模板,如 runner-${POD_NAME}) | 否 | runner-${RANDOM} |
RUNNER_LABELS | 逗号分隔的 runner 标签(如 k8s,linux) | 否 | self-hosted |
RUNNER_WORK_DIR | 工作目录路径 | 否 | /home/runner/_work |
RUNNER_EPHEMERAL | 是否为一次性 runner(完成任务后销毁,true/false) | 否 | false |
HTTP_PROXY/HTTPS_PROXY | 网络代理地址(如 [***]) | 否 | - |
通过 Helm 部署时,可通过 values.yaml 自定义以下关键参数:
yaml# 基础配置 github: owner: "my-org" # 组织/用户名 repository: "my-repo" # 可选,仓库名 token: "" # 建议通过 --set-file 或 Secret 注入 # Runner 配置 runner: name: "runner-{{ .Release.Name }}-{{ .Pod.Name }}" # 名称模板 labels: "k8s,helm" # 标签 ephemeral: false # 一次性 runner workDir: "/home/runner/_work" # 工作目录 # 资源配置 resources: requests: cpu: "1" memory: "2Gi" limits: cpu: "2" memory: "4Gi" # 扩缩容配置 autoscaling: enabled: true # 启用 HPA minReplicas: 1 maxReplicas: 10 targetQueueLength: 2 # 队列长度阈值
bashhelm install github-runner self-hosted-k8s-runner/self-hosted-k8s-runner \ --namespace github-runner --create-namespace \ --set github.owner=my-org \ --set github.token=$(cat ./github-pat.txt) \ # 从文件读取 PAT --set runner.labels=k8s,org-runner \ --set autoscaling.enabled=true
yaml# 完整部署示例(仓库级 runner) apiVersion: v1 kind: Namespace metadata: name: github-runner --- apiVersion: v1 kind: Secret metadata: name: github-runner-secret namespace: github-runner type: Opaque data: GITHUB_TOKEN: <base64-encoded-pat> # 替换为实际 PAT 的 Base64 编码 --- apiVersion: apps/v1 kind: Deployment metadata: name: github-runner namespace: github-runner spec: replicas: 2 selector: matchLabels: app: github-runner template: metadata: labels: app: github-runner spec: containers: - name: runner image: machinelearningapps/self-hosted-k8s-runner:latest env: - name: GITHUB_OWNER value: "my-user" - name: GITHUB_REPOSITORY value: "my-repo" - name: GITHUB_TOKEN valueFrom: secretKeyRef: name: github-runner-secret key: GITHUB_TOKEN - name: RUNNER_LABELS value: "repo-runner,linux" - name: RUNNER_EPHEMERAL value: "true" resources: requests: cpu: "500m" memory: "1Gi" limits: cpu: "1" memory: "2Gi"
GITHUB_TOKEN 权限(需 repo 或 admin:org)、网络连通性(能否访问 api.github.com)。github_actions_queue_length 指标是否可用,调整 HPA 目标阈值。kubectl logs <pod-name>),检查工作流步骤与 runner 环境是否兼容。RUNNER_LABELS 匹配工作流标签,或自定义 runner 镜像预装依赖。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务