🏹kubebuilder 总结

type
Post
status
Published
date
Apr 27, 2025
slug
kubebuilder
summary
category
技术分享
tags
icon
password
AI summary
Blocked by
Blocking
Category
云原生

kuberbuilder是什么

Kubebuilder 是一个用于构建 Kubernetes API 和控制器的框架

基本概念

为了更好的使用kubebuilder,可以先看看一下的基础概念。

CRD是什么

CRD(Custom Resource Definition)是k8s中扩展API的方式,它允许你定义一种新的资源类型,看起来和k8s中原生的资源一样。

Controller是什么

Controller负责不断检查集群中的资源对象是否符合预期(Spec),对其不断的协调(reconcile)。

Operator 是什么

Operator是通过自定义资源(CRD)和自定义的控制器(controller),实现对应用的自动化管理。

k8s中资源表示符 GVK 和 GVR

在k8s中,GVK(Group, Version, Kind)和 GVR(Group, Version, Resource)是用于标识和访问 Kubernetes 资源的两个重要概念。
  • Group:API 组的名称。例如,apps 组包含 Deployment、StatefulSet 等资源,batch 组包含 Job、CronJob 等资源。
  • Version:API 版本。每个资源在 Kubernetes 中可能会有多个版本(如 v1v1beta1v1alpha1 等),每个版本可能会有不同的功能和行为
  • Kind:资源的类型。通常是资源的单数形式,如 PodDeploymentService
  • Resource:资源的名称。通常是复数形式,如 podsdeploymentsservices
具体区别:
  • GVK 里的 Kind 是单数;GVR 里的 Resource 是复数
  • GVK用于标识k8s资源的类型,资源的序列化和反序列化;GVR用于标识 k8s Restful API的端点,适用于client-go 访问k8s资源

声明式的API

k8s 使用声明式API,所谓声明式就是“你告诉k8s你想要什么,而不是告诉他具体如何做什么命令”

利用kubebuilder进行Operator的开发

大体的开发步骤

  1. 使用kubebuilder 初始化项目
  1. 创建api对象,填写spec和status
  1. 实现controller
  1. 创建webhook(可选)
  1. 本地开发调试
  1. 构建镜像并生成部署manifest

安装kubebuilder

项目初始化

你的 API Group 最终会是 <resource-name>.<version>.<domain>,例如 application.v1.crd.forrest.com

创建 API对象

创建webhook(可选

 

make相关的指令

本地开发和调试

构建和部署

reconcile的大体架构模式

一个典型的 Reconcile 实现通常包含以下主要步骤:
 

细节部分

OwnerReference 的使用

  • 用途:实现资源的级联删除和自动触发调谐
  • 实现方式:使用 controllerutil.SetControllerReference(&app, &deploy, r.Scheme)
  • 好处:
    • 自动级联删除子资源
    • 子资源变更自动触发 owner 的调谐
    • 简化代码逻辑

Finalizers 的使用

  • 用途:确保资源删除前进行必要的清理工作
  • 关键逻辑:
    • 新建资源时添加 Finalizer
    • 删除时先执行清理,再移除 Finalizer
  • 实现建议:

    Event 记录

    在Reconciler对象上增加 Recorder字段
    同时,启动时初始化
    • 建议:只记录重要节点的事件,避免过多事件影响集群性能
    • 实现方式:

      Watching resources

      除了设置OwnerReference,从而来自动监听子资源,也可以手动设置watch的资源是什么。

      Watching Secondary Resources that are NOT Owned(如何监听不是子资源的变更

      通过 EnqueueRequestsFromMapFunc 从 Deploy 触发 Application。
      这里的逻辑是:如果一个带有app label的Deployment发送变化时,controller会自动触发AppService的reconcile。这是一种补充机制,用于处理那些可能与AppService 相关,但不是通过 OwnerReference 直接关联的 Deployment 资源。

      using predicates to refine watches(优化watch

      Predicates 是一种事件过滤机制,用于优化控制器的调谐触发条件,确保只对关心的变更做出响应。
      定义一种predicate
      在manager中使用predicate

      Webhook的开发

      k8s 中的Admission Webhook 

      mutating Admission webhook

      • 执行时机:对象持久化之前执行
      • 主要的功能:
        • 修改请求中的对象
        • 设置一些默认值
        • 注入sidecar容器,修改或添加label/annotation等等
      比较常见的使用场景有:自动注入service Account、为pod添加envs、自动添加sidecar(比如istio中)、设置资源的默认值

      validating Admission Webhook

      • 执行时机:在 Mutating webhook 之后执行
      • 主要功能
        • 验证请求的合法性
        • 实施自定义策略
        • 拒绝不符合要求的请求
      比较常见的使用场景有:强制资源的命名规范、验证资源的配置是否符合安全策略、确保镜像来源的可靠性、限制资源的配额等等
      整体的执行顺序是
       
       

      Reference

       
      使用kubebuilder开发operator详解
      基础概念 命令式和声明式 命令式编程(Imperative):详细的命令机器怎么(How)去处理一件事情以达到你想要的结果(What),比如代码详细实现过程。 声明式编程( Declarative):只告诉你想要的结果(What),机器自己摸索过程(How),比如sql查询结果。 简而言之:越接近现实的表达就越“声明式”,越接近于机器的执行过程就越“命令式”。 例如在kubernetes中使用此两种方式来创建服务: 命令式 创建:kubectl create deployment nginx --image nginx 或者 kubectl create -f nginx.yaml 修改:kubectl replace -f nginx.yaml 声明式 创建:kubectl apply -f configs/ 或者 kubectl apply -f nginx.yaml 修改:kubectl apply -f nginx.yaml 从以上两种方式可以看出:声明式对象配置更好地支持对目录进行操作并自动检测每个文件的操作类型(创建,修补,删除),但声明式对象配置难于调试并且出现异常时结果难以理解。 Kubernetes API 在kubernetes集群中,所有需要数据存取的组件都需要和kube-apiserver组件通信,而集群数据都是保存在etcd中。同时,kubernetes也大量使用了声明式api来提高用户开发和使用效率,而其api分别由Group(API 组)、Version(API 版本)和 Resource(API 资源类型)组成。如下图所示: 我们也可以使用以下命令查看有哪些api及其组成方式: kubectl get --raw / { "paths": [ "/api", "/api/v1", "/apis/apps", "/apis/apps/v1", "/apis/batch", "/apis/batch/v1", "/apis/batch/v1beta1", "/apis/apps.
       
      Prev
      SSE
      Next
      我的MBTI
      Loading...
      Article List
      如果去做,还有一丝希望;但是不去做,就毫无希望
      个人总结
      技术分享
      LLM
      k8s
      knative
      agentic
      istio
      HAMI
      Golang
      转发
      计算机网络
      Redis
      MySQL
      Mysql