Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 884263f

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

File tree

7 files changed

+507
-42
lines changed

7 files changed

+507
-42
lines changed

‎README.md‎

Lines changed: 1 addition & 1 deletion
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‎

Lines changed: 12 additions & 38 deletions
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‎

Lines changed: 50 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /