learn k8s
k8s Store的类型
- cache: 实现Store,利用threadSafeMap存放数据
- UndeltaStore: 实现Store,利用cache存放数据,数据变更时通过PushFunc发送当前完整状态
- FIFO: 实现Queue(包含Store),利用自己内部的items数据结构存放数据
- DeltaFIFO
- 处理每个对象的变化最多一次
- 处理一个对象时,希望知道这个对象与你上次处理时,发生了哪些变化
- 希望一个对象删除时,仍然能够处理它
- 能够周期性重新处理所有的对象
- Heap: 实现Store,利用data数据结构存放数据,实现堆数据结构,用于优先队列
- ExpirationCache: 实现Store,利用threadSafeMap存放数据
k8s crd
在k8s系统扩展中,开发者可以通过CRD(CustomResourceDefinition)来扩展k8s API,其功能主要由APIExtensionServe负责。 使用CRD扩展资源分为三步:
- 注册自定义资源:开发者需要通过k8s提供的方式注册自定义资源,即通过CRd进行注册,注册之后,k8s就知道我们自定义资源的存在了,然后我们就可以像使用k8s内置资源一样使用自定义资源(CR)
- 使用自定义资源:像内置资源比如Pod一样声明资源,使用CR声明我们的资源
- 删除最定义资源:当我们不再需要时,可以删除自定义资源
如何操作自定义资源
client-go为每种k8s内置资源提供对应的clientset和informer。有两种方式可以来处理
- 使用client-go提供的dynamicClient来操作自定义资源对象,当然由于dynamicClient是基于RESTClient实现的,我们也可以使用RESTClient来达到同样的目的。
- 使用code-generator来帮助我们生成需要的代码,就可以像使用client-go为k8s内置资源对象提供的方式监听和操作自定义资源。
Finalizers
Finalizers 能够让控制器实现异步的删除前(Pre-delete)回调。与内置对象类似,定制对象也支持 Finalizers
code-generator
git clone https://github.com/kubernetes/code-generator
go install cmd/{client-gen,xxx}
编写代码
拷贝这些目录的相关代码
./generate-groups.sh all github.com/operator-crd/pkg/generated github.com/operator-crd/pkg/apis crd/example.com:v1 --go-header-file=hack/boilerplate.go.txt --output-base ../../