很多刚接触 K8s 的朋友,对 CRD、CR 这两个概念很迷糊,觉得是高阶复杂知识点。其实它俩核心逻辑特别简单,是 K8s 自定义扩展能力的核心。今天用大白话讲清楚,零基础也能看懂。
一、先搞懂:CRD 和 CR 到底是什么?
- 前置小认知:K8s 原生资源
我们平时常用的 K8s 资源,都是官方提前定义好的,比如 Pod、Deployment、Service、ConfigMap。
这些是 K8s 自带的「固定模板」,你只能按照官方规则用,不能随便改规则、新增资源类型。 - CRD:自定义资源模板(蓝图)
CRD 全称:自定义资源定义(CustomResourceDefinition)
大白话:CRD 就是你自己在 K8s 里新建的一种「资源模板」。
K8s 原生资源不够用时,我们通过 CRD 告诉 K8s:我要新增一种全新的资源类型,定义好它的字段、规则、格式。
打个比方:
K8s 原生自带「员工模板」(Pod/Deployment),字段只有姓名、岗位;但我需要「程序员专属模板」,需要新增编程语言、项目字段,这个新建模板的动作,就是 CRD。 - CR:自定义资源实例(具体对象)
CR 全称:自定义资源(CustomResource)
大白话:CR 就是基于 CRD 模板,创建出来的具体实例。
继续用上面的例子:CRD 是「程序员模板」,那根据这个模板创建出来的「张三、后端程序员」这条具体数据,就是 CR。
核心关系总结
CRD = 模板(类),CR = 实例(对象)
先有 CRD(注册规则),才能有 CR(具体资源)。
二、CRD + CR 有什么用?
核心作用:突破 K8s 原生限制,无限扩展 K8s 能力
K8s 官方资源只能覆盖通用场景,但实际业务中很多个性化需求原生不支持,比如:自动扩缩容、网关规则、备份策略、数据库运维、微服务治理等。
如果没有 CRD,这些个性化功能只能用脚本、外部程序实现,杂乱难维护。
有了 CRD/CR 之后,所有自定义功能都能像操作原生 K8s 资源一样管理,统一命令、统一监控、统一运维。
最常见的实际场景
- Ingress-Nginx:用 CRD 定义路由规则、限流规则
- Prometheus 监控:用 CRD 定义监控采集规则、告警规则
- ArgoCD/Flux:用 CRD 定义持续部署规则
- istio 服务网格:几乎所有路由、熔断、治理规则都是 CRD/CR 实现
三、最简实操:手把手学会怎么用
全程只做两件事:1. 部署 CRD(注册模板) 2. 创建 CR(使用模板)
步骤1:编写一个简单的 CRD(自定义模板)
新建 crd-demo.yaml,定义一个自定义资源:自定义应用(MyApp),包含名称、副本数两个字段。
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: myapps.demo.com spec: group: demo.com names: kind: MyApp plural: myapps scope: Namespaced versions: - name: v1 served:truestorage:true执行命令部署 CRD,让 K8s 识别这个新资源:
kubectl apply -f crd-demo.yaml
此时 K8s 就新增了一种资源类型:MyApp,和 Pod、Deployment 同级。
步骤2:编写 CR(创建具体资源实例)
新建 cr-demo.yaml,基于上面的 CRD 模板,创建一个具体的资源:
apiVersion: demo.com/v1 kind: MyApp metadata: name: my-first-app spec: appName:"测试应用"replicas:2执行命令创建 CR: kubectl apply-fcr-demo.yaml步骤3:查看自定义资源
查看我们创建的 MyApp 资源(CR):
kubectl get myapps
能看到刚刚创建的 my-first-app,说明操作成功。
四、关键补充:为什么大家都用它?
- 统一运维方式:不管是原生资源还是自定义资源,都用 kubectl 操作,不用记各种奇葩命令;
- 可扩展、可定制:业务需要什么能力,就定义什么 CRD,适配所有场景;
- 生态基础:现在 K8s 主流中间件、运维工具,全部基于 CRD/CR 实现,是进阶 K8s 的必备知识点。
五、极简总结(牢记即可) - CRD:自定义资源模板,给 K8s 新增资源类型,定规则;
- CR:基于 CRD 模板创建的具体业务资源;
- 核心价值:扩展 K8s 原生能力,实现个性化业务运维;
- 使用顺序:先装 CRD,再建 CR。