CI/CD: K8S + Tekton + ArgoCD 深入浅出完全指南

🎯 一句话定位:这是一份让你从"不懂 CI/CD"到"能独立排查问题"的实战指南。

秒懂定位(30秒版)

这套系统解决什么问题

没有 CI/CD:
  改代码 → 手动打包 → 手动上传 → 手动部署 → 祈祷别出错 🙏

有了 CI/CD:
  改代码 → git push → 喝杯咖啡 ☕ → 部署完成 ✅

一句话精华

Tekton 负责"造房子"(构建镜像)
ArgoCD 负责"搬家"(部署到 K8s)
Git 是"设计图纸"(唯一真相来源)

适合谁看:需要使用这套 CI/CD 系统的开发者
看完能做什么:触发构建、查看日志、排查问题、回滚部署


一、架构总览(先看全貌)

整体流程图

┌─────────────────────────────────────────────────────────────────────────┐
│                     CI/CD 就像一条自动化流水线 🏭                         │
│                                                                         │
│  👨‍💻 开发者                                                              │
│     │                                                                   │
│     │ git push(把代码推上去)                                           │
│     ▼                                                                   │
│  📦 Git 仓库                                                            │
│     │                                                                   │
│     │ Webhook(自动通知)                                                │
│     ▼                                                                   │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │ 🔧 Tekton(CI 阶段)—— "建筑工人"                                 │   │
│  │                                                                   │   │
│  │   收到通知 → 拉代码 → 编译 → 打包成镜像 → 推到 Harbor             │   │
│  │                                                                   │   │
│  │   就像:收到图纸 → 买材料 → 施工 → 建好房子 → 交付               │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│     │                                                                   │
│     │ 镜像推送完成                                                       │
│     ▼                                                                   │
│  🏪 Harbor(镜像仓库)—— "仓库"                                         │
│     │                                                                   │
│     │ ArgoCD 监听 Git 仓库的 k8s 配置                                   │
│     ▼                                                                   │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │ 🚀 ArgoCD(CD 阶段)—— "搬家公司"                                 │   │
│  │                                                                   │   │
│  │   监听 Git → 发现配置变化 → 自动部署到 K8s                        │   │
│  │                                                                   │   │
│  │   就像:看设计图 → 发现要换家具 → 自动搬新家具进去               │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│     │                                                                   │
│     ▼                                                                   │
│  ✅ 服务上线,用户可以访问了!                                           │
└─────────────────────────────────────────────────────────────────────────┘

核心组件速查表

组件角色生活比喻访问地址
Git代码仓库设计图纸存放处gitee.com/<YOUR_USERNAME>/<YOUR_REPO>
TektonCI 引擎建筑工人-
Harbor镜像仓库建材仓库http://<MASTER_IP>:<HARBOR_PORT>
ArgoCDCD 引擎搬家公司http://<MASTER_IP>:<ARGOCD_PORT>
K8s运行环境房子(服务运行的地方)-

二、环境信息(记住这些地址)

集群节点

节点IP角色记忆口诀
k8s-master<MASTER_IP>控制节点“master 是老大”
k8s-worker1<WORKER1_IP>工作节点“worker1 干活”
k8s-worker2<WORKER2_IP>工作节点“worker2 也干活”

服务访问地址(建议收藏)

🏪 Harbor(镜像仓库)
   地址:http://<MASTER_IP>:<HARBOR_PORT>
   账号:admin
   密码:<HARBOR_PASSWORD>
   用途:查看构建好的镜像

🚀 ArgoCD(部署管理)
   地址:http://<MASTER_IP>:<ARGOCD_PORT>
   账号:admin
   密码:<ARGOCD_PASSWORD>
   用途:查看部署状态、手动同步

🔔 Tekton Webhook(CI 触发器)
   地址:http://<WORKER_IP>:<WEBHOOK_PORT>
   用途:Git 推送时自动触发构建

🌐 Web API(服务入口)
   地址:http://<MASTER_IP>:<WEB_PORT>
   用途:测试服务是否正常
   示例:curl http://<MASTER_IP>:<WEB_PORT>/api/user/1

