1. 先说清楚这个选型问题到底在回答什么这两年我身边的运维、DevOps、以及不少后端同学都会拿着同一个问题来找我CI/CD 到底该选哪个工具。题目里的三个名字——Argo CD、Tekton、Arbess——其实代表了三种完全不同的解题思路。先说一个我踩过多次的坑很多人拿着 Argo CD 和 Tekton 摆在同一个维度上去对比然后问“哪个更好”。这个问法从一开始就偏了。Argo CD 的核心战场是“持续交付”也就是代码构建完、镜像打完之后怎么把应用安全、可控、可回滚地部署到 Kubernetes 集群里而 Tekton 的核心战场是“持续集成”是代码提交之后怎么把编译、测试、打包这些任务编排成一条标准化流水线。它们不是竞争关系而是上下游关系、是互补关系。至于 Arbess——说实话在社区里它的名气还没有前两者大但它代表了一类新兴的尝试即“把 CI 和 CD 当成一整条链路来做”目标是用一个平台覆盖从代码提交到生产部署的全过程。这类工具的特点是想帮你省掉组合集成的复杂度但代价是生态成熟度和灵活性通常不如专注型工具。我写这篇文章不是要给你一个“选 A 不选 B”的简单答案而是把三个工具剥开来看它们的核心原理是什么适合解决什么问题企业落地时有什么隐藏成本以及我自己在实际项目中踩过的坑和总结出的判断标准。如果你正在给团队做技术选型看完之后至少能知道自己该用什么方式去验证而不是在网上翻三天教程还是拿不定主意。2. 三个工具的定位拆解不是一个赛道的选手2.1 Argo CDGitOps 模式下的持续交付事实标准Argo CD 的目标非常纯粹以 Git 仓库作为应用最终状态的唯一真相来源集群中运行的实际情况如果和 Git 里声明的状态不一致就以 Git 里的声明为准进行同步。这句话展开来说Argo CD 做的事情是监听一个或多个 Git 仓库读取里面声明的 Kubernetes 资源清单YAML/Helm/Kustomize。把清单里的内容渲染成最终的 Kubernetes 资源对象。与集群中的实际资源进行比较找出差异。根据你设定的同步策略手动、自动、自动 自愈把这些差异纠正过来。这套模式被称为 Pull 模式意思是 Argo CD 以巡检、拉取的方式主动去保证集群状态收敛于期望状态而不是依赖某个外部触发器把部署请求推给它。Argo CD 的架构里有几个核心组件API Server对外提供 gRPC/REST 接口也是 Web UI 的后端几乎所有交互入口都走它。Application Controller不断比对 Git 声明状态和集群实际运行状态并执行同步操作。Repo Server负责拉取 Git 仓库、渲染 Helm/Kustomize 模板然后把结果交给 Controller。Redis用作缓存存储仓库获取结果和比较结果降低 Git 仓库访问频率。在我的实际体验里Argo CD 最让人安心的一点是“一切可解释”。集群里每一个 Application 都能看到当前状态、期望状态、同步时间、差异明细出了问题可以直接从 UI 上定位到是哪个资源、哪个字段不同。这对企业里排障、审计、交接都非常友好。2.2 Tekton把 CI 流水线变成真正的云原生编排Tekton 是 CNCF 旗下的项目前身是 Knative 里的 Build 组件后来独立出来专门做 Kubernetes 原生的 CI/CD 流水线框架。我个人的判断是Tekton 最核心的价值在于把“流水线”这一概念彻底落成了 Kubernetes 的声明式资源对象。在 Tekton 里你会频繁接触到几个概念Task一个流水线中的独立单元内部包含一个或多个 Step每个 Step 对应一个容器镜像的执行。Pipeline由多个 Task 按顺序或依赖关系编排而成的完整流水线。PipelineRun某一次实际运行的实例是 Pipeline 的具现化。TaskRunTask 的某一次运行实例。Workspaces文件存储共享机制用于在 Task 与 Task 之间传递代码、缓存、配置等。Tekton 的典型使用场景是代码推送到 Git 后触发一个 PipelineRun里面依次执行 check out 代码、跑单元测试、构建镜像、推送镜像、更新部署清单。每一步都在 Kubernetes 的 Pod 里以独立容器运行日志天然采集资源调度天然纳入集群体系。我更喜欢 Tekton 的一点是它的“无主节点”设计。传统 CI 工具比如 Jenkins 需要有一个或多个 Master 节点来调度还要维护插件体系、节点规模、数据备份。Tekton 没有中心服务你只需要准备一个或几个 Namespace 来跑任务所有任务都作为 Pod 存在于集群中。扩缩容、资源隔离都是 Kubernetes 自己管的不需要你再操心一套独立的调度系统。2.3 Arbess想用“一体化平台”解决问题的后来者有关 Arbess可能很多读者第一次听到这个名字。它在社区的声量确实不如 Argo CD 和 Tekton但因为它试图解决的问题——把 CI 和 CD 作为一个整体流水线来交付——和很多团队苦于“组合工具太复杂”的痛点正好对上所以开始有一批关注度。从产品形态上看Arbess 属于那种“新一代一体化”思路的 Kubernetes 原生 CI/CD 工具主打的是用一套平台完成代码构建、镜像推送、应用部署、状态同步的全链路。你可以把它理解为它想同时做 Tekton 的集成编排又做 Argo CD 的 GitOps 同步然后把两者揉在一个统一模型里。这种设计的直接好处是学习成本低不需要理解两套资源模型、两套权限体系、两套 UI一个项目、一个仓库、一条链路走到底。对于中小规模团队来说这种“少操心”的诱惑力确实很大。但它目前面临的问题也比较现实相比 Argo CD 这种多年沉淀的工具Arbess 的插件生态、社区案例、疑难问题沉淀都还薄一些。真到生产环境里遇到一个冷门问题去搜解决方案大概率搜到的还是 Argo CD 和 Tekton 的内容。这也是我在选型建议里始终强调的不能只看功能演示要看这个工具背后的生态支撑能不能托得住你的生产环境。3. 核心维度拆解架构、工作模式、安全性3.1 三者的架构哲学完全不同理解工具之间的差异要从它们的架构哲学说起。Argo CD 是典型的“控制器模式”。核心逻辑在于一个一直在跑的 Controller反复对比期望状态与实际状态。这种模式天然适合 CD因为部署不是一个一次性动作而是一个持续跟踪、持续纠正的过程。比如我手动改了集群里的 Deployment 副本数如果开了自动同步自愈策略过不了多久 Argo CD 就会把它改回 Git 里声明的值。这种“集群最终会回到 Git 声明状态”的特性让企业里的生产环境长期保持一种稳定、可审计的状态。Tekton 是典型的“编排模式”。它不关心某个状态要不要持续保持而是关心一批任务要以什么顺序、什么条件、什么依赖关系执行。任务执行完PipelineRun 就结束了它不会去检查你集群里部署的 Pod 对不对。所以 Tekton 天然是一个 CI 引擎它要的是“跑完即止”的确定性而不是“保持现状”的收敛性。Arbess 这类一体化工具的架构思路则是“流程包办模式”。它希望通过一个统一抽象的流水线对象把 CI 阶段和 CD 阶段无缝衔接起来。用户定义的是整条链路而不是两段独立的工作流。好处是流程整体性强坏处是如果你需要对某一个环节做很深的定制它可能不如专业工具那么灵活。3.2 工作模式Pull、Push、混合响应Argo CD 是 Pull 模式。它驻在集群内部主动去 Git 仓库拉取声明和集群实际状态做比较。这种模式有一个隐性好處即使没有人触发部署动作只要 Argo CD 在运行异常漂移就会被发现和纠正。尤其在生产环境里手动 kubectl apply 导致的状态漂移是我见过最多的线上问题来源之一。Tekton 是 Push 模式。通常由外部事件触发比如 Git Webhook、镜像仓库 Webhook或者手动创建一个 PipelineRun。事件来了任务就跑没事件它什么都不干。它不做状态收敛也不会主动纠偏。Arbess 这类工具通常会做混合响应既有事件触发的 CI 流程又有类似 Argo CD 的持续同步机制。听起来很完美但也要警惕一个现实问题在一个工具里同时实现两套逻辑复杂度是指数级上升的对架构设计和异常处理的要求远高于单点工具。3.3 企业安全模型SSO、RBAC、审计、密钥企业落地 CI/CD 逃不掉安全合规问题。这里我细说几个关键点。Argo CD 在企业安全方面做得相当成熟支持对接 OIDC、LDAP、SAML 等统一身份认证企业可以直接把自己的 SSO 体系接入。RBAC 策略基于项目和角色可以做到“开发只能看自己的项目”“运维可以触发同步”“管理员才能修改同步策略”这类细粒度控制。审计日志记录了每一次同步、修改、登录操作配合外部日志系统可以完成合规审计要求。天然的 GitOps 安全模型意味着你的部署动作必须有 Git 提交作为依据这本身就是一种审批留痕。Tekton 的安全模型主要依托 Kubernetes 原生的 RBAC 与 Namespace 隔离它本身不提供一套独立的用户体系而是通过 Kubernetes 的 ServiceAccount 来授权任务执行权限。常用于 CI 场景的 Git token、镜像仓库密钥以 Kubernetes Secret 形式挂载到任务中配置灵活。在沙箱能力方面Tekton 的 Step 就是普通 Pod 里的容器天然支持运行在隔离环境里。Arbess 这类新工具的安全模型通常借鉴 Argo CD 的思路但在成熟度上还有差距。我建议在评估时重点看它是否支持细粒度的多级角色权限。操作审计日志。与已有 SSO 系统对接。在 Pipeline 执行中安全传递敏感信息而不是明文写在配置里。4. 企业落地最容易被忽视的细节4.1 多集群支持是 CD 选型的隐藏分水岭如果你的企业只有一套测试集群选哪个工具差别不大但到了多集群环境CD 工具的能力差距就完全暴露了。Argo CD 的多集群管理是目前我用过的最顺手的方案之一。你可以通过argocd cluster add命令把多个集群注册上来然后每个 Application 独立指定目标集群。一个控制面管理十几个集群每个集群里的应用状态一目了然。我目前管理的环境里测试、预发、生产是分开的多个集群Argo CD 一个实例全部覆盖非常省心。Tekton 本身的设计目标是 CI 编排并不以多集群管理见长。它默认在同一个集群里跑任务如果需要跨集群部署通常的做法是让 Pipeline 在构建完镜像后调用 Argo CD 完成部署或者执行 kubectl 命令操作远端集群。这意味着在 Tekton 体系里你仍然需要另一个工具来做真正的 CD 多集群同步。Arbess 如果要做兼具 CI/CD 的一体化平台多集群支持我觉得是绕不开的基本功如果目标就是企业级场景的话。如果不是那它更适合单集群的场景。4.2 权限体系要与团队结构匹配而不是反过来很多团队选型时只看功能上了生产环境才发现权限模型不贴合组织架构非常痛苦。这里我有几个真实经验Argo CD 里的 Project 是一个很好的逻辑隔离单位。我通常建议按“业务线 环境”来划分 Project比如支付-生产、支付-预发、营销-生产。每个 Project 绑定自己的 Git 仓库白名单、目标集群白名单、资源类型限制再配合 RBAC 角色基本能覆盖“谁能改什么”的诉求。Tekton 的权限通常就是 Kubernetes RBAC。建议为每个研发团队单独建 Namespace通过 RoleBinding 限制只能在这个 Namespace 内创建 Task 和 PipelineRun。同时 CI 任务使用的 ServiceAccount 要尽量最小权限化不要图省事最后全用同一个高权限账号。Arbess 这种一体化工具权限模型往往埋在产品设计里企业如果想自定义一套完全匹配自身组织架构的权限体系可能受限于产品本身的灵活性。4.3 与周边系统的集成深度决定了你的运维体感CI/CD 工具从来不是孤立存在的。Git 平台、制品仓库、镜像仓库、告警系统、工单系统、统一门户……这些周边系统的集成深度直接决定了你上线后每天是“顺滑工作”还是“到处救火”。我个人的经验教训是不要把“能对接”和“好对接”混为一谈。Argo CD 和 Tekton 在 Webhook 对接、API 暴露、自定义资源扩展方面都非常开放社区里也有大量现成方案。Arbess 这类新工具你最好在实际选型时把周边集成部分的代码量和配置成本纳入评估别只看 Demo 演示的多顺滑。5. 快速上手两个主流工具的实操演示5.1 Argo CD 经典安装与首个应用同步第一步在 Kubernetes 集群里安装 Argo CDkubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml安装完之后把 Service 调整为可访问模式。测试环境我图省事会直接改成 NodePortkubectl patch svc argocd-server -n argocd -p {spec: {type: NodePort}}默认账号是 admin初始密码存在 Secret 里获取命令如下kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath{.data.password} | base64 -d这里有个非常容易踩的坑初次登录后 Argo CD UI 里会要求你修改密码但如果你用的是高版本argocd-initial-admin-secret这个文件在修改密码后会被删除。所以拿到初始密码后第一时间去改掉别等到用的时候才发现读不到了。登录进去之后最常用的手动方式就是创建一个 ApplicationapiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: demo-app namespace: argocd spec: project: default source: repoURL: https://github.com/your-org/demo-manifests.git targetRevision: HEAD path: manifests/overlays/prod destination: server: https://kubernetes.default.svc namespace: prod syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespacetrue这里说几个字段的含义source.repoURL是声明应用状态的 Git 仓库地址。source.path指向具体环境对应的清单目录。destination.server是目标集群地址单集群场景默认填 Kubernetes 的 Service 地址即可。syncPolicy.automated.prune表示同步时允许删除 Git 里已经不存在的资源这个开关我建议在测试环境先开着但生产环境第一次接入时要慎重。selfHeal表示集群状态与 Git 声明不一致时自动纠正回 Git 状态。创建完 Application 后Argo CD 会自动开始比对同步你可以在 UI 上看到Synced状态。如果仓库里声明了 20 个资源实际集群里也是这 20 个资源且配置一致那就是健康的。5.2 Tekton 标准安装与一条 Pipeline 的诞生Tekton Pipeline 的安装相对简单kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml装完后默认会有tekton-pipelinesNamespace里面跑着tekton-pipelines-controller和tekton-pipelines-webhook两个核心组件。接下来定义一个最简单的任务打印一句日志apiVersion: tekton.dev/v1 kind: Task metadata: name: echo-hello spec: steps: - name: say-hello image: alpine:3.18 script: | echo Hello from Tekton然后手动创建一个 TaskRun 来执行它apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: echo-hello-run spec: taskRef: name: echo-hello创建后Pod 会在你当前 Namespace 里启动跑完即结束。查看日志最直接的方式是看 Pod 日志kubectl logs pod/echo-hello-run-pod-xxxx真实场景中你会用一个 Pipeline 把多个 Task 连起来Workspaces 负责在 Task 之间共享文件。举一个典型流程的骨架apiVersion: tekton.dev/v1 kind: Pipeline metadata: name: build-deploy spec: workspaces: - name: shared-data tasks: - name: clone taskRef: name: git-clone workspaces: - name: output workspace: shared-data - name: build-image taskRef: name: buildah-build workspaces: - name: source workspace: shared-data在 Tekton 体系里Task 的定义是可复用的。你可以把构建、测试、扫描等任务沉淀到独立的 Task 文件里不同团队引用同一份定义实现流程标准化。5.3 真正生产级的组合模式Tekton Argo CD以我目前的实践企业里最常见、也最稳的搭配是Tekton 负责 CIArgo CD 负责 CD。完整链路是这样的开发提交代码到 Git。Git Webhook 触发 Tekton PipelineRun。Pipeline 执行代码拉取、单元测试、镜像构建、安全扫描、镜像推送。Pipeline 最后一步自动更新部署清单仓库里的镜像 Tag。Argo CD 检测到 Git 仓库里的清单变更自动同步目标集群完成生产部署。这个模式的好处非常明显CI 的灵活性和可编程性交给 Tekton基于 Kubernetes 原生的容器化 Task每个工具链都只是镜像里的一条命令。CD 的可控性和可观测性交给 Argo CD生产环境的任何变更都有 Git 历史背书出问题随时回滚。两者各自只做自己擅长的一件事边界清晰排障简单。你可能注意到这个方案里 Argo CD 的同步动力来自 Git 清单变更而不是 Tekton 直接去调集群部署。这正是 GitOps 的核心原则部署动作必须源于 Git 的变更而不是某个平台的即时调用。这样做的好处是任何一次生产变更都可以追溯到一次具体的 Git 提交长期看对合规审计和问题追溯有巨大价值。关于 Arbess 的接入方式我目前更建议的做法是不要急着把你成熟的 Tekton Argo CD 链路整体迁过去而是先用一个非核心业务做小范围试点。重点验证的问题包括它能不能接管现有流程所需的自定义镜像和工具链它的权限审计能力是否能满足公司合规要求它的社区和官方文档能不能支撑你们团队随时排障这些都验证过了再考虑扩大范围不迟。6. 常见问题与排障把踩过的坑提前告诉你6.1 Argo CD 同步一直卡在 OutOfSync 怎么办OutOfSync 是 Argo CD 出现频率最高的状态但它本身不一定是错误它只是告诉你“期望状态和实际状态有差异”。我建议按这个顺序排查先看差异明细用 UI 里的 App Diff 功能或者命令argocd app diff demo-app。它会直接列出每个资源的差异字段。如果差异是自动同步触发的但同步完了还是 OutOfSync大概率是清单渲染出来的资源带有动态生成字段比如last-applied-configuration、kubectl.kubernetes.io/last-applied-configurationannotation或者某些 Admission Webhook 启动时自动注入了字段。如果某个资源反复同步还是失败查看 Application 的 events经常能看到真正的报错原因比如 CRD 不存在、权限不足、资源被某个控制器二次篡改。一个我多次遇到的细节如果应用自身的资源清单中包含 Deployment但 Deployment 的副本数发生了自动伸缩比如 HPAArgo CD 默认不会把这个差异当成需要纠正的问题。你可以通过配置ignoreDifferences来忽略特定字段别跟 HPA 打架。6.2 Tekton PipelineRun 一直 PendingPod 创建不出来PipelineRun 创建后卡在 Pending通常和集群资源或权限有关。检查 PVC 是否创建成功。Pipeline 里如果声明了 Workspaces底层有些配置需要 PVC 支持PVC 没 Bound 就会一直卡住。检查任务 Pod 是否因资源配额ResourceQuota无法调度。有些团队在 Namespace 里设置了 CPU/内存配额而你的 Task 请求量超过剩余额度Pod 就会一直 Pending。检查 ServiceAccount 权限。Tekton 的 Pod 以特定 ServiceAccount 运行如果该账号没有权限拉取私有镜像Pod 会反复失败重试。排查时一般就是kubectl describe pipelinerun xxx加kubectl describe pod xxx事件里会写明具体原因别一上来就怀疑工具本身的问题。6.3 回滚到底应该用 Git 回滚还是 UI 回滚Argo CD 的 UI 里有一个 Rollback 按钮可以直接回到上一次成功同步过的版本。但我给你的建议是生产环境回滚一定要通过 Git 操作改 YAML 提交让 Argo CD 去同步。原因很简单如果你直接用 UI 回滚集群状态倒是改回去了但 Git 仓库里还是出问题的版本一旦有人再触发一次同步故障版本又回来了。用 Git 回滚就是把 Git 里的内容恢复成上一个稳定提交这会留下一条清晰的历史记录审计时能完整还原当时发生了什么。6.4 Tekton 跑了但镜像没有推送到目标仓库Pipeline 里构建镜像用到的认证信息通常放在 Secret 里然后挂载为 Workspaces 或通过环境变量注入。如果推到一半报认证失败先检查有没有把 Docker config 的 Secret 挂进任务的 Step 环境里。实践中我一般会做一个docker-config的 Secret然后在 Task 里通过volumeMounts挂到/kaniko/.docker或/root/.docker目录。用 Docker Hub 还是 Harbor都要提前确认 Secret 内容格式。7. 选型判断框架不是看谁火而是看谁合身把三个工具放在一张表里做对照如果你也正面临选型可以直接对着你的情况打钩评估维度Argo CDTektonArbess核心定位GitOps 持续交付云原生 CI 流水线一体化 CI/CD 尝试工作模式Pull持续同步Push事件触发混合多集群能力强控制面管理多集群弱需要配合其他工具取决于产品设计权限模型项目级 RBAC SSOKubernetes RBAC待验证学习曲线中等GitOps概念要熟悉中等资源模型较多较低一体化体验社区生态非常成熟非常成熟还在成长最擅长场景生产环境持续部署和状态收敛构建、测试、镜像打包流水线中小团队一体化快速交付主要风险概念多初学易晕不擅长状态收敛生态和案例沉淀少选型逻辑我个人总结就三条第一先搞清楚你当前最大的痛点是什么。如果痛点是“生产环境部署靠人肉 kubectl状态经常漂移领导问起来没有记录”直接选 Argo CD 就对了它解决的就是这个问题。如果痛点是“代码质量参差不齐每个人构建发布方式都不一样急需一套统一的 CI 流水线”那 Tekton 是你的第一选择。第二不要为了追求单一工具而强行收敛链路。业界流行的“Tekton 做 CI Argo CD 做 CD”的组合看起来要维护两套系统实际体验下来它的稳定性和可扩展性远好于在某个一体化工具里被锁死。我一直跟团队强调的是CI/CD 工具链的复杂度是客观存在的逃避这个复杂度不会让它消失只是延迟到了出问题的时候。第三给任何新兴工具一个 POC 周期。评估 Arbess 这类工具时不要只看官方文档和 Demo 视频。务实一点完整跑通一条真实的业务流水线让团队里负责通知的小哥、负责安全的小哥、负责运维的小哥都真的上手用两周再看大家愿不愿意长期维护它。技术选型最终的成功标准不是选了一个好工具而是选了一个团队愿意用、用得住的工具。8. 最后说一点我自己的心得我早期犯过的最大错误是试图把所有事情都交给一个工具结果工具的上限成了团队的上限。后来我才真正接受一个事实在云原生时代CI 和 CD 是两个不同的问题能用两个专业工具去解决往往比用一个万能工具去套更靠谱。这套“Tekton 管构建打包、Argo CD 管部署同步、Git 管状态与历史”的组合拳我已经在多个业务线上应用稳定运行了两年多经受住了从测试环境到生产环境的考验。这种分工明确带来的好处是排障极其舒服构建失败了看 Tekton 的 PipelineRun 和 Pod 日志部署失败了看 Argo CD 的 Application 状态和同步记录要追责看 Git 提交历史。每一层都有清晰的数据和可观测性不会出现“工具内部黑盒出了问题只能重启”的僵局。Arbess 这类一体化工具如果它能把 CI 和 CD 的复杂度真正包住对团队规模不大、Kubernetes 经验有限的同学是有吸引力的。我建议大家保持关注先用小项目验证一下等技术栈更成熟了再考虑全面导入也不迟。工具选型永远没有一劳永逸的答案保持对不同思路的包容同时守住你的核心稳定性底线才不会在技术浪潮里反复摇摆。