Lister 接口

Lister 接口

Lister 是可以通过对象名称、命名空间、标签选择器等查询条件 Get 或 List 对象的接口,一般是基于 Indexer 实现。
使用 codegen 工具可以为各资源类型生成类型相关的 InformerLister

GenericLister 和 GenericNamespaceLister 接口

这两种 Lister 接口都基于 Indexer 实现,可以通过对象名称、命名空间、标签选择器等查询条件 Get 或 List Indexer 中的对象(返回的是实现 runtime.Object 接口的通用对象类型,需要再类型转换为特定对象)。

两者的差别在于 GenericLister 不限 Namespace,而 GenericNamespaceLister 只能 Get/List 特定 Namespace 中的对象。

// 来源于 k8s.io/client-go/tools/cache/listers.go
type GenericLister interface {
	List(selector labels.Selector) (ret []runtime.Object, err error)
	Get(name string) (runtime.Object, error)
	ByNamespace(namespace string) GenericNamespaceLister
}

type GenericNamespaceLister interface {
	List(selector labels.Selector) (ret []runtime.Object, err error)
	Get(name string) (runtime.Object, error)
}

type genericLister struct {
	indexer  Indexer
	resource schema.GroupResource
}

type genericNamespaceLister struct {
	indexer   Indexer
	namespace string
	resource  schema.GroupResource
}

函数 NewGenericLister() 返回一个实现 GenericLister 接口的对象:

// 来源于 k8s.io/client-go/tools/cache/listers.go
func NewGenericLister(indexer Indexer, resource schema.GroupResource) GenericLister {
	return &genericLister{indexer: indexer, resource: resource}
}
  • 传入的 resource 只用于错误信息,显示 Group 和 Resource 名称。

codegent 生成的特定资源类型的 Informer 和 Lister

实际开发时,一般用 codegen 工具自动生成对象类型相关的 Informer 和 Lister,Informer 从 apiserver List/Watch 资源对象,保存到内部 Indexer 缓存,
保证 Indexer 缓存中的对象和 etcd 一致,所以可以使用 Informer 创建 Lister,而且 Lister 中的对象和 etcd 一致:

kubeInformerFactory := kubeinformers.NewFilteredSharedInformerFactory(kubeClient, config.RsyncPeriod, metav1.NamespaceAll, listOptionsFunc)
// 创建 Informer
deployInformer := kubeInformerFactory.Extensions().V1beta1().Deployments()
// 从 Informer 获取 Lister
aolDeployLister := aolDeployInformer.Lister()
// 通过 Lister List 对象
aolDeployes, err := aolDeployLister.List(labels.Selector{"app": "aol"})
// 通过 Lister Get 对象
aolDeploy, err := aolDeployLister.Deployments("my-namespace").Get("deployName")

client-go 包的 listerinformers 目录下,分别有各内置对象的 ListerInformer 定义,如 DeployLister

// 来源于 k8s.io/client-go/informers/apps/v1/deployment.go
type DeploymentInformer interface {
	// 返回通用的 SharedIndexInformer
	Informer() cache.SharedIndexInformer
	// 返回对象相关的 Lister
	Lister() v1.DeploymentLister
}
// 对象的 Informer 包含 Indexer,所以可以使用 Informer 创建 Lister
func (f *deploymentInformer) Lister() v1.DeploymentLister {
	return v1.NewDeploymentLister(f.Informer().GetIndexer())
}

函数 NewDeploymentLister 返回一个 DeploymentLister,传入的是从 DeploymentInformer 获取的 Indexer:

// 来源于 k8s.io/client-go/listers/apps/v1/deployment.go
// NewDeploymentLister returns a new DeploymentLister.
func NewDeploymentLister(indexer cache.Indexer) DeploymentLister {
	return &deploymentLister{indexer: indexer}
}

type DeploymentLister interface {
	// 列出所有 Namespace 中匹配 selector 的 Deployment 对象列表(非 runtime.Object 列表);
	List(selector labels.Selector) (ret []*v1.Deployment, err error)
	Deployments(namespace string) DeploymentNamespaceLister
	DeploymentListerExpansion
}

DeploymentNamespaceLister Get/List 特定 Namespace 中的 Deployment:

// 来源于 k8s.io/client-go/listers/apps/v1/deployment.go
type DeploymentNamespaceLister interface {
	// List lists all Deployments in the indexer for a given namespace.
	List(selector labels.Selector) (ret []*v1.Deployment, err error)
	// Get retrieves the Deployment from the indexer for a given namespace and name.
	Get(name string) (*v1.Deployment, error)
	DeploymentNamespaceListerExpansion
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值