K8s核心资源对象-CRD

基于1.25

什么是CRD

K8s的拓展主要通过几类实现:

  • 客户端拓展:实现kubectl插件
  • API拓展:包含使用CRD
  • API访问拓展:在请求到达kube-apiserver之前,经过的认证、授权、动态准入都可以拓展
  • 基础设施拓展:设备拓展啊发现新的节点资源、存储插件、网络插件

最广泛使用的目前还是从1.7版本出现的CRD,属于资源组apiextension.k8s.io

// +genclient
// +genclient:nonNamespaced
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +k8s:prerelease-lifecycle-gen:introduced=1.16

// CustomResourceDefinition represents a resource that should be exposed on the API server. Its name MUST be in the format
// <.spec.name>.<.spec.group>.
type CustomResourceDefinition struct {
metav1.TypeMeta `json:",inline"`
// Standard object's metadata
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
// +optional
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`

// spec describes how the user wants the resources to appear
Spec CustomResourceDefinitionSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
// status indicates the actual state of the CustomResourceDefinition
// +optional
Status CustomResourceDefinitionStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}

Operator

Operator是特定的应用程序控制器,通过K8s拓展的API实现K8s的的实例管理

Controller-runtime

Controller-runtime是一组用于构建K8s控制器的Go库。被Kubebuilder和OperatorSDK利用,目的是快速构建Operator

核心数据结构

Controller-runtime的核心数据结构如下:

  • Manager定义了管理多个控制器的接口,controllerManager是具体实现类
  • controllerManager包含了多种类型的runnables,每种类型的runnables可以存放多个Controller
  • 每种CRD资源对应一个Controller,Controller实现了Reconciler接口
  • Reconciler支持控制器循环,主要是实现Reconciler中的Reconcilefunc
  • Builder负责构建Controller,并且吧controllerManager和COntroller联系起来

关键流程

  1. ctrl.NewManager func初始化controllerManager
  2. SetupWithManager func内部初始化了Builder构造器,通过Builder构造器的Complete func完成Controller的创建,以及把Controller添加到Manager中,最后完成Informer初始化并且注册监听函数
  3. mgr.Start启动Manager,内部依次启动注册所有的Controller,最后调用客户实现的Reconcile

Kubebuilder

Kubebuilder是用于创建K8s API以及运行时的框架

初始化流程图

基于3.9.1