Skip to content

Commit 884263f

Browse files
author
Zhang Jun
committed
WIP: update
1 parent 86d098d commit 884263f

7 files changed

+507
-42
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# kubernetes-dev-docs
22

3-
Kuberntes 开发文档
3+
Kubernetes 源码解析和实践

client-go/4.sharedInformer.md renamed to client-go/4.informer.md

+12-38
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# SharedInformer
1+
# Informer
22

33
<!-- TOC -->
44

5-
- [SharedInformer](#sharedinformer)
5+
- [Informer](#informer)
66
- [processorListener](#processorlistener)
77
- [add() 方法](#add-方法)
88
- [pop() 方法](#pop-方法)
@@ -21,11 +21,11 @@
2121
- [HandleDeltas() 方法](#handledeltas-方法)
2222
- [WaitForCacheSync() 函数](#waitforcachesync-函数)
2323
- [codegen 为特定资源类型创建的 SharedIndexInformer](#codegen-为特定资源类型创建的-sharedindexinformer)
24-
- [SharedInformer 的使用场景](#sharedinformer-的使用场景)
25-
- [GenericInformer 接口](#genericinformer-接口)
2624

2725
<!-- /TOC -->
2826

27+
Inforer 的主要使用场景是自定义 Controller,它需要从 apiserver List/Watch 特定类型的资源对象的所有事件,缓存到内存,供后续快速查找,根据事件类型,调用用户注册的回调函数。
28+
2929
[前面分析了] (3.listwatch-reflector-controller.md) NewInformer()、NewIndexInformer() 函数使用 controller 的 Reflector List/Watch 特定资源类型的对象,缓存到本地,并调用用户设置的 OnAdd/OnUpdate/OnDelete 回调函数(保存在 ResourceEventHandler 中)。
3030

3131
这两个函数返回的 Store 和 Index 都缓存了从 apiserver List/Watch 更新的资源类型对象,并保持与 etcd 同步。另外,可以使用 Index 创建 Lister,进而更方便的从本地缓存中 List 和 Get 符合条件的资源对象。
@@ -38,6 +38,8 @@ SharedInformer 提供一个共享的对象缓存,并且可以将缓存中对
3838

3939
SharedInformer 和 SharedIndexInformer 一般和 workqueue 同时使用,具体参考:[8.customize-controller.md](8.customize-controller.md)
4040

41+
在分析 SharedInformer 和 SharedIndexInformer 之前,先分析它使用的 processorListener 和 sharedProcessor 结构类型。
42+
4143
## processorListener
4244

4345
processorListener 封装了监听器处理函数 ResourceEventHandler 以及 RingGrowing 类型的循环队列。
@@ -307,9 +309,9 @@ type SharedInformer interface {
307309
// GetStore returns the Store.
308310
GetStore() Store
309311
// GetController gives back a synthetic interface that "votes" to start the informer
310-
GetController() Controller
311-
// Run starts the shared informer, which will be stopped when stopCh is closed.
312-
Run(stopCh <-chan struct{})
312+
GetContrtarts the shared informer, which will be stopped when stopCh is closed.
313+
Run(stopoller() Controller
314+
// Run sCh <-chan struct{})
313315
// HasSynced returns true if the shared informer's store has synced.
314316
HasSynced() bool
315317
// LastSyncResourceVersion is the resource version observed when last synced with the underlying
@@ -355,6 +357,8 @@ func NewSharedIndexInformer(lw ListerWatcher, objType runtime.Object, defaultEve
355357

356358
+ 传给 NewSharedIndexInformer () 的 indexers 一般是 `cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}`,然后用 `DeletionHandlingMetaNamespaceKeyFunc` 作为对象的 KeyFunc 创建 Indexer 缓存;
357359

360+
后文会介绍,一般情况下,我们不需要使用 NewSharedInformer() 和 NewSharedIndexInformer() 函数为特定资源类型创建 SharedInformer,而是使用 codegen 为特定资源类型创建的 NewXXXInformer() 和 NewFilteredXXXInformer() 函数来创建。
361+
358362
### 实现 SharedIndexInformer 接口的 sharedIndexInformer 类型
359363

360364
这两个 Informer 包含:
@@ -773,6 +777,7 @@ func (f *deploymentInformer) Lister() v1.DeploymentLister {
773777
return v1.NewDeploymentLister(f.Informer().GetIndexer())
774778
}
775779
```
780+
776781
+ client 一般是 client-go 的 kubernets 或 CRD 的 clientset,如:
777782

778783
``` go
@@ -797,34 +802,3 @@ func (f *deploymentInformer) Lister() v1.DeploymentLister {
797802

798803
一般情况下,我们不直接使用上面的 NewXXX 函数创建各资源类型的 SharedInformer,而是使用 codegen 生成的 sharedInformerFactory 来创建它们,具体参考:[6.sharedInformerFactory.md](6.sharedInformerFactory.md)
799804

800-
### SharedInformer 的使用场景
801-
802-
SharedInforer 的主要使用场景是自定义 Controller,它需要从 apiserver List/Watch 特定类型的资源对象的所有事件,缓存到内存,供后续快速查找,根据事件类型,调用用户注册的回调函数。
803-
804-
## GenericInformer 接口
805-
806-
``` go
807-
// 来源于 k8s.io/client-go/informers/generic.go
808-
type GenericInformer interface {
809-
Informer() cache.SharedIndexInformer
810-
Lister() cache.GenericLister
811-
}
812-
```
813-
814-
内置类型 genericInformer 实现了该接口:
815-
816-
``` go
817-
type genericInformer struct {
818-
informer cache.SharedIndexInformer
819-
resource schema.GroupResource
820-
}
821-
// Informer returns the SharedIndexInformer.
822-
func (f *genericInformer) Informer() cache.SharedIndexInformer {
823-
return f.informer
824-
}
825-
826-
// Lister returns the GenericLister.
827-
func (f *genericInformer) Lister() cache.GenericLister {
828-
return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource)
829-
}
830-
```

client-go/6.sharedInformerFactory.md

+50
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
- [使用 InformerFactory 创建特定资源类型的 SharedIndexInformer 过程分析](#使用-informerfactory-创建特定资源类型的-sharedindexinformer-过程分析)
1414
- [extensions informers](#extensions-informers)
1515
- [extensions v1beat1 informers](#extensions-v1beat1-informers)
16+
- [GenericInformer 接口](#genericinformer-接口)
1617

1718
<!-- /TOC -->
1819

@@ -394,3 +395,52 @@ func (f *deploymentInformer) Lister() v1beta1.DeploymentLister {
394395
return v1beta1.NewDeploymentLister(f.Informer().GetIndexer())
395396
}
396397
```
398+
399+
## GenericInformer 接口
400+
401+
GenericInformer 接口封装了 SharedIndexInformer 接口,codegen 为各 K8S 资源类型生成的 XXXInformer(如上面的 DeploymentInformer) 均实现了该接口:
402+
403+
``` go
404+
// 来源于 k8s.io/client-go/informers/generic.go
405+
type GenericInformer interface {
406+
Informer() cache.SharedIndexInformer
407+
Lister() cache.GenericLister
408+
}
409+
```
410+
411+
内置类型 genericInformer 实现了该接口:
412+
413+
``` go
414+
type genericInformer struct {
415+
informer cache.SharedIndexInformer
416+
resource schema.GroupResource
417+
}
418+
// Informer returns the SharedIndexInformer.
419+
func (f *genericInformer) Informer() cache.SharedIndexInformer {
420+
return f.informer
421+
}
422+
423+
// Lister returns the GenericLister.
424+
func (f *genericInformer) Lister() cache.GenericLister {
425+
return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource)
426+
}
427+
```
428+
429+
一般情况下,我们可用通过以下两种方式创建 GenericInformer 接口:
430+
431+
1. 直接使用 codegen 为各 K8S 资源类型生成的 XXXInformer;
432+
2. 或者使用 sharedInformerFactory 的 ForResource() 方法;
433+
434+
435+
``` go
436+
// 来源于 8s.io/client-go/informers/generic.go
437+
func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
438+
switch resource {
439+
...
440+
// Group=extensions, Version=v1beta1
441+
case extensionsv1beta1.SchemeGroupVersion.WithResource("deployments"):
442+
return &genericInformer{resource: resource.GroupResource(), informer: f.Extensions().V1beta1().Deployments().Informer()}, nil
443+
...
444+
}
445+
}
446+
```

0 commit comments

Comments
 (0)