这篇文档讲什么
Homelab 里跑 enx-api 时,从本机一条 Taskfile 命令到 Pod 滚动更新,中间经过 Tekton 构建镜像、Nexus 存镜像、GitOps 改 manifest、Argo CD 同步集群。本文按实际配置把这条链路拆开说明。
Tekton、Kaniko、Argo CD 各自的概念见 Tekton 与 Kaniko 和 Argo CD 与 GitOps 持续部署;这里只写 enx-api 这条线的落地细节。
涉及的两个仓库
| 仓库 | 作用 |
|---|---|
enx |
应用源码、enx-api/Containerfile、根目录 Taskfile |
w10n-config(私有仓库) |
K8s manifest、Tekton Pipeline/PipelineRun、Argo CD Application |
CI 在集群里 clone 的是 GitHub 上的 enx,不是本机工作区;CD 改的是 GitHub 上的 w10n-config(私有仓库,不对外公开),再由 Argo CD 拉到集群。文中出现的 manifest、Pipeline 路径均指该仓库内的 infra/homelab/k8s/ 目录。
整体流程
flowchart LR A[本机 task tekton:build:api] --> B[创建 PipelineRun] B --> C[git-clone-ssh
拉 enx 源码] C --> D[kaniko-build
构建并推送镜像] D --> E[update-gitops-repo
改 deployment.yaml] E --> F[Argo CD 自动 sync] F --> G[enx namespace Pod 更新]
一次完整发布可以概括成四步:
- 开发者把代码 push 到 GitHub(Tekton 只认远程仓库)。
- 本机执行
task tekton:build:api(或 w10n-config 里的task tekton-build-enx-api)——Taskfile 在背后跑kubectl create -f pipelinerun-enx-api.yaml,在集群里创建一个 PipelineRun;Tekton 控制器随后调度 Pipeline 执行。 - Pipeline 末尾把
w10n-config里 Deployment 的镜像 tag 改成本次 commit SHA 并 push。 - Argo CD 发现 Git 变更,把
enxnamespace 里的 Deployment 同步到新镜像。
第 2 步是人工触发:push 不会自动开构建。enx-api 发布频率不高,目前没接 GitHub Webhook;以后若要 push 即构建,可以用 Tekton Triggers(EventListener + TriggerBinding)在 enx 仓库收到 push 时自动 kubectl create 等价的 PipelineRun。
本机怎么触发
在 enx 仓库
根目录 Taskfile 定义了 tekton:build:api:
tekton:build:api:
desc: "Trigger enx-api Tekton build and GitOps deploy via ArgoCD"
cmds:
- kubectl create -f ../w10n-config/infra/homelab/k8s/tekton/pipelinerun-enx-api.yaml
前提:enx 与 w10n-config 在同一父目录(例如 ~/workspace/projects/ 下并列),且本机 kubectl 已指向 homelab 集群。
cd enx
git push # 先 push,再触发
task tekton:build:api
在 w10n-config 仓库
infra/homelab/Taskfile.yml 里也有等价任务 tekton-build-enx-api,直接引用同一份 PipelineRun YAML。
和本地编译的区别
| 命令 | 做什么 | 是否部署 |
|---|---|---|
task build:api |
在 enx-api/ 里 go build 出二进制 |
否 |
task tekton:build:api |
在集群里构建容器镜像并走 GitOps 部署 | 是 |
task tekton:build:api 只执行 kubectl create,不会等待 Pipeline 跑完。要看进度需要另开终端查日志(下文「查看构建进度」)。
为什么是手动触发
当前 homelab 里 enx-api 部署不频繁,刻意保持「push 代码 → 人工决定是否构建」两步分离:Taskfile 负责创建 PipelineRun,没有 GitHub Webhook / Tekton EventListener。集群侧 Pipeline、Task、Argo CD Application 已就绪,后续若要自动化,只需补 Triggers 层,不必改现有 Pipeline 定义。
PipelineRun 里配置了什么
文件:w10n-config/infra/homelab/k8s/tekton/pipelinerun-enx-api.yaml
要点:
generateName: build-enx-api-:每次 create 生成新名字,如build-enx-api-7mpb4。git-revision: email-registration:构建 checkout 的 revision(手动触发时写死在 YAML 里)。git-clone-ssh的revision参数支持分支名、tag 名或 commit SHA,不限于分支;例如写v1.2.0或完整 SHA 同样可以。- 若以后接 GitHub Webhook / Tekton Triggers(例如 push tag 时构建),
git-revision应由 TriggerBinding 从事件里取(如refs/tags/v1.2.0→v1.2.0),不必在静态pipelinerun-enx-api.yaml里写死分支;那份 YAML 可只作 Pipeline 模板,或改由 TriggerTemplate 动态生成 PipelineRun。 image-name: docker-hosted.wiloon.com/enx-api:镜像名;tag 由 clone 得到的 commit SHA 决定,不是latest。workspaces:源码与 GitOps 各一块 Longhorn PVC;SSH 用 Secretgit-ssh-key;推私有仓库用nexus-docker-cred。nodeSelector: k8s-71:构建 Pod 固定在 k8s-71(与 Nexus 同节点,拉镜像路径短)。serviceAccountName: tekton-bot:Tekton 在集群内执行所需的 RBAC 身份。
Pipeline 三个 Task
Pipeline 定义在 pipeline-build-enx-api.yaml,按顺序执行:
1. fetch-source(git-clone-ssh)
- 从
git@github.com:wiloon/enx.gitclone 到 workspace。 - checkout
git-revision参数指定的 revision(分支、tag 或 commit SHA)。 - 输出
results.commit(完整 commit SHA),供后续步骤当镜像 tag。
2. build-image(kaniko-build)
- 读取
enx-api/Containerfile,context 为 clone 下来的./repo。 - 构建目标:
docker-hosted.wiloon.com/enx-api:<commit-sha>。 - Kaniko 把镜像推到 Nexus hosted 仓库(
docker-hosted.wiloon.com)。
Kaniko Task(task-kaniko-build-auth.yaml)默认带上:
- --insecure
- --skip-tls-verify
- --registry-mirror=docker-registry.wiloon.com
含义:
- 推产物:
docker-hosted.wiloon.com(hosted,存 enx-api 镜像)。 - 拉基座(
FROM golang、FROM alpine等):经docker-registry.wiloon.com走 Nexus 对 Docker Hub 的代理,而不是 Kaniko 直连index.docker.io。
节点 containerd 拉 Pod 镜像时也配置了 docker.io → Nexus,但 Kaniko 构建阶段用的是自己的 registry 客户端,必须单独配 --registry-mirror 才会走 Nexus。
3. update-gitops(update-gitops-repo)
- clone
git@github.com:wiloon/w10n-config.git,checkoutmain。 - 用
sed更新infra/homelab/k8s/enx/deployment.yaml里enx-api那一行的image:。 - commit 并 push,提交信息类似
Update image to docker-hosted.wiloon.com/enx-api:<sha>。
镜像 tag 与 Git commit 一致,便于从 Deployment 反查对应源码版本。
Argo CD 如何完成部署
Application 定义在 w10n-config/infra/homelab/k8s/argocd/application-enx.yaml:
- source:
w10n-config的infra/homelab/k8s/enx路径,targetRevision: main。 - destination:集群内
enxnamespace。 - syncPolicy.automated:开启自动同步与 selfHeal;Git 里 manifest 一变,Argo CD 就会 apply。
Deployment(节选):
spec:
template:
spec:
imagePullSecrets:
- name: nexus-docker-cred
containers:
- name: enx-api
image: docker-hosted.wiloon.com/enx-api:<commit-sha>
imagePullPolicy: Always
update-gitops 只改 image: 字段;PVC、Ingress、环境变量等仍由 Git 里其它 YAML 管理。Argo CD sync 后,kubelet 从 Nexus 拉新 tag 的镜像,按 Deployment 策略替换 Pod(enx-api 使用 Recreate 策略)。
对外访问:https://enx-lab.wiloon.com(Kong Ingress)。
查看构建进度
在 w10n-config/infra/homelab 下:
task tekton-logs # 跟随最新 PipelineRun
task tekton-list # 列出历史 PipelineRun
或直接:
kubectl get pipelinerun -n tekton-pipelines -l tekton.dev/pipeline=build-enx-api --sort-by=.metadata.creationTimestamp
kubectl logs -n tekton-pipelines -l tekton.dev/pipelineRun=build-enx-api-xxxxx -f
集群里若部署了 Tekton Dashboard,也可通过 tekton.wiloon.com 看各 Step 日志。
部署结果怎么验证
# Argo CD 应用状态
kubectl get application enx -n argocd
# 工作负载
kubectl get pods -n enx -l app=enx-api
# 接口
curl https://enx-lab.wiloon.com/ping
curl https://enx-lab.wiloon.com/version
/version 返回里若含 Git commit 字段,可与 Pipeline 使用的 SHA 对照。
常见问题
本地改了代码,触发构建后集群没变化
Tekton 只 clone GitHub。未 commit / 未 push 的改动不会进镜像。先 git push,再 task tekton:build:api。
构建卡在 build-image 很久
golang 基座镜像体积大;首次经 Nexus 代理拉取仍可能较慢,后续会命中 Nexus 缓存。确认 Kaniko 日志里出现 from registry mirror docker-registry.wiloon.com 而不是长时间停在 index.docker.io。
想构建 main、某个 tag 或其他 revision
手动触发时:改 pipelinerun-enx-api.yaml 的 git-revision(分支名、v1.0.0 这类 tag、或 commit SHA 均可),或 create PipelineRun 时用 --dry-run=client -o yaml 生成临时 manifest 再 apply。接 Webhook 后:由 Trigger 按事件传入 revision,一般不再维护静态 YAML 里的固定分支名。
Taskfile 路径报错
enx 的 task 依赖 ../w10n-config/...;两个仓库需并列放置,或改为本机绝对路径 / 环境变量。
相关文件索引
| 文件 | 说明 |
|---|---|
enx/Taskfile.yml |
tekton:build:api 入口 |
w10n-config/infra/homelab/Taskfile.yml |
tekton-build-enx-api、tekton-logs |
w10n-config/infra/homelab/k8s/tekton/pipelinerun-enx-api.yaml |
触发参数与 workspace |
w10n-config/infra/homelab/k8s/tekton/pipeline-build-enx-api.yaml |
三阶段 Pipeline |
w10n-config/infra/homelab/k8s/tekton/task-kaniko-build-auth.yaml |
Kaniko 构建与 Nexus mirror |
w10n-config/infra/homelab/k8s/tekton/task-update-gitops.yaml |
改 GitOps 仓库镜像 tag |
w10n-config/infra/homelab/k8s/argocd/application-enx.yaml |
Argo CD Application |
w10n-config/infra/homelab/k8s/enx/deployment.yaml |
enx-api Deployment |
enx/enx-api/Containerfile |
多阶段构建定义 |
小结
enx-api 在 homelab 的发布路径是 Taskfile → PipelineRun → Tekton(clone / Kaniko / 改 Git)→ Argo CD → K8s,而不是本机 docker build 或 kubectl set image。习惯这条链之后,改代码、push、触发 task、看 Tekton 日志、用 curl 验证,就是日常发布节奏。