ArgoCD和Kubernetes到底是什么关系?一张图彻底讲清楚
别再搞混了!K8s是操作系统,ArgoCD是里面的“强迫症管家”
一、引言:一个让初学者困惑的问题
前几天在技术群里,看到有人问了一个很典型的问题:
“我装了Kubernetes,又装了ArgoCD,这俩到底啥关系?ArgoCD是K8s的替代品吗?还是说ArgoCD比K8s更底层?”
这个问题其实非常普遍。很多人在学习云原生时,会接触到各种各样的工具——Docker、Kubernetes、Helm、ArgoCD、Istio……每个工具都有自己的Logo和文档,但对于它们之间的关系,很少有人能讲清楚。
今天这篇文章,我就用最通俗的语言,把ArgoCD和Kubernetes的关系彻底讲透。
一句话先给答案:
ArgoCD是运行在Kubernetes内部的应用程序,它的全职工作就是调用Kubernetes的API来管理Kubernetes自己的资源。
二、认识两个主角
Kubernetes(简称K8s)
Kubernetes是一个容器编排平台。用人话说就是:
“你有一堆装着代码的容器(Docker容器),Kubernetes帮你管理它们——安排它们跑到哪台机器上、它们之间怎么通信、出故障了怎么重启。”
ArgoCD
ArgoCD是一个GitOps持续部署工具。用人话说就是:
“你告诉ArgoCD‘我的K8s配置放在这个Git仓库里’,ArgoCD就盯着这个仓库,一旦发现仓库里的配置变了,它就自动把K8s集群改成配置里写的样子。”
关键来了:ArgoCD要完成它的工作,它必须运行在某个地方。而它选择运行的地方,正是Kubernetes集群内部。
如果还是有点晕,别着急,下面我们用四个维度来拆解它们的关系。
三、维度一:居住关系(ArgoCD住在K8s里)
先问一个问题:ArgoCD是安装在哪里的?
如果你去ArgoCD的官网,它会让你执行这样一条命令:
bash
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
注意看里面的关键词:kubectl apply。
这意味着:ArgoCD是被当作一组Kubernetes资源,部署到Kubernetes集群里的。
当你执行完这条命令后,在argocd命名空间下,会出现这样一组Pod:
text
argocd-application-controller-0 1/1 Running argocd-applicationset-controller 1/1 Running argocd-dex-server 1/1 Running argocd-redis 1/1 Running argocd-repo-server 1/1 Running argocd-server 1/1 Running
所以,ArgoCD本身没有独立的服务器,它完全寄生在Kubernetes集群中运行。
关系很简单:
Kubernetes是大楼,提供基础设施。
ArgoCD是楼里的住户,被大楼容纳和保护。
| 问题 | 答案 |
|---|---|
| ArgoCD能独立运行吗? | 不能。它必须跑在K8s集群里。 |
| K8s能没有ArgoCD吗? | 能。K8s没有ArgoCD照样正常调度容器。 |
| 谁依赖谁? | ArgoCD依赖K8s,K8s不依赖ArgoCD。 |
四、维度二:管辖关系(ArgoCD管理K8s资源)
如果说“住在里面”是物理关系,那“管理资源”就是职能关系。
传统方式:你直接管K8s
在没有ArgoCD的时候,你跟Kubernetes交互的方式是直接调用它的API:
bash
# 创建一个Deployment kubectl apply -f deployment.yaml # 修改副本数 kubectl scale deployment myapp --replicas=5 # 删除一个资源 kubectl delete deployment myapp
你敲的每一条命令,本质都是向Kubernetes API Server发送一个HTTP请求。
有了ArgoCD之后:ArgoCD替你来管
ArgoCD的工作方式是:
你告诉ArgoCD:“去监听这个Git仓库”
ArgoCD自己定期(每3分钟一次)向Kubernetes API Server发送请求:
“查一下,当前Deployment的副本数是几个?”
“查一下,Git里定义的副本数是几个?”
“不一样?那我帮你改一下!”
ArgoCD发送
PATCH请求,把Deployment的副本数改回Git定义的值
所以,ArgoCD不是取代了Kubernetes,而是成为了Kubernetes的“超级管理员”。
| 问题 | 答案 |
|---|---|
| 谁最终执行部署? | Kubernetes(通过它的API Server和Scheduler) |
| ArgoCD做什么? | 指挥Kubernetes去执行(通过调用API) |
| ArgoCD能绕过K8s直接操作容器吗? | 不能。它所有操作都是通过K8s API完成的。 |
五、维度三:能力扩展(ArgoCD给K8s装上了“新能力”)
接下来这个问题有点进阶,但理解了会让你对云原生生态有质的认识。
Kubernetes本身并不知道什么是“GitOps”。
Kubernetes内置的控制器(Controller)能做的事情是有限的:
ReplicaSet Controller:确保Pod数量始终等于用户指定的值。
Deployment Controller:管理滚动更新和回滚。
Service Controller:管理负载均衡和网络。
但没有任何一个内置控制器知道“从Git仓库拉配置”或“对比Git和集群状态”。
那ArgoCD是怎么让Kubernetes理解GitOps的呢?通过CRD(自定义资源)。
当ArgoCD被安装到K8s集群时,它会向Kubernetes注册几个新的API资源类型:
yaml
# 这不是K8s原生认识的资源,是ArgoCD注册的 apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: myapp
这些CRD的出现,让Kubernetes的API Server认识了新的“词汇”。
从此以后,你可以执行:
bash
kubectl get applications
Kubernetes能够听懂并返回结果——这在安装ArgoCD之前是不可能的。
| 比喻 | 解释 |
|---|---|
| K8s是个手机操作系统(iOS) | 它自带一些核心App |
| ArgoCD是个新安装的App | 它给系统增加了新功能 |
| CRD是App创建的“新文件类型” | 安装了ArgoCD后,系统能识别.gitops文件了 |
六、维度四:依赖关系(K8s是地基,ArgoCD是大楼)
现在我们可以用一张图来总结它们的依赖关系了:
text
┌─────────────────────────────────────────────────────┐ │ ArgoCD │ │ (跑在K8s里面的Pod,通过K8s API操作K8s资源) │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ Kubernetes │ │ │ │ (容器编排、调度、网络、存储) │ │ │ │ │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ │ │ 物理服务器 / 虚拟机 │ │ │ │ │ │ (CPU、内存、硬盘、网络) │ │ │ │ │ └─────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘
依赖链条是单向的:
text
物理机/虚拟机 ↓ 运行 Kubernetes ↓ 被部署到 ArgoCD
所以:
ArgoCD离开了Kubernetes:ArgoCD的源码只是一堆Go代码,完全无法运行。
Kubernetes离开了ArgoCD:Kubernetes依然能完美运行,依然能调度容器,只是少了“通过Git自动部署”的功能。
Kubernetes是地基,ArgoCD是地基上盖的自动化大楼。地基不需要大楼也能用,但大楼一旦离开地基就会崩塌。
七、终极比喻:工厂的故事
为了让你彻底记住,我再用一个“工厂指挥中心”的故事来总结。
想象有一家大型工厂:
工厂的构成
| 角色 | 比喻 | 说明 |
|---|---|---|
| Kubernetes | 工厂的中央指挥中心 | 拥有对所有机器人(容器)和生产线(服务)的绝对控制权。它能指挥机器人启动、停止、重启、搬运货物。 |
| ArgoCD | 指挥中心里的自动工程师 | 这个工程师身边放着一本《标准作业手册》(Git仓库)。他每隔3分钟就做一次检查: |
| Git仓库 | 《标准作业手册》 | 上面清清楚楚写着:“开发环境,开1台螺丝机;生产环境,开5台螺丝机。” |
工程师(ArgoCD)的日常工作
翻开手册(读取Git),看到:“生产环境,螺丝机开5台。”
转头看车间(查询K8s API),发现:“咦?怎么实际只有3台在跑?”
立刻冲到控制台前(调用K8s API),按下了“增加2台”的按钮。
车间里果然多起来了2台螺丝机(K8s调度新容器)。
回去睡3分钟,醒来再重复一次。
如果工程师偷懒了……
如果ArgoCD这个工程师撂挑子不干了(Pod宕机),指挥中心(Kubernetes)依然会运转,机器人们(容器)依然会干活,只是没人去跟《标准手册》做比对了。只要没人乱改车间配置,工厂还能正常运转。
但一旦有人手动去控制台按了按钮(手动kubectl),把螺丝机改成8台,而工程师又不在,就没人把它改回5台了——这就叫“配置漂移”。
ArgoCD和K8s关系的本质
Kubernetes是提供“执行力”的引擎,ArgoCD是为这个引擎提供“智能化大脑”的驱动程序。没有引擎,驱动无用;没有驱动,引擎只能靠人工遥控。
八、一张速查表(建议收藏)
| 对比维度 | Kubernetes | ArgoCD |
|---|---|---|
| 角色定位 | 操作系统 / 基础设施 | 应用程序 / 自动化工具 |
| 运行位置 | 物理机/虚拟机之上 | K8s集群内部(作为Pod运行) |
| 管理对象 | 容器、存储、网络、节点 | K8s内部的资源(Deployment、Service等) |
| 交互方式 | 提供REST API(kubectl底层调用的就是这个接口) | 调用K8s的API来增删改查资源 |
| 数据来源 | ETCD数据库(存储集群状态) | Git仓库(存储期望状态)+ ETCD(存储实时状态) |
| 能独立存在吗 | 可以(没有ArgoCD照样跑) | 不可以(离开K8s集群完全无法运行) |
| 谁依赖谁 | 无人依赖它(它是底层基础设施) | 完全依赖Kubernetes |
九、常见误区(一次帮你扫清)
❌ 误区1:“ArgoCD比K8s更底层”
✅ 正解:恰好相反。K8s才是底层,ArgoCD是K8s之上的应用。没有K8s,ArgoCD无法启动。
❌ 误区2:“ArgoCD取代了kubectl”
✅ 正解:ArgoCD底层依然在用K8s API(和kubectl做的事一样)。它只是自动化地、周期性地帮你调用这些命令,而不是取代了这些命令本身。
❌ 误区3:“ArgoCD有自己的部署引擎”
✅ 正解:ArgoCD没有独立的部署引擎。它把YAML文件发给Kubernetes,具体的容器启动、网络配置、卷挂载等工作,统统由Kubernetes来执行。
十、总结
ArgoCD和Kubernetes的关系,一句话就能说清:
Kubernetes是ArgoCD的“宿主环境”和“执行力来源”,ArgoCD是Kubernetes的“智能自动化大脑”。
当你以后在面试或给别人介绍的时候,只需要记住这个金字塔模型:
底层:基础设施(服务器、网络、存储)
中间层:Kubernetes(容器编排,提供API)
上层:ArgoCD(应用层,调用K8s API实现GitOps)
每层都依赖它的下一层,层层递进,缺一不可。这就是云原生技术栈的优雅之处——每一个工具都专注做一件事,并通过标准API进行组合,最终形成强大的自动化系统。🚀
如果这篇文章帮到了你,点个赞让更多人看到吧!有任何问题欢迎在评论区交流讨论。👋