一、前言
很多初学K8s的同学,只会使用集群内置的Pod、Deployment、Service等资源,但不清楚K8s真正强大的核心能力——可扩展性。
K8s本身的内置资源是固定的,无法适配所有业务场景,比如数据库自动化运维、中间件集群管理、机器学习任务调度、CI/CD流水线定义等复杂场景。
而CRD + 自定义控制器就是K8s实现功能扩展、业务自动化的核心方案,也是云原生Operator模式的底层原理。
本文结合完整实操案例,用人话讲透CRD的概念、意义、使用流程、自动化原理,零基础也能看懂。
二、什么是CRD?核心作用与意义
1. CRD概念
CRD(CustomResourceDefinition)自定义资源定义,是K8s提供的原生扩展能力。简单来说:CRD就是给K8s集群新增一种自定义资源类型。
集群默认只有Pod、Deployment、Service等内置资源,通过CRD,我们可以随心所欲定义业务专属资源,比如Visitor访客资源、MySQL数据库资源、流水线资源、机器学习任务资源等。
定义完成后,自定义资源可以像原生资源一样,通过kubectl命令管理、存储在etcd、具备完整的权限校验、声明式管理能力。
2. CRD对K8s的核心意义
突破原生资源限制:打破K8s内置资源的固定形态,适配各类复杂业务场景
实现集群自动化运维:结合自定义控制器,形成Operator模式,告别手动运维
统一管理范式:自定义资源和原生资源共用一套API、权限、命令体系,运维成本极低
业务场景标准化封装:将数据库、中间件、大数据任务等复杂业务,封装为标准化K8s资源
3. CRD典型应用场景
DBaaS数据库即服务:MySQL、Redis、PostgreSQL Operator,实现数据库集群一键部署、备份、扩缩容、故障自愈
中间件自动化管理:Kafka、ES、Nginx等中间件集群的统一管控
CI/CD流水线:Tekton、ArgoCD通过CRD定义流水线、发布任务,实现云原生持续交付
大数据/机器学习:Spark、Flink、AI训练任务的自定义调度管理
企业定制业务:根据公司业务,自定义专属资源,实现业务流程自动化
三、CRD、CR、控制器三者核心关系
很多人容易混淆这三个概念,这里一次性区分清楚:
CRD:资源模板,定义K8s新增什么资源、包含哪些字段、资源属性
CR(自定义资源实例):根据CRD模板创建的具体资源对象,也就是实际使用的业务资源
自定义控制器:常驻集群的监听程序,负责监听CR资源变化,自动执行业务逻辑,是实现自动化的核心
一句话总结:CRD造模板、CR创实例、控制器做自动化。
四、CRD+控制器完整自动化实操流程(落地版)
结合我们实操的Visitor案例,完整梳理从0到1的自动化实现全过程,这是面试、实操核心考点。
步骤1:创建CRD,拓展K8s资源
编写CRD资源清单,定义全新的Visitor自定义资源,声明资源的API组、版本、字段结构、操作别名等信息。
将CRD配置应用到K8s集群后,集群完成资源注册,成功识别Visitor资源,支持kubectl查询、创建、删除该类资源,所有Visitor资源数据统一持久化存储在etcd中。
步骤2:开发自定义控制器程序
搭建Go开发环境,引入K8s官方client-go依赖包,编写控制器代码。让程序具备连接K8s集群、监听自定义资源的能力。
控制器本质是一段常驻后台的监听程序,核心功能是实时监控集群中Visitor资源的增、删、改事件,并提前定义好对应的业务处理逻辑。
步骤3:打包镜像,部署控制器到集群
自定义控制器无法本地独立运行,必须部署在K8s集群内部才能监听集群资源。因此将完整的Go程序打包为Docker镜像,通过Deployment创建Pod,拉取镜像运行,让控制器常驻集群后台。
步骤4:配置RBAC权限,解决权限不足问题
控制器需要主动查询、监听、处理集群内的Visitor自定义资源,默认没有任何权限。
因此需要完整配置权限体系:创建服务账号、通过ClusterRole授权资源操作权限、通过ClusterRoleBinding将权限绑定到服务账号,最后把服务账号关联到控制器运行的Pod上,保证控制器可以正常和集群交互。
步骤5:创建CR资源实例,触发自动化
编写Visitor自定义资源实例(CR)并应用到集群,资源创建的瞬间,相关数据会同步写入集群etcd数据库。
后台常驻运行的控制器会第一时间监听到「新增Visitor资源」事件,自动读取CR资源中定义的所有数据,按照提前编写好的业务逻辑自动执行对应操作,无需人工干预,最终实现集群自动化处理。
五、核心原理总结(声明式自动化)
K8s所有控制器的核心逻辑都是期望状态调和循环:
用户通过CR定义业务的期望状态,控制器实时监测集群实际状态,一旦两者不一致,自动执行操作,让实际状态持续趋近于期望状态,实现自愈、自动化运维。
我们的Visitor案例虽然只是简单打印日志,但原理和生产级别的MySQL Operator、Redis Operator完全一致,只是业务逻辑不同。
六、面试高频总结(直接背诵)
1. 什么是CRD?
CRD是K8s的自定义资源定义,用于给集群新增原生以外的自定义资源类型,拓展K8s的能力边界。
2. CRD核心意义?
突破原生资源限制,结合自定义控制器实现Operator自动化运维,标准化各类复杂业务场景,统一集群资源管理范式。
3. CRD完整自动化流程?
创建CRD新增自定义资源→开发Go控制器程序→打包镜像部署到集群→配置RBAC权限→创建CR资源实例→控制器监听资源变化,自动执行业务逻辑。
七、结尾
CRD+自定义控制器是云原生进阶的核心知识点,也是中高级运维、开发、面试的高频考点。掌握这套原理,就彻底理解了Operator模式的底层逻辑,能够看懂生产中各类中间件、数据库的自动化运维方案。