三、日常操作指南(最常用的操作)

🚀 操作1:触发一次构建

场景:你改了代码,想部署到测试环境

方式1:推送代码(推荐,全自动)

# 在你的代码目录
cd /path/to/your/repo

# 正常的 Git 操作
git add .
git commit -m "feat: 你的修改说明"
git push

# 然后...就没有然后了!
# Tekton 会自动构建,ArgoCD 会自动部署
# 你可以去喝杯咖啡 ☕

方式2:手动触发(调试用)

# 如果 Webhook 没触发,可以手动创建 PipelineRun
ssh root@<MASTER_IP> 'kubectl create -f /path/to/pipelinerun-v2.yaml'

👀 操作2:查看构建状态

场景:想知道构建到哪一步了

# 查看最近的 PipelineRun
ssh root@<MASTER_IP> 'kubectl get pipelineruns -n tekton-pipelines --sort-by=.metadata.creationTimestamp | tail -5'

# 输出示例:
# NAME                      SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
# service-test-auto-abc123  True        Succeeded   10m         5m
# service-test-auto-def456  Unknown     Running     2m          <none>

# 状态说明:
# True + Succeeded = ✅ 构建成功
# Unknown + Running = 🔄 正在构建
# False + Failed = ❌ 构建失败

查看详细进度

# 查看某个 PipelineRun 的所有 TaskRun
ssh root@<MASTER_IP> 'kubectl get taskruns -n tekton-pipelines | grep service-test-auto-abc123'

# 输出示例:
# service-test-auto-abc123-build-user      True    Succeeded   10m
# service-test-auto-abc123-build-product   True    Succeeded   10m
# service-test-auto-abc123-build-trade     True    Succeeded   8m
# service-test-auto-abc123-build-web       True    Succeeded   9m

📋 操作3:查看构建日志

场景:构建失败了,想看看哪里出错

# 第一步:找到失败的 TaskRun
ssh root@<MASTER_IP> 'kubectl get taskruns -n tekton-pipelines | grep False'

# 第二步:查看日志
# 格式:kubectl logs <pod-name> -n tekton-pipelines -c step-<step-name>

# 查看克隆代码的日志
ssh root@<MASTER_IP> 'kubectl logs <pod-name> -n tekton-pipelines -c step-clone'

# 查看构建镜像的日志
ssh root@<MASTER_IP> 'kubectl logs <pod-name> -n tekton-pipelines -c step-build-and-push'

🔄 操作4:查看部署状态

场景:想知道服务有没有部署成功

# 查看 ArgoCD Application 状态
ssh root@<MASTER_IP> 'kubectl get applications -n argocd'

# 输出示例:
# NAME           SYNC STATUS   HEALTH STATUS
# service-test   Synced        Healthy

# 状态说明:
# Synced + Healthy = ✅ 部署成功,服务正常
# Synced + Progressing = 🔄 正在部署
# OutOfSync = ⚠️ Git 和集群不一致,需要同步
# Degraded = ❌ 服务有问题

# 查看具体的 Pod 状态
ssh root@<MASTER_IP> 'kubectl get pods -n service-test'

🔙 操作5:回滚部署

场景:新版本有 bug,需要回滚

方式1:Git revert(推荐)

cd /path/to/your/repo

# 回滚到上一个版本
git revert HEAD
git push

# ArgoCD 会自动同步回滚后的配置

方式2:K8s rollout(临时)

# 回滚某个服务
ssh root@<MASTER_IP> 'kubectl rollout undo deployment/user-service -n service-test'

# 注意:如果 ArgoCD 开启了 selfHeal,会自动改回 Git 配置
# 所以这只是临时方案,最终还是要改 Git

🔧 操作6:手动触发 ArgoCD 同步

场景:不想等 3 分钟轮询,想立即同步

ssh root@<MASTER_IP> 'kubectl annotate application service-test -n argocd argocd.argoproj.io/refresh=hard --overwrite'

