一、实验背景
前面我们已经完成了 Harbor(私有镜像仓库)、Kubernetes(K8s)、GitHub、ArgoCD(GitOps 自动发布工具)的部署与联动。
目前已经跑通的 CD(持续部署)链路如下:
GitHub
↓
ArgoCD(GitOps 自动发布工具)
↓
Kubernetes(K8s)
↓
Harbor(私有镜像仓库)
↓
Pod(容器组)运行
↓
浏览器访问成功
接下来要继续补齐 CI(持续集成)部分,也就是让 GitHub Actions 自动执行:
docker build(构建镜像)
↓
docker push(推送镜像到 Harbor)
↓
更新 Kubernetes YAML(资源配置文件)
↓
ArgoCD 自动同步发布
但是这里有一个关键问题:我的 Harbor 地址是内网地址:
172.16.11.142
GitHub 官方云端 Runner 无法直接访问这个内网 Harbor,所以需要在自己的服务器上安装 GitHub Actions Self-hosted Runner(自托管运行器)。
二、什么是 Self-hosted Runner?
Self-hosted Runner(自托管运行器)可以理解为:
把 GitHub Actions 的执行环境放到自己的服务器上
也就是说,GitHub 负责下发任务,而真正执行命令的是我的 k8s-master 节点。
这样它就可以访问内网资源,例如:
Harbor:172.16.11.142
Kubernetes API
本机 Docker
本机 kubectl
三、实验目标
本阶段目标:
1. 在 k8s-master 上安装 GitHub Actions Runner(自托管运行器)
2. 让 Runner 连接到 GitHub 仓库
3. 确认 Runner 状态为 Listening for Jobs
4. 为后续 CI 自动构建镜像做准备
本阶段完成后,GitHub Actions 就可以调用我的 k8s-master 执行 CI/CD 任务。
四、确认 Docker 环境可用
首先确认 k8s-master 上 Docker 正常运行:
docker ps
可以看到 Harbor(私有镜像仓库)相关容器都在运行:
nginx
harbor-jobservice
harbor-core
harbor-portal
registryctl
harbor-db
redis
registry
harbor-log
然后登录 Harbor:
docker login 172.16.11.142
输入 Harbor 用户名和密码后,成功显示:
Login Succeeded
这一步非常关键,说明当前服务器可以直接执行:
docker build
docker push 172.16.11.142/…
也就是具备 CI 自动构建和推送镜像的基础条件。
五、在 GitHub 创建 Self-hosted Runner
进入 GitHub 仓库:
YANYUE0721 / kgale-web-gitops
然后进入:
Settings
→ Actions
→ Runners
→ New self-hosted runner
系统选择:
Linux
架构选择:
x64
GitHub 会生成一组 Runner 安装命令。
六、创建 Runner 安装目录
在 k8s-master 上创建目录:
mkdir -p ~/actions-runner/actions-runner
cd ~/actions-runner/actions-runner
七、下载 GitHub Runner 安装包
GitHub 页面会提供类似下面的下载命令:
curl -o actions-runner-linux-x64-2.334.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.334.0/actions-runner-linux-x64-2.334.0.tar.gz
如果服务器访问 GitHub 较慢,可能会出现下载卡住或超时:
Failed to connect to github.com port 443
Timeout was reached
这种情况下可以使用两种方式解决:
1. 在 Windows 浏览器中下载 Runner 安装包
2. 通过 exHub / Xftp / scp 上传到服务器
上传到服务器后,确认文件存在:
ls -lh actions-runner-linux-x64-2.334.0.tar.gz
八、解压 Runner 安装包
tar xzf actions-runner-linux-x64-2.334.0.tar.gz
解压后可以看到:
config.sh
run.sh
svc.sh
bin
externals
这些文件就是 Runner(自托管运行器)的核心程序。
九、配置 Runner
回到 GitHub 的 Runner 创建页面,复制 Configure 区域里的命令,格式类似:
./config.sh –url https://github.com/YANYUE0721/kgale-web-gitops –token
注意:
这里的 token 是 Runner 注册 token
不是 GitHub Personal Access Token
两者区别:
GitHub PAT:
用于 git push / 认证 GitHub 仓库
Runner 注册 Token:
用于把服务器注册成 GitHub Actions Runner
如果把 PAT 当成 Runner token 使用,会出现类似报错:
404 Not Found
actions/runner-registration
如果把中文占位符复制进去,会出现:
Request headers must contain only ASCII characters
正确执行后会看到:
√ Connected to GitHub
√ Runner successfully added
√ Settings Saved.
配置过程中可以这样填写:
Runner group:直接回车,使用 Default
Runner name:可以使用默认 k8s-master
Labels:直接回车
Work folder:直接回车,使用 _work
十、启动 Runner
配置完成后执行:
./run.sh
成功后显示:
√ Connected to GitHub
Current runner version: ‘2.334.0’
Listening for Jobs
这说明 Runner(自托管运行器)已经连接 GitHub,正在等待 GitHub Actions 下发任务。
十一、当前完成状态
到这里,Self-hosted Runner(自托管运行器)已经成功运行。
当前 CI/CD 进度如下:
Harbor(私有镜像仓库):完成
Kubernetes(K8s):完成
GitHub 仓库:完成
ArgoCD(GitOps 自动发布):完成
Self-hosted Runner(自托管运行器):完成
现在还差最后一部分:
GitHub Actions Workflow(工作流)
也就是编写:
.github/workflows/build-and-deploy.yaml
让 GitHub Actions 自动执行:
拉取代码
↓
docker build(构建镜像)
↓
docker push(推送到 Harbor)
↓
修改 GitOps YAML(资源配置文件)
↓
git push 回 GitHub
↓
ArgoCD 自动同步
↓
Kubernetes 自动发布新版本
十二、实验总结
本次实验完成了 GitHub Actions Self-hosted Runner(自托管运行器)的安装与注册。
由于 Harbor(私有镜像仓库)位于内网:
172.16.11.142
所以 GitHub 官方云端 Runner 无法直接访问它。通过把 Runner 部署到 k8s-master,就可以让 CI 任务在内网执行,从而访问 Harbor、Docker、Kubernetes 等内部资源。
最终效果是:
GitHub 负责触发任务
k8s-master 负责执行任务
Harbor 负责保存镜像
ArgoCD 负责自动发布
Kubernetes 负责运行应用
这一步完成后,整套 CI/CD 已经完成了大约 80%。
下一步只需要编写 GitHub Actions Workflow(工作流),就可以实现真正的自动化流程:
提交代码
↓
自动构建镜像
↓
自动推送 Harbor
↓
自动更新 GitOps 配置
↓
ArgoCD 自动发布
↓
浏览器访问新版本
至此,GitHub Actions Self-hosted Runner 接入 K8s Master 实验完成。