
本文共 1400+ 字,阅读约需 7 分钟。 如果你已经开始接触 Kubernetes、CI/CD、甚至 ArgoCD,那你一定见过一个东西:CRD, 但大多数人只是“见过”,却没有真正理解它。
这篇文章,我帮你彻底讲清楚:
👉 CRD 到底是什么? 👉 它解决了什么问题? 👉 为什么你现在用的所有高级组件都依赖它?
CRD,全称:👉 CustomResourceDefinition(自定义资源定义)
一句话解释:
CRD 是让 Kubernetes 支持“自定义资源类型”的机制
我们先看一个现实问题。
默认情况下,Kubernetes 只认识这些资源:
这些都是内置资源。
但在真实企业环境中,我们需要管理的东西远不止这些,比如:
问题来了:
👉 Kubernetes 本身并不认识这些资源 👉 那它怎么管理它们?
答案就是:
通过 CRD,把这些“新类型”注册进 Kubernetes
你可以把 Kubernetes 想象成一个操作系统:
👉 那么 CRD 就相当于:
给 Kubernetes 安装“新资源类型”
也就是说:
👉 Kubernetes 不再只是管理 Pod 👉 而是变成一个“可扩展平台”
我们在安装 ArgoCD 时,其实已经用到了 CRD:
kubectl create -f install.yaml
这个 YAML 里,包含了类似这样的内容:
kind: CustomResourceDefinition
metadata:
name: applications.argoproj.io
这一步做了什么?
👉 在 Kubernetes 中新增了一种资源:
kubectl get applications -n ns-name
也就是说:
👉 Application 变成了 Kubernetes 的“新资源类型”
之后你写的:
kind: Application
本质上就是:
👉 在使用 CRD 定义出来的资源
一个 CRD 本质是一个 YAML,它描述了:
apiVersion: apiextensions.k8s.io/v1
kind:CustomResourceDefinition
spec:
group:argoproj.io
names:
kind:Application
plural:applications
scope:Namespaced
versions:
-name:v1alpha1
核心字段解释:
字段 | 作用 |
|---|---|
group | API 分组 |
kind | 资源类型(如 Application) |
plural | kubectl 使用的名字 |
scope | 是否属于某个 namespace |
versions | API 版本 |
👉 简单理解:
CRD 就是在告诉 Kubernetes: “以后有一种新资源,叫 Application,你要认识它”
这是很多人最大的误区。
👉 CRD 只是定义资源 👉 它本身不会执行任何逻辑
真正让它“有用”的,是:
Controller(控制器)
这两者的关系:
组件 | 作用 |
|---|---|
CRD | 定义“资源是什么” |
Controller | 决定“资源怎么工作” |
以 ArgoCD 为例:
kind: Application
👉 ArgoCD Controller 发现:
“有一个新的 Application!”
👉 关键结论:
CRD 定义规则,Controller 执行规则
结合现在的学习路线,已经在大量使用 CRD 了:
👉 全部都是 CRD
Operator 本质就是:
CRD + Controller + 自动运维逻辑
比如:
Kubernetes 本质是什么?
👉 一个声明式 API 系统
而 CRD 做了一件非常关键的事情:
把 Kubernetes 从“容器编排工具”,升级成“通用控制平台”
这也是为什么现在 Kubernetes 可以:
在你的集群执行:
kubectl get crd

你会看到一堆类似:
applications.argoproj.io
volumes.longhorn.io
创建相应资源文件app.yaml:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: demo-app
namespace: argocd
spec:
destination:
namespace: default
server: https://kubernetes.default.svc
source:
repoURL: https://github.com/argoproj/argocd-example-apps.git
path: guestbook
targetRevision: HEAD
project: default
syncPolicy:
automated: {}
然后执行:
kubectl apply -f app.yaml
再执行:
kubectl get applications -A
👉 如果能查到资源,说明 CRD 已经生效
最后压缩成三句话:
👉 1️⃣ CRD=扩展 Kubernetes API
👉 2️⃣ CRD=定义新的资源类型
👉 3️⃣ CRD 必须配合 Controller 才真正有意义
当你真正理解 CRD 后,你会发现:
👉 Kubernetes 不只是“容器工具”
👉 而是一个“万能控制平台”