或者通过 UI:

  1. 访问 http://<MASTER_IP>:<ARGOCD_PORT>
  2. 登录(admin/<ARGOCD_PASSWORD>)
  3. 点击 service-test 应用
  4. 点击 “Sync” 按钮

四、故障排查指南(遇到问题看这里)

🔍 排查思路(像侦探一样)

问题发生了!别慌,按这个顺序排查:

1️⃣ 构建有没有触发?
   └── 看 PipelineRun 有没有创建

2️⃣ 构建成功了吗?
   └── 看 TaskRun 状态

3️⃣ 镜像推送了吗?
   └── 去 Harbor 看看

4️⃣ ArgoCD 同步了吗?
   └── 看 Application 状态

5️⃣ Pod 启动了吗?
   └── 看 Pod 状态和日志

问题1:推送代码后没有触发构建

症状:git push 了,但是没有新的 PipelineRun

排查步骤

# 1. 检查 EventListener 是否在运行
ssh root@<MASTER_IP> 'kubectl get pods -n tekton-pipelines | grep listener'
# 应该看到 el-gitee-listener-xxx Running

# 2. 检查 EventListener 日志
ssh root@<MASTER_IP> 'kubectl logs -n tekton-pipelines -l eventlistener=gitee-listener --tail=20'

# 3. 检查 Git Webhook 配置
# 访问你的 Git 仓库 Webhook 设置页面
# 确认 URL 是 http://<WORKER_IP>:<WEBHOOK_PORT>

常见原因

原因解决方案
EventListener Pod 挂了重启 Pod
Webhook URL 配置错误修改为正确的 URL
网络不通检查防火墙,确保端口开放

问题2:构建失败 - TaskRun Failed

症状:PipelineRun 显示 Failed

排查步骤

# 1. 找到失败的 TaskRun
ssh root@<MASTER_IP> 'kubectl get taskruns -n tekton-pipelines | grep False'

# 2. 查看失败原因
ssh root@<MASTER_IP> 'kubectl describe taskrun <taskrun-name> -n tekton-pipelines | tail -30'

# 3. 查看具体日志
ssh root@<MASTER_IP> 'kubectl logs <pod-name> -n tekton-pipelines --all-containers'

常见原因及解决

错误信息原因解决方案
ImagePullBackOff镜像拉取失败检查 Harbor 是否正常,镜像是否存在
TaskRunTimeout构建超时Go 编译慢,已设置 2h 超时,等待即可
error resolving dockerfile找不到 Dockerfile检查 Dockerfile 路径是否正确
502 Bad GatewayHarbor 服务异常检查 Harbor Pod 状态

问题3:镜像推送失败 - 401 Unauthorized

症状:构建日志显示 401 Unauthorized

原因:Harbor 认证失败

解决

# 检查 Harbor Secret 是否存在
ssh root@<MASTER_IP> 'kubectl get secret harbor-kaniko-secret -n tekton-pipelines'

# 如果不存在,重新创建
# 参考 02_tekton/pipelines/harbor-secret-v2.yaml

问题4:ArgoCD 显示 OutOfSync

症状:Application 状态是 OutOfSync

原因:Git 仓库配置和集群状态不一致

解决

# 手动触发同步
ssh root@<MASTER_IP> 'kubectl annotate application service-test -n argocd argocd.argoproj.io/refresh=hard --overwrite'

问题5:Pod 一直 CrashLoopBackOff

症状:Pod 不断重启

排查步骤

# 1. 查看 Pod 日志
ssh root@<MASTER_IP> 'kubectl logs <pod-name> -n service-test --tail=50'

# 2. 查看 Pod 事件
ssh root@<MASTER_IP> 'kubectl describe pod <pod-name> -n service-test | tail -20'

常见原因

原因解决方案
健康检查失败检查 livenessProbe 配置
配置错误检查 ConfigMap
依赖服务不可用检查 etcd/数据库连接

问题6:服务无法访问

症状:curl http://<MASTER_IP>:<WEB_PORT>/api/user/1 失败

排查步骤

