国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

client-go 之 Reflector 源碼分析

共 3643字,需瀏覽 8分鐘

 ·

2020-08-23 15:17

圖片來源:https://unsplash.com/photos/mFl5WwGJnTs


前面我們說了 Informer 通過對(duì) APIServer 的資源對(duì)象執(zhí)行 List 和 Watch 操作,把獲取到的數(shù)據(jù)存儲(chǔ)在本地的緩存中,其中實(shí)現(xiàn)這個(gè)的核心功能就是 Reflector,我們可以稱其為反射器,從名字我們可以看出來它的主要功能就是反射,就是將 Etcd 里面的數(shù)據(jù)反射到本地存儲(chǔ)(DeltaFIFO)中。Reflector 首先通過 List 操作獲取所有的資源對(duì)象數(shù)據(jù),保存到本地存儲(chǔ),然后通過 Watch 操作監(jiān)控資源的變化,觸發(fā)相應(yīng)的事件處理,比如前面示例中的 Add 事件、Update 事件、Delete 事件。

Reflector 結(jié)構(gòu)體的定義位于 staging/src/k8s.io/client-go/tools/cache/reflector.go 下面:

// k8s.io/client-go/tools/cache/reflector.go
// Reflector(反射器) 監(jiān)聽指定的資源,將所有的變化都反射到給定的存儲(chǔ)中去type Reflector struct { // name 標(biāo)識(shí)這個(gè)反射器的名稱,默認(rèn)為 文件:行數(shù)(比如reflector.go:125) // 默認(rèn)名字通過 k8s.io/apimachinery/pkg/util/naming/from_stack.go 下面的 GetNameFromCallsite 函數(shù)生成 name string
// 期望放到 Store 中的類型名稱,如果提供,則是 expectedGVK 的字符串形式 // 否則就是 expectedType 的字符串,它僅僅用于顯示,不用于解析或者比較。 expectedTypeName string // 我們放到 Store 中的對(duì)象類型 expectedType reflect.Type // 如果是非結(jié)構(gòu)化的,我們期望放在 Sotre 中的對(duì)象的 GVK expectedGVK *schema.GroupVersionKind // 與 watch 源同步的目標(biāo) Store store Store // 用來執(zhí)行 lists 和 watches 操作的 listerWatcher 接口(最重要的) listerWatcher ListerWatcher
// backoff manages backoff of ListWatch backoffManager wait.BackoffManager
resyncPeriod time.Duration // ShouldResync 會(huì)周期性的被調(diào)用,當(dāng)返回 true 的時(shí)候,就會(huì)調(diào)用 Store 的 Resync 操作 ShouldResync func() bool
clock clock.Clock paginatedResult bool // Kubernetes 資源在 APIServer 中都是有版本的,對(duì)象的任何修改(添加、刪除、更新)都會(huì)造成資源版本更新,lastSyncResourceVersion 就是指的這個(gè)版本 lastSyncResourceVersion string // 如果之前的 list 或 watch 帶有 lastSyncResourceVersion 的請(qǐng)求中是一個(gè) HTTP 410(Gone)的失敗請(qǐng)求,則 isLastSyncResourceVersionGone 為 true isLastSyncResourceVersionGone bool // lastSyncResourceVersionMutex 用于保證對(duì) lastSyncResourceVersion 的讀/寫訪問。 lastSyncResourceVersionMutex sync.RWMutex WatchListPageSize int64}
// NewReflector 創(chuàng)建一個(gè)新的反射器對(duì)象,將使給定的 Store 保持與服務(wù)器中指定的資源對(duì)象的內(nèi)容同步。// 反射器只把具有 expectedType 類型的對(duì)象放到 Store 中,除非 expectedType 是 nil。// 如果 resyncPeriod 是非0,那么反射器會(huì)周期性地檢查 ShouldResync 函數(shù)來決定是否調(diào)用 Store 的 Resync 操作// `ShouldResync==nil` 意味著總是要執(zhí)行 Resync 操作。// 這使得你可以使用反射器周期性地處理所有的全量和增量的對(duì)象。func NewReflector(lw ListerWatcher, expectedType interface{}, store Store, resyncPeriod time.Duration) *Reflector { // 默認(rèn)的反射器名稱為 file:line return NewNamedReflector(naming.GetNameFromCallsite(internalPackages...), lw, expectedType, store, resyncPeriod)}
// NewNamedReflector 與 NewReflector 一樣,只是指定了一個(gè) name 用于日志記錄func NewNamedReflector(name string, lw ListerWatcher, expectedType interface{}, store Store, resyncPeriod time.Duration) *Reflector { realClock := &clock.RealClock{} r := &Reflector{ name: name, listerWatcher: lw, store: store, backoffManager: wait.NewExponentialBackoffManager(800*time.Millisecond, 30*time.Second, 2*time.Minute, 2.0, 1.0, realClock), resyncPeriod: resyncPeriod, clock: realClock, } r.setExpectedType(expectedType) return r}

從源碼中我們可以看出來通過 NewReflector 實(shí)例化反射器的時(shí)候,必須傳入一個(gè) ListerWatcher 接口對(duì)象,這個(gè)也是反射器最核心的功能,該接口擁有 List 和 Watch 方法,用于獲取和監(jiān)控資源對(duì)象。

// k8s.io/client-go/tools/cache/listwatch.go
// Lister 是知道如何執(zhí)行初始化List列表的對(duì)象type Lister interface { // List 應(yīng)該返回一個(gè)列表類型的對(duì)象; // Items 字段將被解析,ResourceVersion 字段將被用于正確啟動(dòng) watch 的地方 List(options metav1.ListOptions) (runtime.Object, error)}
// Watcher 是知道如何執(zhí)行 watch 操作的任何對(duì)象type Watcher interface { // Watch 在指定的版本開始執(zhí)行 watch 操作 Watch(options metav1.ListOptions) (watch.Interface, error)}
// ListerWatcher 是任何知道如何對(duì)一個(gè)資源執(zhí)行初始化List列表和啟動(dòng)Watch監(jiān)控操作的對(duì)象type ListerWatcher interface { Lister Watcher}

而 Reflector 對(duì)象通過 Run 函數(shù)來啟動(dòng)監(jiān)控并處理監(jiān)控事件的:

