跳到主要内容

Overview

云原生开发是指基于 Kubernetes 生态扩展其能力的开发方向,核心是利用 Kubernetes 的扩展机制(Controller、Webhook、Scheduler 等)开发自定义组件,使集群能够感知和管理业务特有的资源或行为。

开发方向

Controller / Operator

Controller 是云原生开发最核心的模式。其核心思想是控制循环(Reconciliation Loop):持续对比资源的期望状态(Spec)与实际状态(Status),驱动二者收敛。

  • Controller:监听已有 K8s 资源(Pod、Endpoints、Node 等)的变化,执行相应业务逻辑。例如 external-dns 监听 Service / Ingress 变化,自动将域名记录同步到 Route53、Cloudflare 等 DNS 服务商。
  • Operator:在 Controller 基础上引入自定义资源(CRD),将应用的运维知识编码进 Controller 中。例如管理 MySQL 集群的生命周期、备份、故障转移等。

典型场景:

  • 自定义资源的生命周期管理(创建、更新、删除)
  • 与外部系统的状态同步(云 API、数据库、消息队列)
  • 集群内资源的协调编排

Admission Webhook

Admission Webhook 在资源写入 etcd 之前拦截请求,分两类:

  • Validating Webhook:校验资源是否合法,不合法则拒绝(如强制要求 Pod 设置资源限制)
  • Mutating Webhook:修改资源内容后放行(如自动注入 sidecar、添加默认 label)

Custom Scheduler / Scheduler Plugin

扩展 K8s 默认调度策略:

  • Scheduler Extender:通过 HTTP 回调扩展调度决策,改动小但性能较差
  • Scheduler Plugin:实现 K8s Scheduling Framework 接口,与调度器深度集成,性能好

典型场景:GPU 调度、拓扑感知调度、跨集群调度。

CNI / CSI / Device Plugin

  • CNI Plugin:自定义 Pod 网络(如 Cilium、Calico)
  • CSI Driver:接入自定义存储后端
  • Device Plugin:向 K8s 暴露节点上的特殊硬件(如 GPU、FPGA、RDMA 网卡)

脚手架与框架选型

工具定位适合场景
Kubebuilder官方脚手架,生成项目骨架、CRD、RBAC、Makefile需要定义 CRD 的 Operator,或希望从完整骨架开始
controller-runtimeKubebuilder 的底层库,直接作为 Go 依赖引入不需要 CRD、只 Watch 已有资源、追求轻量
Operator SDKRed Hat 维护,支持 Go / Helm / Ansible偏好 Operator Framework 生态
client-go最底层的 K8s Go 客户端需要完全自定义控制流,或调用 K8s API 做非 Controller 类工具

选型建议:

  • 有 CRD → Kubebuilder(脚手架节省大量样板代码)
  • 无 CRD,只 Watch 已有资源 → controller-runtime(直接引依赖,3~4 个文件即可跑起来)
  • 已有 Helm Chart,想加运维逻辑 → Operator SDK(Helm 模式)

关键机制

Reconciliation Loop

所有 Controller 的核心。无论事件驱动(Watch)还是定时触发,最终都归结为一次 Reconcile() 调用:

Watch 到变化 → 入队 (NamespacedName) → Reconcile()
├── 取当前对象状态
├── 与期望状态对比
├── 执行 Add / Update / Delete 操作
└── 更新 Status,返回下次 requeue 时间

定期全量对账(RequeueAfter)是保证最终一致性的关键,能自愈事件丢失和操作失败的场景。

Informer 与 Cache

controller-runtime 内部基于 client-go Informer 实现本地缓存:

  • List/Watch 拉取资源并保持连接,增量同步变化到本地 Cache
  • Read 操作走 Cache,不直接打 API Server,大幅降低 API Server 压力
  • 事件驱动:Informer 检测到 Add / Update / Delete 后将对象 key 推入工作队列

参考链接