# 1. 检查 Pod 是否运行
ssh root@<MASTER_IP> 'kubectl get pods -n service-test'

# 2. 检查 Service 是否存在
ssh root@<MASTER_IP> 'kubectl get svc -n service-test'

# 3. 检查 Pod 日志
ssh root@<MASTER_IP> 'kubectl logs -n service-test -l app=web-service --tail=30'

五、深入理解(想知道为什么)

CI 部分:Tekton 是怎么工作的?

生活比喻:Tekton 就像一个自动化的建筑工地

┌─────────────────────────────────────────────────────────────────────────┐
│                     Tekton 工作原理(建筑工地比喻)                       │
│                                                                         │
│  📋 Task(任务)= 一道工序                                               │
│     比如"砌墙"这道工序,包含:                                           │
│     - Step 1: 准备砖头(git clone)                                     │
│     - Step 2: 砌墙(docker build)                                      │
│     - Step 3: 刷漆(docker push)                                       │
│                                                                         │
│  🏗️ Pipeline(流水线)= 整个建筑项目                                    │
│     包含多道工序,可以同时进行:                                         │
│     - 工序1: 建卧室(build-user)                                       │
│     - 工序2: 建客厅(build-product)    ← 这些可以同时进行!            │
│     - 工序3: 建厨房(build-trade)                                      │
│     - 工序4: 建卫生间(build-web)                                      │
│                                                                         │
│  🚀 PipelineRun(运行实例)= 今天的施工                                  │
│     "今天开始建张三家的房子"                                             │
│     每次 git push 都会创建一个新的 PipelineRun                           │
└─────────────────────────────────────────────────────────────────────────┘

Triggers 三剑客

Git 推送代码
    │
    ▼
EventListener(门卫)
    │  "有人来了!"
    ▼
TriggerBinding(翻译官)
    │  "他说要建 abc123 版本的房子"
    ▼
TriggerTemplate(包工头)
    │  "好的,我来安排施工"
    ▼
PipelineRun(开始施工)

CD 部分:ArgoCD 是怎么工作的?

生活比喻:ArgoCD 就像一个强迫症管家

┌─────────────────────────────────────────────────────────────────────────┐
│                     ArgoCD 工作原理(强迫症管家比喻)                     │
│                                                                         │
│  📖 Git 仓库 = 家居设计图                                                │
│     "客厅要放红色沙发,卧室要放蓝色床"                                    │
│                                                                         │
│  🏠 K8s 集群 = 实际的房子                                                │
│     "现在客厅放的是绿色沙发"                                             │
│                                                                         │
│  👨‍🔧 ArgoCD = 强迫症管家                                                 │
│     每 3 分钟检查一次:                                                  │
│     "设计图说要红色沙发,但现在是绿色的!"                                │
│     "不行!必须换成红色的!"(自动同步)                                  │
│                                                                         │
│  🔧 selfHeal = 自动纠正                                                  │
│     有人偷偷把沙发换成黄色的                                             │
│     管家发现后:"不对!设计图说是红色!换回来!"                          │
│                                                                         │
│  🗑️ prune = 清理多余                                                    │
│     设计图上删掉了茶几                                                   │
│     管家:"设计图上没有茶几了,搬走!"                                    │
└─────────────────────────────────────────────────────────────────────────┘

CI 和 CD 的分工

┌─────────────────────────────────────────────────────────────────────────┐
│                        CI 和 CD 的分工                                   │
│                                                                         │
│  【Tekton 的职责】CI = Continuous Integration(持续集成)                │
│                                                                         │
│     代码 ──────────────────────────────────────▶ 镜像                   │
│           │                                                             │
│           ├── 拉取代码                                                  │
│           ├── 编译代码                                                  │
│           ├── 运行测试                                                  │
│           ├── 构建镜像                                                  │
│           └── 推送到 Harbor                                             │
│                                                                         │
│  ═══════════════════════════════════════════════════════════════════════│
│                                                                         │
│  【ArgoCD 的职责】CD = Continuous Deployment(持续部署)                 │
│                                                                         │
│     Git 配置 ─────────────────────────────────▶ K8s 集群                │
│              │                                                          │
│              ├── 监听 Git 仓库                                          │
│              ├── 比较配置差异                                           │
│              ├── 同步到集群                                             │
│              └── 监控健康状态                                           │
│                                                                         │
│  【它们的连接点】                                                        │
│                                                                         │
│     Tekton 构建完镜像 → 更新 Git 仓库中的镜像 tag → ArgoCD 检测到变化    │
│                        → 自动部署新镜像                                  │
└─────────────────────────────────────────────────────────────────────────┘