// k8s.io/client-go/tools/cache/reflector.go
// Run 函數(shù)反復(fù)使用反射器的 ListAndWatch 函數(shù)來獲取所有對(duì)象和后續(xù)的 deltas。// 當(dāng) stopCh 被關(guān)閉的時(shí)候,Run函數(shù)才會(huì)退出。func (r *Reflector) Run(stopCh <-chan struct{}) { klog.V(2).Infof("Starting reflector %s (%s) from %s", r.expectedTypeName, r.resyncPeriod, r.name) wait.BackoffUntil(func() { if err := r.ListAndWatch(stopCh); err != nil { utilruntime.HandleError(err) } }, r.backoffManager, true, stopCh) klog.V(2).Infof("Stopping reflector %s (%s) from %s", r.expectedTypeName, r.resyncPeriod, r.name)}

所以不管我們傳入的 ListWatcher 對(duì)象是如何實(shí)現(xiàn)的 List 和 Watch 操作,只要實(shí)現(xiàn)了就可以,最主要的還是看 ListAndWatch 函數(shù)是如何去實(shí)現(xiàn)的,如何去調(diào)用 List 和 Watch 的:

// k8s.io/client-go/tools/cache/reflector.go
// ListAndWatch 函數(shù)首先列出所有的對(duì)象,并在調(diào)用的時(shí)候獲得資源版本,然后使用該資源版本來進(jìn)行 watch 操作。// 如果 ListAndWatch 沒有初始化 watch 成功就會(huì)返回錯(cuò)誤。func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { klog.V(3).Infof("Listing and watching %v from %s", r.expectedTypeName, r.name) var resourceVersion string
options := metav1.ListOptions{ResourceVersion: r.relistResourceVersion()}
if err := func() error { initTrace := trace.New("Reflector ListAndWatch", trace.Field{"name", r.name}) defer initTrace.LogIfLong(10 * time.Second) var list runtime.Object var paginatedResult bool var err error listCh := make(chan struct{}, 1) panicCh := make(chan interface{}, 1) go func() { defer func() { if r := recover(); r != nil { panicCh <- r } }() // 如果 listWatcher 支持,會(huì)嘗試 chunks(分塊)收集 List 列表數(shù)據(jù) // 如果不支持,第一個(gè) List 列表請(qǐng)求將返回完整的響應(yīng)數(shù)據(jù)。 pager := pager.New(pager.SimplePageFunc(func(opts metav1.ListOptions) (runtime.Object, error) { return r.listerWatcher.List(opts) })) switch { case r.WatchListPageSize != 0: pager.PageSize = r.WatchListPageSize case r.paginatedResult: // 獲得一個(gè)初始的分頁結(jié)果。假定此資源和服務(wù)器符合分頁請(qǐng)求,并保留默認(rèn)的分頁器大小設(shè)置 case options.ResourceVersion != "" && options.ResourceVersion != "0": pager.PageSize = 0 }
list, paginatedResult, err = pager.List(context.Background(), options) if isExpiredError(err) { r.setIsLastSyncResourceVersionExpired(true) list, paginatedResult, err = pager.List(context.Background(), metav1.ListOptions{ResourceVersion: r.relistResourceVersion()}) } close(listCh) }() select { case <-stopCh: return nil case r := <-panicCh: panic(r) case <-listCh: } if err != nil { return fmt.Errorf("%s: Failed to list %v: %v", r.name, r.expectedTypeName, err) }
if options.ResourceVersion == "0" && paginatedResult { r.paginatedResult = true }
r.setIsLastSyncResourceVersionExpired(false) // list 成功 initTrace.Step("Objects listed") listMetaInterface, err := meta.ListAccessor(list) if err != nil { return fmt.Errorf("%s: Unable to understand list result %#v: %v", r.name, list, err) } // 獲取資源版本號(hào) resourceVersion = listMetaInterface.GetResourceVersion() initTrace.Step("Resource version extracted") // 將資源數(shù)據(jù)轉(zhuǎn)換成資源對(duì)象列表,將 runtime.Object 對(duì)象轉(zhuǎn)換成 []runtime.Object 對(duì)象 items, err := meta.ExtractList(list) if err != nil { return fmt.Errorf("%s: Unable to understand list result %#v (%v)", r.name, list, err) } initTrace.Step("Objects extracted") // 將資源對(duì)象列表中的資源對(duì)象和資源版本號(hào)存儲(chǔ)在 Store 中 if err := r.syncWith(items, resourceVersion); err != nil { return fmt.Errorf("%s: Unable to sync list result: %v", r.name, err) } initTrace.Step("SyncWith done") r.setLastSyncResourceVersion(resourceVersion) initTrace.Step("Resource version updated") return nil }(); err != nil { return err }
resyncerrc := make(chan error, 1) cancelCh := make(chan struct{}) defer close(cancelCh) go func() { resyncCh, cleanup := r.resyncChan() defer func() { cleanup() }() for { select { case <-resyncCh: case <-stopCh: return case <-cancelCh: return } // 如果 ShouldResync 為 nil 或者調(diào)用返回true,則執(zhí)行 Store 的 Resync 操作 if r.ShouldResync == nil || r.ShouldResync() { klog.V(4).Infof("%s: forcing resync", r.name) if err := r.store.Resync(); err != nil { resyncerrc <- err return } } cleanup() resyncCh, cleanup = r.resyncChan() } }()
for { // stopCh 一個(gè)停止循環(huán)的機(jī)會(huì) select { case <-stopCh: return nil default: }
timeoutSeconds := int64(minWatchTimeout.Seconds() * (rand.Float64() + 1.0)) // 設(shè)置watch的選項(xiàng),因?yàn)榍捌诹信e了全量對(duì)象,從這里只要監(jiān)聽最新版本以后的資源就可以了 // 如果沒有資源變化總不能一直掛著吧?也不知道是卡死了還是怎么了,所以設(shè)置一個(gè)超時(shí)會(huì)好一點(diǎn) options = metav1.ListOptions{ ResourceVersion: resourceVersion, TimeoutSeconds: &timeoutSeconds, AllowWatchBookmarks: true, }
start := r.clock.Now() // 執(zhí)行 Watch 操作 w, err := r.listerWatcher.Watch(options) if err != nil { switch { case isExpiredError(err): klog.V(4).Infof("%s: watch of %v closed with: %v", r.name, r.expectedTypeName, err) case err == io.EOF: // watch closed normally case err == io.ErrUnexpectedEOF: klog.V(1).Infof("%s: Watch for %v closed with unexpected EOF: %v", r.name, r.expectedTypeName, err) default: utilruntime.HandleError(fmt.Errorf("%s: Failed to watch %v: %v", r.name, r.expectedTypeName, err)) } if utilnet.IsConnectionRefused(err) { time.Sleep(time.Second) continue } return nil } // 調(diào)用 watchHandler 來處理分發(fā) watch 到的事件對(duì)象 if err := r.watchHandler(start, w, &resourceVersion, resyncerrc, stopCh); err != nil { if err != errorStopRequested { switch { case isExpiredError(err): klog.V(4).Infof("%s: watch of %v closed with: %v", r.name, r.expectedTypeName, err) default: klog.Warningf("%s: watch of %v ended with: %v", r.name, r.expectedTypeName, err) } } return nil } }}

首先通過反射器的 relistResourceVersion 函數(shù)獲得反射器 relist 的資源版本,如果資源版本非 0,則表示根據(jù)資源版本號(hào)繼續(xù)獲取,當(dāng)傳輸過程中遇到網(wǎng)絡(luò)故障或者其他原因?qū)е轮袛?,下次再連接時(shí),會(huì)根據(jù)資源版本號(hào)繼續(xù)傳輸未完成的部分??梢允贡镜鼐彺嬷械臄?shù)據(jù)與Etcd集群中的數(shù)據(jù)保持一致,該函數(shù)實(shí)現(xiàn)如下所示:

// k8s.io/client-go/tools/cache/reflector.go
// relistResourceVersion 決定了反射器應(yīng)該list或者relist的資源版本。// 如果最后一次relist的結(jié)果是HTTP 410(Gone)狀態(tài)碼,則返回"",這樣relist將通過quorum讀取etcd中可用的最新資源版本。// 返回使用 lastSyncResourceVersion,這樣反射器就不會(huì)使用在relist結(jié)果或watch事件中watch到的資源版本更老的資源版本進(jìn)行relist了func (r *Reflector) relistResourceVersion() string { r.lastSyncResourceVersionMutex.RLock() defer r.lastSyncResourceVersionMutex.RUnlock()
if r.isLastSyncResourceVersionGone { // 因?yàn)榉瓷淦鲿?huì)進(jìn)行分頁List請(qǐng)求,如果 lastSyncResourceVersion 過期了,所有的分頁列表請(qǐng)求就都會(huì)跳過 watch 緩存 // 所以設(shè)置 ResourceVersion="",然后再次 List,重新建立反射器到最新的可用資源版本,從 etcd 中讀取,保持一致性。 return "" } if r.lastSyncResourceVersion == "" { // 反射器執(zhí)行的初始 List 操作的時(shí)候使用0作為資源版本。 return "0" } return r.lastSyncResourceVersion}

上面的 ListAndWatch 函數(shù)實(shí)現(xiàn)看上去雖然非常復(fù)雜,但其實(shí)大部分是對(duì)分頁的各種情況進(jìn)行處理,最核心的還是調(diào)用 r.listerWatcher.List(opts) 獲取全量的資源對(duì)象,而這個(gè) List 其實(shí) ListerWatcher 實(shí)現(xiàn)的 List 方法,這個(gè) ListerWatcher 接口實(shí)際上在該接口定義的同一個(gè)文件中就有一個(gè) ListWatch 結(jié)構(gòu)體實(shí)現(xiàn)了:

// k8s.io/client-go/tools/cache/listwatch.go
// ListFunc 知道如何 List 資源type ListFunc func(options metav1.ListOptions) (runtime.Object, error)
// WatchFunc 知道如何 watch 資源type WatchFunc func(options metav1.ListOptions) (watch.Interface, error)
// ListWatch 結(jié)構(gòu)體知道如何 list 和 watch 資源對(duì)象,它實(shí)現(xiàn)了 ListerWatcher 接口。// 它為 NewReflector 使用者提供了方便的函數(shù)。其中 ListFunc 和 WatchFunc 不能為 nil。type ListWatch struct { ListFunc ListFunc WatchFunc WatchFunc // DisableChunking 對(duì) list watcher 請(qǐng)求不分塊。 DisableChunking bool}
// 列出一組 APIServer 資源func (lw *ListWatch) List(options metav1.ListOptions) (runtime.Object, error) { return lw.ListFunc(options)}
// Watch 一組 APIServer 資源func (lw *ListWatch) Watch(options metav1.ListOptions) (watch.Interface, error) { return lw.WatchFunc(options)}

當(dāng)我們真正使用一個(gè) Informer 對(duì)象的時(shí)候,實(shí)例化的時(shí)候就會(huì)調(diào)用這里的 ListWatch 來進(jìn)行初始化,比如前面我們實(shí)例中使用的 Deployment Informer,

// k8s.io/client-go/informers/apps/v1/deployment.go
// NewFilteredDeploymentInformer 為 Deployment 構(gòu)造一個(gè)新的 Informer。// 總是傾向于使用一個(gè) informer 工廠來獲取一個(gè) shared informer,而不是獲取一個(gè)獨(dú)立的 informer,這樣可以減少內(nèi)存占用和服務(wù)器的連接數(shù)。func NewFilteredDeploymentInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().Deployments(namespace).List(context.TODO(), options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().Deployments(namespace).Watch(context.TODO(), options) }, }, &appsv1.Deployment{}, resyncPeriod, indexers, )}
func (f *deploymentInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { return NewFilteredDeploymentInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)}
func (f *deploymentInformer) Informer() cache.SharedIndexInformer { return f.factory.InformerFor(&appsv1.Deployment{}, f.defaultInformer)}

從上面代碼我們就可以看出來當(dāng)我們?nèi)フ{(diào)用一個(gè)資源對(duì)象的 Informer() 的時(shí)候,就會(huì)去調(diào)用上面的 NewFilteredDeploymentInformer 函數(shù)進(jìn)行初始化,而在初始化的使用就傳入了 cache.ListWatch 對(duì)象,其中就有 List 和 Watch 的實(shí)現(xiàn)操作,也就是說前面反射器在 ListAndWatch 里面調(diào)用的 ListWatcher 的 List 操作是在一個(gè)具體的資源對(duì)象的 Informer 中實(shí)現(xiàn)的,比如我們這里就是通過的 ClientSet 客戶端與 APIServer 交互獲取到 Deployment 的資源列表數(shù)據(jù)的,通過在 ListFunc 中的 client.AppsV1().Deployments(namespace).List(context.TODO(), options) 實(shí)現(xiàn)的,這下應(yīng)該好理解了吧。

獲取到了全量的 List 數(shù)據(jù)過后,通過 listMetaInterface.GetResourceVersion() 來獲取資源的版本號(hào),ResourceVersion(資源版本號(hào))非常重要,Kubernetes 中所有的資源都擁有該字段,它標(biāo)識(shí)當(dāng)前資源對(duì)象的版本號(hào),每次修改(CUD)當(dāng)前資源對(duì)象時(shí),Kubernetes API Server 都會(huì)更改 ResourceVersion,這樣 client-go 執(zhí)行 Watch 操作時(shí)可以根據(jù)ResourceVersion 來確定當(dāng)前資源對(duì)象是否發(fā)生了變化。

然后通過 meta.ExtractList 函數(shù)將資源數(shù)據(jù)轉(zhuǎn)換成資源對(duì)象列表,將 runtime.Object 對(duì)象轉(zhuǎn)換成 []runtime.Object 對(duì)象,因?yàn)槿揩@取的是一個(gè)資源列表。

接下來是通過反射器的 syncWith 函數(shù)將資源對(duì)象列表中的資源對(duì)象和資源版本號(hào)存儲(chǔ)在 Store 中,這個(gè)會(huì)在后面的章節(jié)中詳細(xì)說明。

最后處理完成后通過 r.setLastSyncResourceVersion(resourceVersion) 操作來設(shè)置最新的資源版本號(hào),其他的就是啟動(dòng)一個(gè) goroutine 去定期檢查是否需要執(zhí)行 Resync 操作,調(diào)用存儲(chǔ)中的 r.store.Resync() 來執(zhí)行,關(guān)于存儲(chǔ)的實(shí)現(xiàn)在后面和大家進(jìn)行講解。

緊接著就是 Watch 操作了,Watch 操作通過 HTTP 協(xié)議與 APIServer 建立長連接,接收Kubernetes API Server 發(fā)來的資源變更事件,和 List 操作一樣,Watch 的真正實(shí)現(xiàn)也是具體的 Informer 初始化的時(shí)候傳入的,比如上面的 Deployment Informer 中初始化的時(shí)候傳入的 WatchFunc,底層也是通過 ClientSet 客戶端對(duì) Deployment 執(zhí)行 Watch 操作 client.AppsV1().Deployments(namespace).Watch(context.TODO(), options) 實(shí)現(xiàn)的。

獲得 watch 的資源數(shù)據(jù)后,通過調(diào)用 r.watchHandler 來處理資源的變更事件,當(dāng)觸發(fā)Add 事件、Update 事件、Delete 事件時(shí),將對(duì)應(yīng)的資源對(duì)象更新到本地緩存(DeltaFIFO)中并更新 ResourceVersion 資源版本號(hào)。

// k8s.io/client-go/tools/cache/reflector.go
// watchHandler 監(jiān)聽 w 保持資源版本最新func (r *Reflector) watchHandler(start time.Time, w watch.Interface, resourceVersion *string, errc chan error, stopCh <-chan struct{}) error { eventCount := 0
defer w.Stop()
loop: for { select { case <-stopCh: return errorStopRequested case err := <-errc: return err case event, ok := <-w.ResultChan(): // 從 watch 中獲取事件對(duì)象 if !ok { break loop } if event.Type == watch.Error { return apierrors.FromObject(event.Object) } if r.expectedType != nil { if e, a := r.expectedType, reflect.TypeOf(event.Object); e != a { utilruntime.HandleError(fmt.Errorf("%s: expected type %v, but watch event object had type %v", r.name, e, a)) continue } } if r.expectedGVK != nil { if e, a := *r.expectedGVK, event.Object.GetObjectKind().GroupVersionKind(); e != a { utilruntime.HandleError(fmt.Errorf("%s: expected gvk %v, but watch event object had gvk %v", r.name, e, a)) continue } } meta, err := meta.Accessor(event.Object) if err != nil { utilruntime.HandleError(fmt.Errorf("%s: unable to understand watch event %#v", r.name, event)) continue } // 獲得當(dāng)前 watch 到資源的資源版本號(hào) newResourceVersion := meta.GetResourceVersion() switch event.Type { // 分發(fā)事件 case watch.Added: // Add 事件 err := r.store.Add(event.Object) if err != nil { utilruntime.HandleError(fmt.Errorf("%s: unable to add watch event object (%#v) to store: %v", r.name, event.Object, err)) } case watch.Modified: // Update 事件 err := r.store.Update(event.Object) if err != nil { utilruntime.HandleError(fmt.Errorf("%s: unable to update watch event object (%#v) to store: %v", r.name, event.Object, err)) } case watch.Deleted: // Delete 事件 err := r.store.Delete(event.Object) if err != nil { utilruntime.HandleError(fmt.Errorf("%s: unable to delete watch event object (%#v) from store: %v", r.name, event.Object, err)) } case watch.Bookmark: // `Bookmark` 意味著 watch 已經(jīng)同步到這里了,只要更新資源版本即可。 default: utilruntime.HandleError(fmt.Errorf("%s: unable to understand watch event %#v", r.name, event)) } // 更新資源版本號(hào) *resourceVersion = newResourceVersion r.setLastSyncResourceVersion(newResourceVersion) eventCount++ } }
watchDuration := r.clock.Since(start) if watchDuration < 1*time.Second && eventCount == 0 { return fmt.Errorf("very short watch: %s: Unexpected watch close - watch lasted less than a second and no items received", r.name) } klog.V(4).Infof("%s: Watch close - %v total %v items received", r.name, r.expectedTypeName, eventCount) return nil}

這就是 Reflector 反射器中最核心的 ListAndWatch 實(shí)現(xiàn),從上面的實(shí)現(xiàn)我們可以看出獲取到的數(shù)據(jù)最終都流向了本地的 Store,也就是 DeltaFIFO,所以接下來我們需要來分析 DeltaFIFO 的實(shí)現(xiàn)。




K8S進(jìn)階訓(xùn)練營,點(diǎn)擊下方圖片了解詳情

瀏覽 40
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 丁香五月网| 黄色一级片视频| 美女av免费| www免费视频在线观看播放| 欧美丰满人妻免费视频人| 亚洲欧洲精品成人久久曰影片| 欧美精品成人在线| 天天天天毛片| 久久99精品久久久久久水蜜桃| 黄色视频日本| 九色蝌蚪视频| 人人操人人操人人| 色情小电影免费网站观看网址在线播| 日韩欧美成人电影| 日韩无码视频播放| 无码视频观看| 91av在线免费播放| 青青艹在线视频| 亚洲第一综合网| 免费操逼视频在线观看| 久久人人网| 熟睡侵犯の奶水授乳在线| 农村新婚夜一级A片| 午夜福利成人网站| 久久无码黄片| 免费AV在线播放| 欧美A级视频在线观看| 91久热| 97无码免费| www.黄色电影| 大香蕉网站在线观看| 亚洲人成色777777无码| 伊人久久在线| 欧美中文日韩| WWWA级片| 日本一级黄色电影| 88av在线播放| 操逼综合| 亚洲无码久久精品| 狠狠干高清成人二区三区| 天天摸天天看| 国产真人一级a爱做片| 久热国产精品| 99在线小视频| 图片区视频区小说区| ThePorn精品无码| 中文字幕综合| 免费在线观看视频黄| 夜夜骑婷婷91| jizz视频| 蜜桃性视频| 五月天丁香| 操B久久| 国产av资源| 婷婷久久婷婷| www.伊人网| 嫩草国产| 天天天天日天天干| 久久永久免费精品人妻专区| 国产成人a亚洲精品| 欧美18禁| 亚洲va国产va天堂va久久| 免费黄网站在线观看| 日无码| 国产色网站| 免费黄片视频大全| 欧美日韩一二三区| 欧美性猛交XXXX乱大交HD| 亚洲国产精品自在自线| 美女天天肏| 日韩无码福利| 欧美色色网| 9l视频自拍蝌蚪9l成人蝌蚪 | 伊人网址| 中国黄色学生妹一级片| 亚洲精品18在线观看| 欧美成人一级| 色情一级AA片免费观看| 欧美在线日韩在线| 午夜精品久久久久久久99黑人| 在线aaa| 德国肥妇熟妇BBwBBw| 91成人一区二区三区| 三级毛片在线| 77q视频| 五月网站| 日韩性爱在线观看| 欧美十区| 欧美视频一区二区三区| 精品人妻午夜一区二区三区四区| 精品成人在线观看| 奶头和荫蒂添的好舒服囗交漫画| 一级a一级a爱片免费视频| 色欲大香蕉| 99九九99九九九99九他書對 | 亚洲免费观看高清完整版在线| 不卡无码中文字幕| 久久大香蕉| 中文AV字幕| a片在线观看视频| 欧美熟女性爱视频| 中文字幕乱码人妻二区三区| 久草手机视频在线观看| 丁香五月成人网| 欧美视频一区| 国产ww| 亚洲欧美成人在线视频| 婷婷色大师| 超碰人人干| 黑人大荫蒂女同互磨| 青青草成人AV| 自拍偷拍一区二区三区| 97无码视频| 亚洲国产成人电影| 国产成人综合在线| 亚洲成人第一网站| 天天日天天干天天操| 婷婷五月天无码| 狼友综合| 国产永久在线| 久久久亚洲AV无码精品色午夜| 免费看黄色视频| 亚洲精品无码a片| 中文字幕无码播放| 一本视频| 波多野结衣视频在线播放| 福利视频亚洲| 91.www91成人影视在线观看91成人网址9| 国产精品久久7777777精品无码| 久久久久久久久久久久久自慰小片| 中文字幕无码Av在线看| 成年人视频在线免费观看| 另类老妇极品BBWBBw| 99久久精彩视频| 波多野结衣久久| 91蜜桃在线| 黑人狂躁女人高潮视频| 免费无码蜜臀在线观看| 99热青青| 毛片黄片| 成人免费视频性爱| 操人妻视频| 欧美久草| 影音先锋天堂网| 一区二区三区四区五区| 国产综合无码| 欧美怕怕| 特黄特色免费大片| 91激情| 亚洲天堂网在线观看| 青青草国产亚洲精品久久| 黄色片在线观看视频| 中文无码不卡| 一起操在线视频| 天天摸天天摸| 蜜桃av秘一区二区三区| 亚洲AV无码乱码| 高h视频在线观看| 伊人久久av| 中文成人无字幕乱码精品区| 亚洲无码专区视频| 久久久国产一区| 伊人666| 日韩大吊| 北条麻纪视频| 鲁一鲁视频| 午夜毛片| 97福利视频| 久久一道本| 91做爱| 青青自拍视频| 在线免费观看中文字幕| 黄色小说视频网站| 丁香五月天社区| 欧美日韩在线视频免费观看| 91九色蝌蚪91POR成人| 国产一级特黄大片| 亚洲秘无码一区二区| 免费无码一区二区三区四区五区| 亚欧成人在线视频| 日韩午夜欧美精品一二三区| 国产精品久久久| 蜜桃视频网| 爱搞搞就要搞| 亚洲av电影在线观看| 特大妓女BBwBBWBBw| 日本精品黄色视频| 蜜臀av在线播放| 中文字字幕在线| 日韩视频91| 香蕉成人网站| 麻豆传媒免费观看| 四川少BBB搡BBB爽爽爽| a片视频免费| 免费日韩一级| 99re国产视频| 日韩五码在线| 亚洲成人精品一区二区| 国产又猛又黄又爽| 国产人妖TS重口系列网站观看| 夫妻-ThePorn| 在线观看操逼视频| 国产精品三级视频| 18岁成人毛片| 国产亲子乱XXXXinin| 大香蕉网伊| 无码精品视频在线观看| 日韩人妻无码中文字幕| 伊人91| 日韩一级黄| 91中文字幕在线| 色婷婷精品国产一区二区三区 | 91精品国自产在线观看| 少妇熟女网| 日韩视频一区二区| 天堂视频在线| 亚洲vs无码秘蜜桃少妇小说| 精品一区二区三区蜜桃臀www | AV在线免费网站| 狠狠躁日日躁夜夜躁A片小说免费| 国产色情视频在线观看| 国产成人精品123区免费视频| 欧美在线视频免费观看| 日本不卡中文字幕| 在线一级片| 大雞巴疯狂浓精合集| AAAA毛片视频| 欧美性爱高清| 97人操| 有码视频在线观看| 熟妇槡BBBB槡BBBB图| 波多野结衣一区二区三区在线观看 | 一级片在线免费看| 国产91免费| 色天天干| 成人精品三级麻豆| 老司机AV| 99热8| 成人做爰100片免费-百度| 国产精品3| 特黄色A级片视频| 桃花岛tⅴ+亚洲品质| 国产午夜成人免费看片无遮挡| 亚洲无码色| 大鸡吧在线视频| 婷婷五月天中文字幕| 初学影院WWWBD英语完整版在线观看 | 人人看,人人摸| 色屁屁草草影院ccyycom| 日本综合久久| 操逼动漫| 国产精品久久久一区二区三区| igao在线观看| 婷婷精品免费| 婷婷五月六月丁香| 神马午夜久久| 日本精品视频| 思思热在线视频播放| 天堂va欧美ⅴa亚洲va一夜| 亚洲精品久久久久久久久蜜桃| 特级西西444WWW视频| 亚洲精品国产AV| AAAA毛片视频| 六月丁香综合| 无码久| 中文乱伦视频| 三级片大香蕉| 性爱无码AV| 在线se| 亚洲一区二区在线视频| 欧美自拍偷拍| 精品国产乱码久久久久夜深人妻| AV牛牛| 亚洲撸撸| 国产肏屄视频| 美日韩在线观看| 亚洲中文AV在线| 麻豆激情视频| 天天操综合| 五月天干美女| 婷婷视频网| 麻豆乱伦视频| 久久伊人影院| 伊人久久大综合中文无码| www.豆花社区成人| 京东一热本色道久久爱| 91久色| 欧美综合视频在线观看| 91成人小视频| 99一区二区| 海滩AV黑人| 9一区二区三区| 欧美性BBB槡BBB槡BBB| 高清国产AV| 91免费在线视频观看| 欧美三级无码| 中文字幕无码高清| 在线观看AV91| 九一无码| 中文在线字幕高清电视剧| 91免费在线视频| 国产一区二区波多野结衣| 成人在线欧美| www.三级| 男人v天堂| 日韩性爱小视频| 影音先锋成人在线| 国产福利在线导航| 中文无码一区二区三区| 99视频在线| 黑人毛片91久久久久久| 伊人黄色电影| 91蝌蚪网| 久久大陆| 国产内射精品| 99免费精品视频| 亚洲AV免费在线| 日韩精品成人无码| 国产女人18毛片水真多18| av在线免费观看网址| 久久一区| 熟女人妻一区二区三区| 日韩综合在线观看| 青青草国产| 深爱激情五月婷婷| 亚洲精品蜜桃| 男人天堂网av| 在线观看你懂得| 亚洲成人77777| 亚洲欧洲日韩| 黄片视频链接| 亚洲黄片免费在线观看| 亚洲一级免费在线观看| 欧美性爱A片| 草久在线视频| 成年片免费观看网站免费观看,亚洲+欧... | 人妻中文无码| 日韩免费成人视频| 内射毛片| 免费视频A| 国产精品乱伦| 美女极度色诱图片www视频| 久久91久久久久麻豆精品| 天堂资源在线观看| 韩国中文字幕HD久久精品| 九九热re99re6在线精品| 精品欧美片在线观看步骤| 91精品电影| 国产成人在线精品| 国产精品无码成人AV在线播放 | 婷婷五月天丁香成人社区| 久久国产综合| 欧美色图视频在线观看| 一区二区三区四区免费| 欧美精品久久久久久久久| 亚洲天堂网在线观看| 色色激情网| 国内精品一区二区| 国产99自拍| 五月六月丁香激情视频| 天天干天天日天天色| 大香蕉久久久久久久| 中国操逼视频| 中文字幕一本道| 国产a级毛片| 影音先锋国产av| 午夜精品18视频国产17c| 日韩无码电| 操国产美女| 亚洲无码视频一区| 91妻人人澡人人爽人人精品| 国产av大全| 亚洲乱码中文字幕| av福利在线观看| www.蜜桃视频| 一本之道DVD不卡视频| 伊人99| 日日摸夜夜| 懂色在线精品分类视频| 国产棈品久久久久久久久久九秃 | 亚洲成人免费观看| 又粗又硬又爽18级A片| 精品一二三| 高潮毛片| 天天干天天干天天| 激情视频免费在线观看| 人人妻日日摸狠狠躁| 三级成人无码| 日韩一区二区三区免费视频| 国产无码AV| 在线观看免费成人网站| 中文字幕成人在线播放| 欧美一级黄色电影| 国产成人精品无码区在线| 一级操逼视频免费观看| 日韩精品中文字幕无码| 91精品午夜少妇| 亚洲影音| 日韩在线观看视频网站| WWWA级片| 日韩成人综合| 成人黄色小电影| 婷婷激情五月天丁香| 婷婷视频在线观看| 亚洲精品一级| 国产免费精彩视频| 大香蕉伊人在线观看视频| 国产成人精品免高潮在线观看| 青青草AV| a天堂8在线资源| 91麻豆电影| 三级片视频网站| 骚妇大战黑人15P| AV观看免费| 操逼在线视频| 啊v在线| 日韩视频免费在线| 久久久久成人电影| 9l农村站街老熟女| 黄色毛片在线播放| 六月伊人| 一级一A片一a免费看| www.蜜桃av| 色网在线观看| 午夜AAA| 久久久久无码国产精品一区| 91精品国久久久久久无码一区二区三区| 婷婷深爱五月| 91区视频| 亚洲中文免费视频| 起碰视频| 亚洲无码激情| 一区二区黄| 欧美日韩成人网| 密臀AV在线| 做aAAAAA免费视频| 操逼影视| 国产寡妇亲子伦一区二区三区四区| www.A片| TheAV精尽人亡av| 亚洲中文字幕在线观看| 成人一级黄片| 北条麻妃99精品青青久久| 色欲影视插综合一区二区三区| 成人免费毛片蓝莓| 东京热第一页| 中文字幕成人| 一级全黄120分钟免费| 国产黄片在线播放| 99色色| 91久久| 免费A片在线看| 熊猫视频91| 中文无码日本一级A片久久影视 | 亚洲中文字幕网站| 免费日批网站| 青草社区在线观看| 欧美一级黃色A片免费看小优视频 无码人妻精品一区二区三千菊电影 | 国产精品特级毛片| 天天撸天天操| 天天爽天天爽成人A片影院| 亚洲成人动漫在线| 午夜av在线| 北条麻妃99精品| 人人妻人人爱人人| 免费18蜜桃久久19| 99久久精品国产精品有折扣吗| 免费国产成人看片在线| 欧美大香蕉伊人网| 97人妻人人澡人人爽人人精品| 欧美婬乱片A片AAA毛片地址| 国产一级A片在线观看| 欧美操比视频| 欧美一区二区在线视频| 91免费看| 欧美天天性爱| 女女女女女女BBBBBB手| 日韩黄色毛片| 国产激情一区二区三区| 日韩一欧美| 精品在线免费观看| 丁香五月天在线| 99久久婷婷国产综合精品| 三级片网站国产| 亚洲av影院| 欧美亚洲日本| NP玩烂了公用爽灌满视频播放 | AA片在线观看视频在线播放| 2025AV天堂| 在线亚洲色图| 青青国产在线观看| 免费一级婬片AA片观看| 国产成人99久久亚洲综合精品 | 中文字幕无码Av在线| 精品蜜桃一区内容| 日日操视频| 国产中文视频| 免看一级a毛片一片成人不卡| 怡红院在线观看| 国产海角视频| 国产爱搞| 99这里有精品| 婷婷五月天影视| 国产字幕在线观看| 六月婷婷深爱| 大香蕉伊在线观看| 成人视频在线观看黄色18| 九九九九九九精品| 欧美三级视频在线| 成人一二区| AV在线天堂| 亚洲小说区图片区| 七六十路の高齢熟妇无码| 粉嫩99精品99久久久久久特污| 色色色999| 一区二区三区免费观看| 高清无码三级| 视频在线一区| 国产美女精品视频| 日韩V片| 午夜影院操| 亚洲成人无码视频| 色婷婷大香蕉| 在线免费观看无码| 黄色免费在线网站| 中文资源在线a| 久久天堂影院| 麻豆传媒视频观看| 五月天无码视频| 翔田AV无码秘三区| 日韩人妻码一区二区三区| 中文字幕av一区| 成人动漫一区| 国产男女av| 97精品人妻| 在线无码AV| 欧美在线小视频| av777777| 3p视频网站| 色99在线| 成人a片在线免费观看| 亚洲中文字幕在线播放| 国产黄色片在线观看| 东京热国产| 国产9熟妇视频网站| 无码aⅴ| 第一色网站| 波多野结衣99| 久久伊人春色| 国产在线拍揄自揄拍无码视频| 岛国无码在线观看| 青青草在线播放| 亚洲国产激情视频| 亚洲男女免费视频| 大香蕉色视频| 亚洲av二区| 午夜亚洲AV永久无码精品蜜芽| 久久777| 成人视频在线播放| 人人操在线播放| 91蜜桃网| 日韩精品一区二区在线观看| 国产精品码一本A片| 婷婷色视频| 欧美系列在线| 先锋影音亚洲AV每日资源网站| 激情av天堂| 国产欧美在线观看| 免费无码高清视频| 91操B| 国产日本在线| 久久久久蜜桃| 亚洲欧美不卡| 在线亚洲一区| 日韩精品无码一区二区三区| 国产一级乱伦| 狠狠撸狠狠撸| 18禁片网站| 2025最新国产精品每日更新| 亚洲一区二区三区无码| 亚洲图片欧美色图| 4438成人网| 尤物网在线| 亚洲久久久久久| 久久久久精| 欧美亚洲综合在线| 成人无码免费毛片| 中文字幕乱码无码人妻系列蜜桃| 中国AV网| 成人做爰100片免费着| 激情五月丁香花| 激情啪啪网站| 婷婷激情中文字幕| 2012天天夜夜| 最新中文字幕一区| 深爱激情五月天| 亚洲另类视频| 天天日综合| 伊人亚洲综合| 黄片福利| 不卡无码在线观看| 欧美成人精品欧美一级私黄| 国产美女全裸网站| 日韩精品一区二区在线观看| 亚洲乱伦电影| 婷婷久久在线| 大奶无码| 中文字幕乱码中文乱码91| 超碰2023| 婷婷色六月| 欧美做受高潮白| 亚洲免费观看高清完| 成人福利视频在线| 青草久久久久| 中文字幕精品三区无码| 亚洲操操操操| 操逼爆奶网站| 在线不卡无码| 精品吃奶一区二区三区视频| 中文字幕亚洲中文字幕| 少妇搡BBBB搡BBB搡毛片| 亚洲avwww| 亚洲色图一区二区| 六月天av| 天堂网免费视频| 97色在线视频| 小黄片高清无码| 成人伊人AV| 亚洲成人福利电影| 黄色av免费看| 中文亚洲精品字幕电影| 一级操逼大片| 久热在线资源福利站| 亚洲jizzjizz| 午夜免费福利视频| 中文字幕天天在线| 精品国产免费无码久久噜噜噜AV | 国产精品乱伦| 黄色大片AV在线| youjizzcom日本| 欧美综合亚洲图片综合区| 天天日毛片| 韩国三级中文字幕HD久久精品 | 男人的天堂aa| 亚洲成人在线观看视频| 日本免费黄| 国产精品久久久久久精| 国产36页| 性爱麻豆| 91成人无码看片在线观看网址| 大陆一级片| 国产精品欧美一区二区三区苍井空| 麻豆亚洲AV成人无码久久精品| 黃色级A片一級片| 无码人妻精品一区二区三区99仓 | 一级黄色电影免费在线观看| 高清无码视频免费| 国产一级二级三级片| 3D动漫精品啪啪一区二区竹笋| AV在线免费网站| 91看片看婬黄大片| 蜜臀久久99精品久久久兰草影视 | 青娱乐伊人| 91精品国产麻豆国产自产在线| 亭亭五月丁香| 欧美三P囗交做爰XXXⅩ| 久久人妻中文字幕| 国产大鸡巴| 懂色AV| 欧洲肥胖BBBBBBBBBB| 精品九九九九九九| jizz在线观看免费视频| 无码色网| 日本黄色三级| 日韩成人一级片| 小视频你懂的| 又大又黄又爽| 国产成人无码一区二区| 日韩人妻精品无码制服| 午夜日韩| 国产成人精品AV| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 亚洲成人AAAAA| 大香蕉96| 国产嫩草精品A88AV| 日逼电影网| 东京热视频网| 超碰人妻在线| 青草网| 日本一级婬片A片免费看| 俺也色俺也干| 欧美一级高清片免费一级a| 啪啪91| 69国产精品无码免费| av在线免费观看网址| 亚洲性爱一区二区| 日本少妇无码| 国产一级AAAAA片免费| 亚洲色情网站| 国产偷拍精品视频| 久久久久久一区| 69成人精品| 天天爽夜夜爽夜夜爽精品| 精品AV无码| 熟睡侵犯の奶水授乳在线| 国产成人大片| 高h视频在线观看| 欧美三级在线播放| 美女av免费| 91人人妻人人做人人爽| 韩国gogogo高清在线完整版| 中文字幕高清| 国产AV无码成人精品区| 亚洲日韩av在线| 18禁在线| 木下凛凛子AV888AV在线观看| 又粗又硬又爽18级A片| 亚洲国产精品尤物yw在线观看| 色哟哟无码精品一区二区三区| 欧美色视频一区二区三区在线观看| 大香蕉伊人AV| 中文字幕一区二区三区四虎在线 | 亚洲精品99| 姐弟乱伦性爱| 免费无码婬片A片AA片| 国产高清AV在线| 国产香蕉91| 国产迷奸视频| 91精品国自产在线观看| 黄色片免费| 女人自慰网站在线观看| 色五月亚洲| 日本黄色影院在线| 翔田千里50岁无码| 国产精品人妻AⅤ在线看| 麻豆AV在线| 日本人人操人人摸| 欧美日韩亚洲一区二区三区| 国产激情无码免费| 十八禁视频在线观看网站.www | av操逼网| 亚洲免费观看在线观看| 刘玥精品国产一区二区三区| 2025精品视频| 午夜无码熟妇丰满人妻| 超碰中文字幕| 秋霞亚洲| 久久久91人妻无码精品蜜桃ID| 色色影音先锋| 草草久久久无码国产专区的优势| 亚洲精品视频无码| 欧美性国产| 精品视频导航| www.污污污| 亚洲成人娱乐网| 日韩精品123| 2015中文字幕黄色视频| 大香蕉伊人导航| 91人妻人人澡人人爽人人玩| 京东一热本色道久久爱| 女人的天堂av| 免费看欧美日黄片| 成人中文字幕无码| 亚洲精品一区二区三区四区五区六区| av天天看| 中文字幕永久免费| 久久日韩操| 91国啪| 69式荫蒂被添全过程| 97香蕉久久国产超碰青草专区| 操东北老女人| 丁香五月亭亭| 国产成人综合电影| 久久久精品免费| 最新一区二区三区| 大鸡吧成人视频| 久草高清视频| 免费的av网站| 你懂的在线播放| 最全av在线| 中国老女人日逼| 不卡视频一区二区三区| 日韩一级在线播放| 日韩无码免费视频| 国产青青操| 黑人AV在线观看| 日韩无码三级| 少妇高潮视频| 欧美日韩视频免费观看| 蜜臀av在线免费观看| 91小视频在线观看| 91啪啪| 妹子色综合| 人人肏屄| 91女人18毛片水多的意思| 国产亲子乱婬一级A片| 丰满大爆乳波霸奶| 欧美日韩亚洲综合| 91探花在线观看| 东京热久久综合色五月老师| 日韩三区在线| 日韩免费视频观看| 人妻p| 伊人久久大综合中文无码| 成年人黄色在线观看| 国产原创精品| 欧美黄色电影网站| 淫色网址| 99久久精品国产一区二区三区| 中文日韩字幕| 天美果冻麻豆国产一区| 日韩无码a| 欧美日韩v| 亚洲人妻AV| 日本黄色精品| 91丨九色丨熟女泻火| 国产精品午夜成人免费| 91麻豆大奶巨乳一区白虎| 干老女人逼| www四虎| 日韩黄色毛片| 日本大香蕉在线视频| 人人操超碰在线| 91精品久久香蕉国产线看观看| 国产成人精品视频免费看| 99久热在线精品| 亚洲人成无码| 97日韩天堂| 丰满人妻一区二区三区46| 日韩av中文字幕在线| 中文字幕不卡+婷婷五月| 国产欧美精品AAAAAA片| 国产丝袜人妖TS系列| 国产激情无码视频| 松岛枫在线视频| www.日韩AV| 无码A∨| 亚洲AV无码成人网站国产网站| 欧美一级一区| 欧美性爱91| 日韩影音| 国产午夜精品一区二区三区牛牛 | 在线播放JUY-925被丈夫上司侵犯的第7天 | 男人天堂99| 日本一区免费观看| 亚洲日韩激情| 亚洲精品天堂无码AV片| 久久亚洲精品视频| 一本色道久久综合亚洲精品小说| adn日韩av| 你懂得视频| 亚洲日韩一级片| 久草黄色电影在线观看| 美女性爱视频网站| 性无码一区二区| 午夜无码鲁丝午夜免费| 超碰一区二区三区| 黄色福利在线观看| 中文字幕黑人无码| 一区二区三区久久久久| 亚洲日韩Av无码中文字幕美国| 91国产精品视频在线| 婷婷色五月激情| 婷婷综合色| 狠狠操狠狠插| 视频二区| 波多野结衣网址| 成人一级黄色电影| 91日韩精品| 综合色国产精品欧美在线| AV天堂中文字幕| 日韩精品电影| 黄色片基地| 亚洲天堂av网| 天天撸视频| jizz18日本| 老妇槡BBBB槡BBBB槡| 日韩高清无码免费| 北条麻妃99精品青青久久| 精品欧美一区二区精品久久| 婷婷五月999| 免费A在线| 国产一区二区av| 久久久久亚洲AV无码成人片 | 欧美无人区码suv| 一本一道久久综合| 日本免费高清视频| 欧美熟女性爱视频| 欧美日韩中文在线| 久久久亚洲无码| 波多野结衣在线无码视频| 免费乱伦视频| 在线观看AV无码| 蜜桃传媒av| 天天色色| 国产一区二区三区四区在线观看 | 91大神shunv| 日韩色情视频| 亚洲播播在线视频| 91露脸熟女四川熟女在线观看|