K8s二开必须要懂的核心概念-Operator

真成运维 2025-12-18 14 12/18

Operator 介绍

Kubernetes Operator 是一种软件扩展模式,用于基于自定义资源(Custom Resources)来管理应用程序及其组件。它遵循 Kubernetes 的核心原则,特别是控制循环(Control Loop)机制。

在 Kubernetes 中,用户通常希望通过自动化来处理重复性任务,而 Operator 正是为了在 Kubernetes 提供的基础能力之上,进一步扩展自动化管理的范围。

一句话总结:Operator 的工作核心就是通过 自定义资源(CRD) 和 自定义控制器(Controller) 实现对应用的自动化管理。同时 Operator 是对 K8s 资源(自定义或内置的资源)的扩展编程或者说开发一个资源对象,就像:Pod、Deploy、Service 一样。实现的主要逻辑是在 Controller 部分。

CRD

CRD(Custom Resource Definition):是 Kubernetes 中扩展 API 的方式,它允许你定义一种新的资源类型,使其看起来就像是 Kubernetes 本身的原生资源(例如 Pods、Services 等)。每个 CRD 都是一个资源类型,它定义了你要管理的应用程序或服务的状态、字段以及控制器的行为。

CRD 对象本身是 Kubernetes 中的一种 API 对象,用于扩展 Kubernetes 的 API,使得你可以创建自定义的资源类型。

Controller

Controller: 控制器是 Kubernetes 中的核心概念之一,它负责不断地检查集群中的资源对象(如 Pod、Service、Deployment 等)是否符合预期状态。Kubernetes 内置的控制器包括 Deployment 控制器、ReplicaSet 控制器等。

k8s 的是一个高度自动化的系统,其中涵盖了常见应用程序所需的大部分功能,比如我们通过 kubectl 命令创建一个 deployment 对象之后,为什么就会有 Pod 创建出来了?

这其实是后台有多个 Controller 在后台工作实现的。比如:

  • Deployment Controller 根据 Deployment 创建 ReplicasSet 对象
  • ReplicasSet Controller 则根据 ReplicasSet 创建 Pod

K8s 资源标识 GVK&GVR

在 Kubernetes 中,GVK(Group, Version, Kind)和 GVR(Group, Version, Resource)是用于标识和访问 Kubernetes 资源的两个重要概念。

  • Group:API 组的名称。例如,apps 组包含 Deployment、StatefulSet 等资源,batch 组包含 Job、CronJob 等资源。

    • 注意;早期的 core 组的资源(如 Pod、Service 等)是没有组名的,默认使用空字符串""
  • Version:API 版本。每个资源在 Kubernetes 中可能会有多个版本(如 v1v1beta1v1alpha1 等),每个版本可能会有不同的功能和行为。

  • Kind:资源的类型。通常是资源的单数形式,如 PodDeploymentService

  • Resource:资源的名称。通常是复数形式,如 podsdeploymentsservices

GVK 和 GVR 区别在于:

  • GVR 更侧重于资源的实际操作,特别是动态客户端和工具中使用,用于指定和操作特定类型的资源实例。
  • GVK 更侧重于资源的定义和描述,特别是在控制器、操作器以及元数据操作中使用,用于唯一标识和处理特定类型的资源。

以下面这个 Deployment 为例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: caddy
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  ...
  • Group 为 apps
  • Version 为 v1
  • Kind 则是 Deployment
  • Resource 则是 deployments

实现 Operator 的方式

client-go:Kubernetes 官方客户端库

定位:基础开发工具包,提供与 Kubernetes API Server 交互的核心能力。
核心功能:

1)API 交互:

    • 提供 Clientset 对内置资源(如 Pod、Deployment)进行 CRUD 操作。
    • DynamicClient 支持操作自定义资源(CRD)和未结构化数据6。

2)Informer 机制:

    • 通过 Reflector 监听 API Server 事件(Add/Update/Delete),存储到本地缓存 Indexer6。
    • 使用 Lister 从缓存高效查询资源,避免频繁请求 API Server6。

3)Workqueue:

    • 事件去重与重试机制,确保控制器可靠处理事件

Kubebuilder:Operator 开发脚手架

定位:基于 controller-runtime 的框架,快速生成 Operator 项目结构。
核心特性:

1)项目生成:

    • 初始化项目:kubebuilder init --domain=example.com 生成标准目录(api/controllers/config/)2。
    • 创建 CRD 和控制器:kubebuilder create api --group=webapp --version=v1 --kind=App2。

2)自动化代码生成:

    • 自动生成 CRD YAML、RBAC 配置(make manifests)2。
    • 集成 controller-gen 工具生成深拷贝函数和 OpenAPI 校验规则5。

3)Webhook 支持:

    • 一键生成 Mutating/Validating Webhook:kubebuilder create webhook

Operator SDK:多模式 Operator 开发框架

定位:支持多种开发模式的工具集,整合 Kubebuilder 并扩展 Ansible/Helm

开发模式对比:

模式 语言 适用场景 特点
Go Go 复杂逻辑(如自动扩缩容) 基于 Kubebuilder,高性能
Ansible Ansible 运维脚本迁移(如备份任务) 无需编码,用 Playbook 定义逻辑
Helm Helm Chart 已有 Chart 的自动化管理 自动生成 Operator 包装 Helm Release

核心功能:

  • 集成测试:提供 operator-sdk test 本地测试框架。
  • 跨模式支持:同一项目可混合使用 Go/Ansible/Helm 组件。

四、三者核心区别总结

维度 client-go Kubebuilder Operator SDK
定位 基础客户端库 Go Operator 脚手架 多模式 Operator 框架
抽象层级 底层(需手动实现控制器) 中层(自动生成代码) 高层(支持无代码模式)
核心用户 深度定制化开发者 Go 语言 Operator 开发者 运维团队/多语言开发者
开发速度 慢(大量样板代码) 快(自动化生成) 极快(Ansible/Helm 模式)
扩展性 高(完全自主控制) 中(受框架约束) 中(模式依赖性强)

END

这篇文章有用吗?

点击星号为它评分!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

- THE END -

真成运维

12月18日22:45

最后修改:2025年12月18日
0

非特殊说明,本博所有文章均为博主原创。