六、配置文件说明(想改配置看这里)

目录结构

devops_platform/
├── 02_tekton/
│   ├── pipelines/
│   │   ├── build-service-task-v2.yaml    # 🔧 Task:怎么构建一个服务
│   │   ├── pipeline-simple-v2.yaml       # 🔗 Pipeline:构建哪些服务
│   │   ├── pipelinerun-v2.yaml           # 🚀 手动触发模板
│   │   └── harbor-secret-v2.yaml         # 🔐 Harbor 认证
│   └── triggers/
│       ├── trigger-template.yaml         # 📋 自动触发时创建什么
│       ├── trigger-binding.yaml          # 🔍 从 Webhook 提取什么参数
│       ├── event-listener.yaml           # 👂 监听 Webhook
│       └── event-listener-service.yaml   # 🌐 暴露给外部访问
│
├── 04_argocd/
│   └── applications/
│       └── service-test-app.yaml         # 📦 ArgoCD 应用配置
│
└── k8s/                                   # K8s 部署配置(ArgoCD 监听这里)
    ├── configmaps.yaml
    ├── user/deployment.yaml
    ├── product/deployment.yaml
    ├── trade/deployment.yaml
    └── web/deployment.yaml

关键配置解读

1. build-service-task-v2.yaml(构建任务)
# 这个文件定义了"怎么构建一个服务"
steps:
- name: clone                    # 步骤1:拉代码
  image: alpine/git
  
- name: build-and-push           # 步骤2:构建并推送
  image: kaniko
  args:
  - --registry-mirror=<HARBOR_ADDRESS>  # 🔑 关键:用 Harbor 做镜像代理
  - --insecure-pull              # 🔑 关键:允许 HTTP 拉取
  - --single-snapshot            # 🔑 关键:加速构建
  timeout: 2h                    # 🔑 关键:Go 编译慢,给足时间

什么时候需要改这个文件?

  • 想修改构建参数
  • 想添加新的构建步骤(如运行测试)
  • 构建超时需要调整
2. pipeline-simple-v2.yaml(流水线)
# 这个文件定义了"构建哪些服务"
tasks:
- name: build-user               # 构建 user-service
  params:
  - name: dockerfile
    value: dockerfiles/Dockerfile.user
    
- name: build-product            # 构建 product-service(并行)
- name: build-trade              # 构建 trade-service(并行)
- name: build-web                # 构建 web-service(并行)

什么时候需要改这个文件?

  • 新增了一个微服务
  • 想改变构建顺序(串行/并行)
  • 想修改某个服务的 Dockerfile 路径
3. service-test-app.yaml(ArgoCD 应用)
# 这个文件定义了"ArgoCD 监听什么、部署到哪里"
source:
  repoURL: https://gitee.com/<YOUR_USERNAME>/<YOUR_REPO>.git
  path: k8s                      # 🔑 关键:监听 k8s 目录
  directory:
    recurse: true                # 🔑 关键:递归扫描子目录

destination:
  namespace: service-test        # 🔑 关键:部署到哪个 namespace

syncPolicy:
  automated:
    prune: true                  # 🔑 关键:删除 Git 中没有的资源
    selfHeal: true               # 🔑 关键:自动修复手动修改

什么时候需要改这个文件?

  • 想监听不同的 Git 仓库或分支
  • 想部署到不同的 namespace
  • 想关闭自动同步(改为手动)

七、命令速查表(复制粘贴即用)

CI 相关(Tekton)

# 查看 Tekton 组件状态
ssh root@<MASTER_IP> 'kubectl get pods -n tekton-pipelines'

# 查看最近的 PipelineRun
ssh root@<MASTER_IP> 'kubectl get pipelineruns -n tekton-pipelines --sort-by=.metadata.creationTimestamp | tail -5'

# 查看某个 PipelineRun 的 TaskRun
ssh root@<MASTER_IP> 'kubectl get taskruns -n tekton-pipelines | grep <pipelinerun-name>'

# 查看构建日志
ssh root@<MASTER_IP> 'kubectl logs <pod-name> -n tekton-pipelines -c step-build-and-push --tail=100'

# 查看 EventListener 日志
ssh root@<MASTER_IP> 'kubectl logs -n tekton-pipelines -l eventlistener=gitee-listener --tail=50'

# 删除所有 PipelineRun(清理)
ssh root@<MASTER_IP> 'kubectl delete pipelineruns --all -n tekton-pipelines'

CD 相关(ArgoCD)

# 查看 ArgoCD 组件状态
ssh root@<MASTER_IP> 'kubectl get pods -n argocd'

# 查看 Application 状态
ssh root@<MASTER_IP> 'kubectl get applications -n argocd'

# 查看 Application 详情
ssh root@<MASTER_IP> 'kubectl describe application service-test -n argocd'

# 手动触发同步
ssh root@<MASTER_IP> 'kubectl annotate application service-test -n argocd argocd.argoproj.io/refresh=hard --overwrite'

# 查看 ArgoCD 日志
ssh root@<MASTER_IP> 'kubectl logs -n argocd -l app.kubernetes.io/name=argocd-server --tail=50'

服务相关

# 查看服务 Pod 状态
ssh root@<MASTER_IP> 'kubectl get pods -n service-test'

# 查看服务日志
ssh root@<MASTER_IP> 'kubectl logs -n service-test -l app=user-service --tail=30'
ssh root@<MASTER_IP> 'kubectl logs -n service-test -l app=web-service --tail=30'

# 重启服务
ssh root@<MASTER_IP> 'kubectl rollout restart deployment -n service-test'

# 回滚服务
ssh root@<MASTER_IP> 'kubectl rollout undo deployment/user-service -n service-test'

# 测试 API
curl http://<MASTER_IP>:<WEB_PORT>/api/user/1

Harbor 相关

# 检查 Harbor 健康状态
curl -s -u admin:<HARBOR_PASSWORD> http://<MASTER_IP>:<HARBOR_PORT>/api/v2.0/health

# 查看 service-test 项目的镜像
curl -s -u admin:<HARBOR_PASSWORD> http://<MASTER_IP>:<HARBOR_PORT>/api/v2.0/projects/service-test/repositories | python3 -m json.tool

# 查看 Harbor Pod 状态
ssh root@<MASTER_IP> 'kubectl get pods -n devops'

八、金句总结(记住这些就够了)

📌 CI/CD 的本质:
   "代码推送后,自动构建、自动部署,人只需要写代码"

📌 Tekton 的角色:
   "建筑工人 —— 把代码变成镜像"

📌 ArgoCD 的角色:
   "强迫症管家 —— 让集群状态和 Git 配置保持一致"

📌 排查问题的顺序:
   "触发了吗?→ 构建成功了吗?→ 镜像推送了吗?→ 同步了吗?→ Pod 启动了吗?"

📌 最重要的一句话:
   "Git 仓库是唯一真相来源,所有修改都要通过 Git"

九、延伸学习

想深入了解 Tekton

想深入了解 ArgoCD

想了解遇到的问题

  • 📖 问题排查指南:TROUBLESHOOTING.md

十、版本信息

项目信息
文档版本v2.0
更新日期2026-01-02
适用项目service-test 微服务
Tekton 版本Pipeline v1.6.0, Triggers v0.34.0
ArgoCD 版本v2.9.3
作者DevOps Team

“好的 CI/CD 系统,就像一个靠谱的助手:你只管写代码,剩下的交给它。” 🚀

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