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

Kubernetes Informer 機(jī)制解析

共 21931字,需瀏覽 44分鐘

 ·

2021-03-30 17:24

Kubernetes 的控制器模式是其非常重要的一個(gè)設(shè)計(jì)模式,整個(gè) Kubernetes 定義的資源對象以及其狀態(tài)都保存在 etcd 數(shù)據(jù)庫中,通過a piserver 對其進(jìn)行增刪改查,而各種各樣的控制器需要從apiserver及時(shí)獲取這些對象以及其當(dāng)前定義的狀態(tài),然后將其應(yīng)用到實(shí)際中,即將這些對象的實(shí)際狀態(tài)調(diào)整為期望狀態(tài),讓他們保持匹配。因此各種控制器需要和apiserver進(jìn)行頻繁交互,需要能夠及時(shí)獲取對象狀態(tài)的變化,而如果簡單的通過暴力輪詢的話,會給apiserver造成很大的壓力,且效率很低,因此,Kubernetes設(shè)計(jì)了Informer這個(gè)機(jī)制,用來作為控制器跟apiserver交互的橋梁,它主要有兩方面的作用:

  1. 依賴Etcd的List&Watch機(jī)制,在本地維護(hù)了一份所關(guān)心的API對象的緩存。Etcd的Watch機(jī)制能夠使客戶端及時(shí)獲知這些對象的狀態(tài)變化,然后更新本地緩存,這樣就在客戶端為這些API對象維護(hù)了一份和Etcd數(shù)據(jù)庫中幾乎一致的數(shù)據(jù),然后控制器等客戶端就可以直接訪問緩存獲取對象的信息,而不用去直接訪問apiserver,這一方面顯著提高了性能,另一方面則大大降低了對apiserver的訪問壓力;
  2. 依賴Etcd的Watch機(jī)制,觸發(fā)控制器等客戶端注冊到Informer中的事件方法??蛻舳丝赡軙承ο蟮哪承┦录信d趣,當(dāng)這些事件發(fā)生時(shí),希望能夠執(zhí)行某些操作,比如通過apiserver新建了一個(gè)pod,那么kube-scheduler中的控制器收到了這個(gè)事件,然后將這個(gè)pod加入到其隊(duì)列中,等待進(jìn)行調(diào)度。

Kubernetes的各個(gè)組件本身就內(nèi)置了非常多的控制器,而自定義的控制器也需要通過Informer跟apiserver進(jìn)行交互,因此,Informer在Kubernetes中應(yīng)用非常廣泛,出鏡率很高,本篇文章就重點(diǎn)分析下Informer的機(jī)制原理,以加深對其的理解。

使用方法

先來看看Informer是怎么用的,以Deployment控制器為例,來看下其使用Informer的相關(guān)代碼:

1. 創(chuàng)建Informer工廠
# kubernetes/cmd/kube-controller-manager/app/controllermanager.go

sharedInformers := informers.NewSharedInformerFactory(versionedClient, ResyncPeriod(s)())

首先創(chuàng)建了一個(gè)SharedInformerFactory,這個(gè)結(jié)構(gòu)主要有兩個(gè)作用:一個(gè)是用來作為創(chuàng)建Informer的工廠,典型的工廠模式,在Kubernetes中這種設(shè)計(jì)模式也很常用;一個(gè)是共享Informer,所謂共享,就是多個(gè)Controller可以共用同一個(gè)Informer,因?yàn)椴煌腃ontroller可能對同一種API對象感興趣,這樣相同的API對象,緩存就只有一份,通知機(jī)制也只有一套,大大提高了效率,減少了資源浪費(fèi)。

2. 創(chuàng)建對象Informer結(jié)構(gòu)體
# kubernetes/cmd/kube-controller-manager/app/apps.go

dc, err := deployment.NewDeploymentController(
    ctx.InformerFactory.Apps().V1().Deployments(),
    ctx.InformerFactory.Apps().V1().ReplicaSets(),
    ctx.InformerFactory.Core().V1().Pods(),
    ctx.ClientBuilder.ClientOrDie("deployment-controller"),
)

使用InformerFactory創(chuàng)建出對應(yīng)版本的對象的Informer結(jié)構(gòu)體,如Deployment對象對應(yīng)的就是deploymentInformer結(jié)構(gòu)體,該結(jié)構(gòu)體實(shí)現(xiàn)了兩個(gè)方法:Informer()Lister(),前者用來構(gòu)建出最終的Informer,即我們本篇文章的重點(diǎn):SharedIndexInformer,后者用來獲取創(chuàng)建出來的Informer的緩存接口:Indexer,該接口可以用來查詢緩存的數(shù)據(jù)。Deployment Controller關(guān)心的API對象為Deployment, ReplicaSet, Pod,分別為這三種API對象創(chuàng)建了Informer。

3. 注冊事件方法
# kubernetes/pkg/controller/deployment/deployment_controller.go

dInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
    AddFunc:    dc.addDeployment,
    UpdateFunc: dc.updateDeployment,
    // This will enter the sync loop and no-op, because the deployment has been deleted from the store.
    DeleteFunc: dc.deleteDeployment,
})
rsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
    AddFunc:    dc.addReplicaSet,
    UpdateFunc: dc.updateReplicaSet,
    DeleteFunc: dc.deleteReplicaSet,
})
podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
    DeleteFunc: dc.deletePod,
})

dc.dLister = dInformer.Lister()
dc.rsLister = rsInformer.Lister()
dc.podLister = podInformer.Lister()

這里,首先調(diào)用Infomer()創(chuàng)建出來SharedIndexInformer,然后向其中注冊事件方法,這樣當(dāng)有對應(yīng)的事件發(fā)生時(shí),就會觸發(fā)這里注冊的方法去做相應(yīng)的事情。其次調(diào)用Lister()獲取到緩存接口,就可以通過它來查詢Informer中緩存的數(shù)據(jù)了,而且Informer中緩存的數(shù)據(jù),是可以有索引的,這樣可以加快查詢的速度。

4. 啟動(dòng)Informer
# kubernetes/cmd/kube-controller-manager/app/controllermanager.go

controllerContext.InformerFactory.Start(controllerContext.Stop)

這里InformerFactory的啟動(dòng),會遍歷Factory中創(chuàng)建的所有Informer,依次將其啟動(dòng)。

機(jī)制解析

Informer的實(shí)現(xiàn)都是在client-go這個(gè)庫中,通過上述的工廠方法,其實(shí)最終創(chuàng)建出來的是一個(gè)叫做SharedIndexInformer的結(jié)構(gòu)體:

# k8s.io/client-go/tools/cache/shared_informer.go

type sharedIndexInformer struct {
    indexer    Indexer
    controller Controller

    processor             *sharedProcessor
    cacheMutationDetector MutationDetector

    listerWatcher ListerWatcher
    ......
}

func NewSharedIndexInformer(lw ListerWatcher, exampleObject runtime.Object, defaultEventHandlerResyncPeriod time.Duration, indexers Indexers) SharedIndexInformer {
    realClock := &clock.RealClock{}
    sharedIndexInformer := &sharedIndexInformer{
        processor:                       &sharedProcessor{clock: realClock},
        indexer:                         NewIndexer(DeletionHandlingMetaNamespaceKeyFunc, indexers),
        listerWatcher:                   lw,
        objectType:                      exampleObject,
        resyncCheckPeriod:               defaultEventHandlerResyncPeriod,
        defaultEventHandlerResyncPeriod: defaultEventHandlerResyncPeriod,
        cacheMutationDetector:           NewCacheMutationDetector(fmt.Sprintf("%T", exampleObject)),
        clock:                           realClock,
    }
    return sharedIndexInformer
}

可以看到,在創(chuàng)建SharedIndexInformer時(shí),就創(chuàng)建出了processor, indexer等結(jié)構(gòu),而在Informer啟動(dòng)時(shí),還創(chuàng)建出了controller, fifo queue, reflector等結(jié)構(gòu),這些結(jié)構(gòu)之間的關(guān)系如下圖所示:

Reflector

Reflector的作用,就是通過List&Watch的方式,從apiserver獲取到感興趣的對象以及其狀態(tài),然后將其放到一個(gè)稱為”Delta”的先進(jìn)先出隊(duì)列中。

所謂的Delta FIFO Queue,就是隊(duì)列中的元素除了對象本身外,還有針對該對象的事件類型:

type Delta struct {
    Type   DeltaType
    Object interface{}
}

目前有5種Type: Added, Updated, Deleted, Replaced, Resync,所以,針對同一個(gè)對象,可能有多個(gè)Delta元素在隊(duì)列中,表示對該對象做了不同的操作,比如短時(shí)間內(nèi),多次對某一個(gè)對象進(jìn)行了更新操作,那么就會有多個(gè)Updated類型的Delta放入到隊(duì)列中。后續(xù)隊(duì)列的消費(fèi)者,可以根據(jù)這些Delta的類型,來回調(diào)注冊到Informer中的事件方法。

而所謂的List&Watch,就是先調(diào)用該API對象的List接口,獲取到對象列表,將它們添加到隊(duì)列中,Delta元素類型為Replaced,然后再調(diào)用Watch接口,持續(xù)監(jiān)聽該API對象的狀態(tài)變化事件,將這些事件按照不同的事件類型,組成對應(yīng)的Delta類型,添加到隊(duì)列中,Delta元素類型有Added, Updated, Deleted三種。

此外,Informer還會周期性的發(fā)送Resync類型的Delta元素到隊(duì)列中,目的是為了周期性的觸發(fā)注冊到Informer中的事件方法UpdateFunc,保證對象的期望狀態(tài)和實(shí)際狀態(tài)一致,該周期是由一個(gè)叫做resyncPeriod的參數(shù)決定的,在向Informer中添加EventHandler時(shí),可以指定該參數(shù),若為0的話,則關(guān)閉該功能。需要注意的是,Resync類型的Delta元素中的對象,是通過Indexer從緩存中獲取到的,而不是直接從apiserver中拿的,即這里resync的,其實(shí)是”緩存”的對象的期望狀態(tài)和實(shí)際狀態(tài)的一致性。

根據(jù)以上Reflector的機(jī)制,可以澄清一下Kubernetes中關(guān)于控制器模式的一個(gè)常見誤區(qū),即以為控制器是不斷輪詢api,不停地調(diào)用List和Get,獲取到對象的期望狀態(tài),其實(shí)在文章開頭就說過了,這樣做會給apiserver造成很大的壓力,效率很低,所以才設(shè)計(jì)了Informer,依賴Etcd的Watch機(jī)制,通過事件來獲知對象變化狀態(tài),建立本地緩存。即使在Informer中,也沒有周期性的調(diào)用對象的List接口,正常情況下,List&Watch只會執(zhí)行一次,即先執(zhí)行List把數(shù)據(jù)拉過來,放入隊(duì)列中,后續(xù)就進(jìn)入Watch階段。

那什么時(shí)候才會再執(zhí)行List呢?其實(shí)就是異常的時(shí)候,在List或者Watch的過程中,如果有異常,比如apiserver重啟了,那么Reflector就開始周期性的執(zhí)行List&Watch,直到再次正常進(jìn)入Watch階段。為了在異常時(shí)段,不給apiserver造成壓力,這個(gè)周期是一個(gè)稱為backoff的可變的時(shí)間間隔,默認(rèn)是一個(gè)指數(shù)型的間隔,即越往后重試的間隔越長,到一定時(shí)間又會重置回一開始的頻率。而且,為了讓不同的apiserver能夠均勻負(fù)載這些Watch請求,客戶端會主動(dòng)斷開跟apiserver的連接,這個(gè)超時(shí)時(shí)間為60秒,然后重新發(fā)起Watch請求。此外,在控制器重啟過程中,也會再次執(zhí)行List,所以會觀察到之前已經(jīng)創(chuàng)建好的API對象,又重新觸發(fā)了一遍AddFunc方法。

從以上這些點(diǎn),可以看出來,Kubernetes在性能和穩(wěn)定性的提升上,還是下了很多功夫的。

Controller

這里Controller的作用是通過輪詢不斷從隊(duì)列中取出Delta元素,根據(jù)元素的類型,一方面通過Indexer更新本地的緩存,一方面調(diào)用Processor來觸發(fā)注冊到Informer的事件方法:

# k8s.io/client-go/tools/cache/controller.go

func (c *controller) processLoop() {
    for {
        obj, err := c.config.Queue.Pop(PopProcessFunc(c.config.Process))
    }
}

這里的c.config.Process是定義在shared_informer.go中的HandleDeltas()方法:

# k8s.io/client-go/tools/cache/shared_informer.go

func (s *sharedIndexInformer) HandleDeltas(obj interface{}) error {
    s.blockDeltas.Lock()
    defer s.blockDeltas.Unlock()

    // from oldest to newest
    for _, d := range obj.(Deltas) {
        switch d.Type {
        case Sync, Replaced, Added, Updated:
            s.cacheMutationDetector.AddObject(d.Object)
            if old, exists, err := s.indexer.Get(d.Object); err == nil && exists {
                if err := s.indexer.Update(d.Object); err != nil {
                    return err
                }

                isSync := false
                switch {
                case d.Type == Sync:
                    // Sync events are only propagated to listeners that requested resync
                    isSync = true
                case d.Type == Replaced:
                    if accessor, err := meta.Accessor(d.Object); err == nil {
                        if oldAccessor, err := meta.Accessor(old); err == nil {
                            // Replaced events that didn't change resourceVersion are treated as resync events
                            // and only propagated to listeners that requested resync
                            isSync = accessor.GetResourceVersion() == oldAccessor.GetResourceVersion()
                        }
                    }
                }
                s.processor.distribute(updateNotification{oldObj: old, newObj: d.Object}, isSync)
            } else {
                if err := s.indexer.Add(d.Object); err != nil {
                    return err
                }
                s.processor.distribute(addNotification{newObj: d.Object}, false)
            }
        case Deleted:
            if err := s.indexer.Delete(d.Object); err != nil {
                return err
            }
            s.processor.distribute(deleteNotification{oldObj: d.Object}, false)
        }
    }
    return nil
}
Processer & Listener

Processer和Listener則是觸發(fā)事件方法的機(jī)制,在創(chuàng)建Informer時(shí),會創(chuàng)建一個(gè)Processer,而在向Informer中通過調(diào)用AddEventHandler()注冊事件方法時(shí),會為每一個(gè)Handler生成一個(gè)Listener,然后將該Lisener中添加到Processer中,每一個(gè)Listener中有兩個(gè)channel:addCh和nextCh。Listener通過select監(jiān)聽在這兩個(gè)channel上,當(dāng)Controller從隊(duì)列中取出新的元素時(shí),會調(diào)用processer來給它的listener發(fā)送“通知”,這個(gè)“通知”就是向addCh中添加一個(gè)元素,即add(),然后一個(gè)goroutine就會將這個(gè)元素從addCh轉(zhuǎn)移到nextCh,即pop(),從而觸發(fā)另一個(gè)goroutine執(zhí)行注冊的事件方法,即run()。

# k8s.io/client-go/tools/cache/shared_informer.go

func (p *sharedProcessor) distribute(obj interface{}, sync bool) {
    p.listenersLock.RLock()
    defer p.listenersLock.RUnlock()

    if sync {
        for _, listener := range p.syncingListeners {
            listener.add(obj)
        }
    } else {
        for _, listener := range p.listeners {
            listener.add(obj)
        }
    }
}

func (p *processorListener) add(notification interface{}) {
    p.addCh <- notification
}

func (p *processorListener) pop() {
    defer utilruntime.HandleCrash()
    defer close(p.nextCh) // Tell .run() to stop

    var nextCh chan<- interface{}
    var notification interface{}
    for {
        select {
        case nextCh <- notification:
            // Notification dispatched
            var ok bool
            notification, ok = p.pendingNotifications.ReadOne()
            if !ok { // Nothing to pop
                nextCh = nil // Disable this select case
            }
        case notificationToAdd, ok := <-p.addCh:
            if !ok {
                return
            }
            if notification == nil { // No notification to pop (and pendingNotifications is empty)
                // Optimize the case - skip adding to pendingNotifications
                notification = notificationToAdd
                nextCh = p.nextCh
            } else { // There is already a notification waiting to be dispatched
                p.pendingNotifications.WriteOne(notificationToAdd)
            }
        }
    }
}

func (p *processorListener) run() {
    // this call blocks until the channel is closed.  When a panic happens during the notification
    // we will catch it, **the offending item will be skipped!**, and after a short delay (one second)
    // the next notification will be attempted.  This is usually better than the alternative of never
    // delivering again.
    stopCh := make(chan struct{})
    wait.Until(func() {
        for next := range p.nextCh {
            switch notification := next.(type) {
            case updateNotification:
                p.handler.OnUpdate(notification.oldObj, notification.newObj)
            case addNotification:
                p.handler.OnAdd(notification.newObj)
            case deleteNotification:
                p.handler.OnDelete(notification.oldObj)
            default:
                utilruntime.HandleError(fmt.Errorf("unrecognized notification: %T", next))
            }
        }
        // the only way to get here is if the p.nextCh is empty and closed
        close(stopCh)
    }, 1*time.Second, stopCh)
}
Indexer

Indexer是對緩存進(jìn)行增刪查改的接口,緩存本質(zhì)上就是用map構(gòu)建的key:value鍵值對,都存在items這個(gè)map中,key為<namespace>/<name>

type threadSafeMap struct {
    lock  sync.RWMutex
    items map[string]interface{}

    // indexers maps a name to an IndexFunc
    indexers Indexers
    // indices maps a name to an Index
    indices Indices
}

而為了加速查詢,還可以選擇性的給這些緩存添加索引,索引存儲在indecies中,所謂索引,就是在向緩存中添加記錄時(shí),就將其key添加到索引結(jié)構(gòu)中,在查找時(shí),可以根據(jù)索引條件,快速查找到指定的key記錄,比如默認(rèn)有個(gè)索引是按照namespace進(jìn)行索引,可以根據(jù)快速找出屬于某個(gè)namespace的某種對象,而不用去遍歷所有的緩存。

Indexer對外提供了Replace(), Resync(), Add(), Update(), Delete(), List(), Get(), GetByKey(), ByIndex()等接口。

總結(jié)

本篇對 Kubernetes Informer的使用方法和實(shí)現(xiàn)原理,進(jìn)行了深入分析,整體上看,Informer的設(shè)計(jì)是相當(dāng)不錯(cuò)的,基于事件機(jī)制,一方面構(gòu)建本地緩存,一方面觸發(fā)事件方法,使得控制器能夠快速響應(yīng)和快速獲取數(shù)據(jù),此外,還有諸如共享 Informer、resync、index、watch timeout 等機(jī)制,使得 Informer 更加高效和穩(wěn)定,有了 Informer,控制器模式可以說是如虎添翼。

最后,其實(shí)有一個(gè)地方還沒有弄明白,就是 resync 機(jī)制是維持的緩存和實(shí)際狀態(tài)的一致性,但是 etcd 數(shù)據(jù)庫中的對象的狀態(tài),和緩存中的對象狀態(tài),如果只依靠 Watch 事件機(jī)制的話,能否保證一致性,如果因?yàn)槟硞€(gè)原因,導(dǎo)致某次事件沒有更新到緩存中,那后續(xù)這個(gè)對象如果沒有發(fā)生變化的話,就不會有事件再發(fā)出來了,而 List 在正常情況下,又只 List 一次,這樣緩存中的數(shù)據(jù)就跟數(shù)據(jù)庫中的數(shù)據(jù)不一致了,就可能會出問題,找了半天沒找到針對這種情況的處理,不知道是別有洞天,我沒發(fā)現(xiàn),還是這真的是個(gè)問題,只是沒人遇到過。

原文鏈接:https://hackerain.me/2020/12/11/kubernetes/kube-clientgo-informer.html


K8S 進(jìn)階訓(xùn)練營


 點(diǎn)擊屏末  | 即刻學(xué)習(xí)
瀏覽 75
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲三级片在线播放| 成人性爱网站| 日韩人妻中文| 天堂网av2025| 免费视频在线观看黄| 狠狠综合| 91偷拍视频| 日本翔田千里奶水| 日韩不卡AV| 伊人影院在线看| 黄色九九| 日本高清一区二区高清免费视频| 日本久久电影| 免费日逼视频| 插入综合网| 日韩性爱在线| 中文三区| 福利视频一区二区| 欧洲综合视频| 午夜精品在线观看| 日韩午夜欧美精品一二三区| 99re这里只有| 久久国产精品网站| 日本高清无码视频| 国产无码AV在线| 国产精品秘国产精品88| 欧美曰皮免费看| 亚洲日韩成人| ThePorn人妻白浆| 亚洲自拍网站| www.91AV| 日韩AV电影网站| 日本在线不卡视频| 亚洲无人禁区| 无码a区天堂| 五月丁香六月婷| 一级a一级a免费观看视频Al明星 | 一级a片在线播放| 人妻少妇中文字幕久久牛牛| 大香蕉av一区二区三区在线观看 | 青青草做爱视频| 欧美99| 伊人色五月| 欧美成人一级A片| 国产原创精品| 大香蕉东京热| 欧美区亚洲区| 中文字幕第一页av| 蜜臀久久99久久久久久宅男| 国产一二三区在线| 亚洲国产成人自拍| 成人电影亚洲天堂| 一本色道久久综合亚洲精东小说| 欧美三级片视频| 色色大香蕉| 丁香社区五月天| 色综合久久久| 五月天婷婷成人| 中文激情网| 久久影院av| 搡bbb| 久久狼人| 婷婷五月天影视| 色色网站在线观看| 偷自拍| 四川BBB搡BBB爽爽爽欧美| 中文字幕网在线| 欧美99| 超碰av在线| av无码高清| 日本激情网站| 日韩人妻在线视频| 亚洲综合视频在线| 色婷婷在线无码精品秘人口传媒| 毛片高清无码| 七六十路の高齢熟妇无码| 午夜在线免费视频| 色黄视频在线观看| 亚洲第一色| 欧美视频区| 亚洲不卡一区二区三区| 久久b| 91丨精品丨国产丨丝袜| 夜夜天天人人| 久久日精品| 人人爽爽人人| 国产激情精品视频| 天天操天天操天天操天天| 色av影音先锋无吗一区| 婷婷综合缴情亚洲另类在线| 无码av无码AV| 欧美级毛片高潮| 欧美色成人免费在线视频| 精品无码秘人妻一区二区三区| 西西人体大胆ww4444多少集 | 无码AV动漫| 国产麻豆精品成人免费视频| 日韩成人免费在线观看| 伊人久久香蕉网| 国产酒店自拍| 国产丰满乱子伦无码| 日韩欧美国产综合| 青草一区| 免费69视频看片| 无码人妻精品一区二区蜜桃网站| 免费观看黄色在线视频| 久久无码人妻精品一区二区三区| 91av在线电影| 俺去也在线播放| 国精自拍| 亚洲天堂成人在线| 69成人在线电影| 久久看片| 久热激情| 欧美成人大片| 国产亚洲久一区二区三区| 成人午夜福利视频| 黄色免费看视频| 中文字幕15页| 青草草在线| 久99视频| 亚洲中午字幕| 成人性爱视频在线观看| 国产成人AV在线| 亚洲视频入口| 日日夜夜干| 国产欧美日韩一区二区三区| 亚洲黄色在线播放| 一区二区三区不卡视频| 国产h视频| 最近中文字幕mv第三季歌词| 午夜成人免费视频| 色播五月婷婷| 老熟女痒到不行-ThePorn | 99电影网手机在线观看| 国产原创精品| 国产一区二区三区免费观看| 日韩一a| 在线免费观看AV片| 97人人澡| 拍拍视频| 天堂va欧美ⅴa亚洲va一夜| 欧美色图在线观看| 七十路の高齢熟女千代子| 手机AV在线播放| 黄一区二区| 一级国产黄色视频| 开心色播五月| 91精品少妇高潮一区二区三区不卡 | 蜜桃av无码一区二区三区| 欧美一区不卡| 无码免费视频在线观看| 成人黄片免费看| 18国产免费视频| 国产又粗又长又硬黄色一级片| 激情内射| 欧美日韩一区二区三区四区五区六区 | 黄色片久久久| 亚洲网站免费在线观看| 蜜桃影院| 青青色在线视频| 久久草在线播放| 日本成人久久| AV天堂亚洲| 伊人大香蕉在线视频| 国产成人电影| 一级片黑人| 九月婷婷综合| 三级毛片视频| AV乱伦小说| 一级黄色视频免费看| 人妻无码专区| 香蕉成人A片视频| 北条麻妃一区二区三区-免费免费高清观看| 久久黄色毛片| 91综合在线观看| 日本在线一级| 中文字幕成人无码| 亚洲熟女少妇| 99久久精品国产一区色| 99视频在线免费观看| 人妻少妇91精品一区黑人| 国产精品99久久免费黑人人妻| 午夜激情国产| 六月婷婷网| h片在线看| 操逼视频在线播放| 久青草视频| 日韩精品一区二区三免费视频 | 尹人在线视频| 免费v片在线观看| 国产一级无码| 中文字幕中文字幕一区| 免费欧美黄片| 无套内射无码| 射死你天天日| 色444| 日韩中文视频| 精品乱子伦一区二区三区下载| 亚洲欧美日韩中文字幕在线观看 | 中国无码专区| 久久国产高清视频| 一本色道久久| 99热在线观看精品免费| 久久高清无码视频| 久操综合视频在线| 日韩精品一| 色老板在线观看视频| 艳妇乳肉豪妇荡乳AV无码福利 | 中文字幕精品亚洲熟女| 波多野结衣AV无码| 久久人人网| 欧美色女人| 青草超碰| AAA免费视频| 国产九九九| 韩国无码AV| 日本爱爱免费播放视频| 欧美色视频在线观看| 亚洲AV成人片无码网站网蜜柚 | 免费色片| 久久人妻中文字幕| 日本一区二区三区免费看| 黄色成人网站在线播放| 一级黄色电影网站| 黑人vs亚洲人在线播放| 亚洲加勒比久久88色综合| 成人aV无码精品国产一区二区| 人妻人人澡| 国产第1页| 中文字幕在线播放AV| 天天操婷婷| 97精品视频在线观看| 一级生活片| 国产18欠欠欠一区二区| 久草综合网| www.狠狠爱| 99热精品在线播放| 天天添夜夜添| 亚洲无码中| 国产麻豆三级片| 女人的天堂AV| 日产久久久久久| 操逼视频高清无码| 91好爽| 久久久三级片| 国产一级做a爱免费视频| 亚洲片在线观看| 91免费视频观看| 狠狠干亚洲视频| 免费的a片| 无码日韩人妻精品久久蜜桃| 豆花AV| 99re欧美激情| 亚洲国产欧美在线| 少妇高潮无码| 日韩在线一区二区| 狠狠搞狠狠操| 久久婷婷激情| 无码成人片| 国产成人视频在线播放| 亚洲天堂视频在线播放| 久久激情视频| 色色色色色色网站| 国产精品免费网站| 狠狠躁夜夜躁人爽| 亚洲天媒在线播放| 黄色大片在线播放| 夜夜夜撸| 欧美一级a| 丁香婷婷在线| 久久狼友| 久久肏| 97亚洲国产| 黄页免费视频| 午夜操| 国产精品免费久久| 亚洲精品秘一区二区三小| 免费在线观看黄色视频网站| 亚洲经典一| 中文字幕高清无码在线观看| 午夜国产| 伊人日逼| 国产Aⅴ| 免费一级A片| 日本有码中文字幕| 再深点灬好爽灬轻点久久国产| 人人操人人射| 黄色综合网站| 日韩欧美二区| 牛牛成人在线视频| 久艹大香蕉| 国产成人在线免费视频| 久久亚洲Aⅴ成人无码国产丝袜 | 一级大黄色毛片| 高清无码视频免费在线观看| 日产毛片| 爱搞在线观看wwww| 中文在线观看免费视频| 不卡在线视频| 一级黄在线观看| 欧美色视频在线观看| 亚洲婷婷三级成人网| 天天干,夜夜爽| 爱爱黄色视频| 操逼电影免费| 欧美午夜精品久久久久久3D| 欧美一级片在线观看| 欧美中文字| 18av在线观看| 蝌蚪九色啦403| 日韩三级片在线视频| 国产91无码精品秘入口新欢| 成人性生交片无码免费看人| 国产一二区| 婷婷色色婷婷五月天| 色视频免费观看| 五月婷婷中文| 日本操屄视频| 麻豆自拍偷拍| 91麻豆精品A片国产在线观看| 日逼黄色视频| 国产在线第一页| 亚洲操逼AV| 婷婷五月丁香花| 蜜桃成人AV| 午夜麻豆| 欧美性爱在线观看| 狠狠干2024| 在线视频一区二区三区| 91老熟| 91精品国产91久久久久久久久久 | 国产一级操逼视频| 北条麻妃无码精品AV怎么看 | 9i看片成人免费视频| 91精品国产人妻| 亚洲调教| 无码av亚洲一区二区毛片公司| 午夜天堂精品久久久| 国产超碰在线| 成人综合娱乐网| 国产精品国产成人国产三级| 人成视频免费观看| 七十路の高齢熟女千代子| AA片免费看| 大陆一级片| www.爆操| 午夜成人精品| 大鸡巴午夜爽视频电影| 久久免费视频6| 91人妻人人澡人人精品| 蜜桃视频com.www| 日本一区二区不卡| 亚洲高清无码中字| 中文字幕亚洲在线观看| 日韩一区二区三区四区久久久精品有吗| A在线视频| 亚洲无码在线高清| 2025国产成人精品一区| 女同一区二区三区| 欧美高清视频| 91麻豆精品91久久久久同性| 永久免费一区二区| 国产精品久久久久久久久久二区三区 | 2026无码视频| 亚洲午夜免费视频| 久久久精品电影91| 亚洲爆乳无码一区二区三区| 欧美综合亚洲图片综合区| 国产操b视频| 韩国日本久久| 强伦轩人妻一区二区三区四区| 国产18欠欠欠一区二区| 自拍成人视频| 狠狠狠久久久| 青娱乐伊人| 色AV网| www.黄色片| av黄色网| 午夜高清| 瑟瑟免费视频| 天天干B| 日韩无码高清免费| 成人三级片网站| BBw日本熟妇BBwHD| 免费看无码网站成人A片| 狠狠操电影| 性感欧美美女| 俺来操| 国产免费一区二区三区四区| 无码中文字幕在线播放| 5252a我爱haose01我愿| 国产在线观看黄色| 中文字幕在线观看网| 久久草草热国产精品| 成人无码网站在线观看| 中文字幕av久久久久久欧洲尺码| 欧美人成人无码| 黄色在线网站| 西西人体44www大胆无码| 男女操逼视频网站免费观看 | 一区在线免费观看| www.青青草视频| 日韩亚洲视频| 小小拗女BBw搡BBBB搡| 亚洲日韩Av无码中文字幕美国| 国产探花自拍| 秋霞午夜福利| 99re超碰| 91免费观看国产| а天堂中文在线资源| 久操B| 午夜黄色电影| 国产久久久久久久久久| 波多野结衣网站| 国产第一页在线播放| 日本女人高潮视频| 伊人久久免费视频| 无码人妻AⅤ一区二区三区| 97资源在线| 亚洲色五月天| 欧美视频综合| 国产精品热| 毛片无遮挡| 色五月激情| 香蕉国产2023| 激情黄色毛片| 蜜桃传媒一区| 精品无码视频在线| 2015中文字幕黄色视频| 久久免费视频播放| 热久久国产| 伊人大香蕉综合| 麻豆成人精品国产免费| 久久黄色视频免费看| 在线91| 中文字幕日韩AV| 亚洲AV无码乱码| 日韩不卡在线观看| 亚洲插逼视频| 久久精品免费观看| 国产精品一区二区三区在线 | 天天影视综合网免费观看电视剧国产| 国产高清色| 日韩AⅤ无码一区二区三区| 精品国产国产没封| 自拍偷拍影音先锋| 欧美激情婷婷| 人人干人人艹| 在线免费观看a| 狠狠躁婷婷天天爽综合| 打炮影院| 97国产精品久久| 蜜桃av秘无码一区二区三| 999久久久| 国产一区二区视频在线| 日韩无码人妻久久一区二区三区| 精品人妻午夜一区二区三区四区| 久草视频在线免费播放| 国产91在线视频| 日本国产在线观看| 少妇性受XXXX黑人XYX性爽 | 粗长哭叫打桩H体育生| 这里视频很精彩免费观看电视剧最新| 成人黄色一级片| 亚洲一级二级三级片| h在线| 亚洲一二三四| 国产成人午夜精品无码区久久麻豆| 人妻少妇中文字幕久久牛牛| 久久99精品视频| 日本免费在线视频| AV青青草原| 加勒比综合在线| 亚洲40p| 99r6热只有精品免费观看| 超碰精品| 做爱视频无码| 五月激情婷婷网| 欧美伊人网在线观看| 俺去| 狠狠色噜噜狠狠狠7777| 国产人成视频免费观看| 国产爱搞| 老婆被黑人杂交呻吟视频| 日本在线不卡视频| 东京热免费视频| A在线| 天堂网av2014| 奇米影视av| 天天日天天操天天干| 99在线看| 无码不卡在线播放| 美妇肥臀一区二区三区-久久99精品国 | 欧美色图在线视频| 亚洲无码一二区| 丁香久久婷婷| 狼友视频在在观看| V天堂在线| 182在线视频| 日本一级片中文字幕| 激情六月婷婷| 亚洲色综合久久五月| 精品一区二区三区四区五区| 韩国色情中文字幕| 九九综合久久| 一级a免一级a做免费线看内祥 | 国产九九九九九九| 色大香蕉伊人| 成人网在线视频| 高清无码做爱视频| 亚洲三级无码在线| 东京热无码高清| 色欲av在线| 美女白嫩嫩大BBB欣赏| 青青草视频偷拍| 91熟女首页| 美女一区| aa免费视频| 亚洲AV女人18毛片水真多| 男人AV网| 国产成人精品在线| 中文在线资源| 成人手机在线视频| 欧美国产成人在线| 久热无码| 天天想夜夜操| 天堂在线网| 在线观看视频免费无码| 久久精品中文字幕| 尤物在线| 夜色视频网| 久久久久久久久久久久成人| 一区二区三区四区五区六区高清无吗视频 | 西西人体大胆裸体A片| 无码人妻一区二区三区蜜桃视频| 九九性视频| 操逼逼网| 伊人网大香| 少妇激情av| 8050午夜一级| 在线观看国产欧美| 日韩欧美激情| 哪里可以看毛片| 天天夜夜操操| 黄色免费网| 最新日韩在线| 亚洲欧洲在线视频| 豆花视频logo进入官网| 成人日皮视频| 超碰在线人人爱| 日韩AV无码专区亚洲AV紧身裤| 青娱乐超碰| 国产成人91| 丁香色五月婷婷| 极品少妇av| 色婷婷俺来也| 日韩另类| 国产精品电影| 白嫩外女BBWBBWBBW| 色屁屁草草影院ccyycom| 精品伊人久久| av影音先锋| 亚洲AVA| 秋霞午夜福利| 亚洲AV毛片| 青青视频网| 免费无码在线视频| 国产伦精品一区二区三区妓女下载| 伊人春色AV| 成人无码在线播放| www.国产精品| 五月婷婷激情综合| 婷婷五月天成人| 午夜无码福利在线观看| 成人性在线| 专业操美女视频网站| 伊人色五月| 99色色网| 91第一页| 亚洲精品一区二区三区无码电影| 麻豆熟妇乱妇熟色A片在线看| 蜜臀av一区二区三区| 黑人无码| 一区二区三区四区五区在线| 麻豆视频一区二区| 国产成人免费做爰视频| 亚洲中文无码电影| 亚洲国产成人久久| 亚洲精品18在线观看| 亚洲欧美熟妇久久久久久久久 | 在线视频一区二区三区四区| 日韩v片| 中文字幕一区二区三区人妻电影 | 日本有码中文字幕| 亚洲综合伊人无码| 熟女探花精选| 欧美一区二区三区视频| 黃色一级A一片人与| 超碰天天| 日韩欧美精品18| 12——13女人毛片毛片| 熟女内射| 内射视频免费看| 亚洲高清福利| 麻豆天美传媒AV果冻传媒| 日韩AV免费| 久久99精品视频| 中国九九盗摄偷拍偷看| 麻豆亚洲AV成人无码久久精品 | 国产熟女一区二区视频网站| 91乱伦视频| 制服丝袜人妻| 免费婷婷| 免费视频一区二区三区四区| 久久艹网| 色婷婷激情综合网| 色播国产成人AV| 久久国产2025| 欧美性爱a视频| 国产精品色婷婷99久久精品| 亚洲秘AV无码一区二区qq群| 日韩一级片在线观看| 成人在线黄色视频| 91做爱视频| 中文精品字幕人妻熟女| 国产精品久久久久久久久夜色| 91黑人| 色天使视频| 国产在线观看91| 麻豆精品无码| 操美女久久| 国产成人精品a视频一区| 91成全在线| 亚洲日本一区二区三区| 日本成人激情视频| 国家一级A片| 午夜福利手机在线| 在线不卡免费Av| 天天日天天干天天操| 黄色网页在线观看| 中文字字幕在线中文乱码| 国产1区2区| 嘿嘿午夜| 中文字幕日韩在线视频| 在线免费观看一区| 69国产精品| 91成人一区| 天天做夜夜操| 人妻体内射精一区二区三区 | 日韩精品成人电影| 午夜香蕉视频| A黄色片| 91av在线免费观看| 亚洲在线视频免费观看| 亚洲第一免费视频| 亚洲综合社区| 3p绿帽黑人看自己老婆| 国产AV三级| 视色影院| 久久久无码视频| 亚洲欧美国产视频| 日本特黄AA片免费视频| 中文字幕永久在线观看| 日韩av中文字幕在线| 微熟女导航| 三级片日韩| AAAAA毛片| 成全在线观看高清的| 91成人国产| 夜夜撸网站| 各种妇女撒尿mm毛免费网站| 99伊人网| 亚洲乱码日产精品BD在线观看| 成人亚洲A片V一区二区三区蜜月 | 在线18禁| 91人人操人人爽| 99在线看| 日韩在线观看视频网站| 国产毛片在线视频| 在线无码不卡| 亚洲小说欧美激情另类A片小说| 九九碰九九爱97超碰| 欧美日韩视频在线播放| 三级片在线网站| 成人看片黄a免费看视频| 91豆花成人网站| 国产福利在线观看| 成人三级在线观看| 成人毛片在线观看| 黄色片网站| 亚洲日韩精品秘在线观看| 在线播放中文字幕| 九七影院第二页| 亚洲日韩欧美性爱| 18sav| 91久久精品国产91久久公交车| 国产成人午夜福利视频| 五月丁香人妻| 成人性爱视频在线| 俄罗斯老熟妇与子伦| 香蕉成人网站| 欧美日韩亚洲天堂| www.日批| 我要操网站| 高清日韩无码视频| 十八禁免费网站| 国产免费小视频| 91综合娱乐| 一区无码| 香蕉漫画在线观看18| 热无码av| 国产欧美精品一区二区三区| 91人妻人人澡人人爽人人DVD| 欧洲综合视频| 久久久免费观看视频| 精品一区二区三区四区五区六区| 水蜜桃网站在线观看| 青青草原网址| 国产婷婷色一区二区三区| 黃色一级A一片人与| 黄色在线免费观看| 天天做天天干| 色就是色欧美成人网| 综合激情五月婷婷| 91成人在线影院| 亚洲色图欧美| a无码视频在线观看| 欧美日韩大片| 东京热在线视频观看| 久久久久99精品成人网站| 91精品久久香蕉国产线看观看| 777在线视频| 欧美亚洲综合手机在线| 欧美亚洲黄色| 成人综合大香蕉| 一级a一级a免费观看免免黄‘/ | 亚洲天媒在线播放| 国产精品日韩欧美| 高潮91PORN蝌蚪九色| 天天综合天天| 国产精品国产三级国产专区53| 微熟女导航| 成人亚洲AV日韩AV无码| 天天操网站| 久久久一区二区三区四曲免费听| 日日骚中文字幕| 大香蕉99热| 骚逼www| www.插插| 国产精品久久久久久久久夜色| 国产成人av在线播放| 亚洲欧洲在线视频| 日本人妻中出| 乱伦一级黄片| 蜜芽成人精品久久久视频| 一级二级三级视频| 第四色激情网| av黄色在线观看| AV黄色| 人妻无码HEYZO少妇精品| 欧美三级欧美一级| 欧美日韩第一区| 久久99久久99| A视频在线免费观看| 国产福利在线播放| 详情:绿帽夫妻多人运动开淫啪-91n | 高清色色女网站| 国产一级黄色毛片| 午夜福利区| 99久久婷婷国产综合精品hsex | 人人爱人人操人人干| 五月激情六月| 日本AⅤ在线观看| 青青草操逼视频| 一见钟情的韩国电影| 狼友视频免费观看| 成人黄色录像| 亚洲综合干| 成人电影一区| 97爱爱| 色老板在线精品免费观看| 天天操婷婷| 亚洲黄色视频网站在线观看| 影音先锋国产资源| 日韩黄色毛片| a片视频免费观看| 日韩加勒比在线| 91成人视频在线免费观看| 福利导航在线| 538在线视频| 西西www444无码免费视频| 北条麻妃久久久| 在线免费看黄网站| 国产成人精品电影| 亚洲无码视频免费观看| 久久久久三级| 无码人妻AV一区| 午夜成人精品| 国产一区二| 亚洲无码高清在线| 精品久久三级片| 日韩精品无码电影| 爱搞搞就要搞搞| 亚洲中文字幕一区| 中国女人如毛片| 男人手机天堂| 亚洲成人AV无码| 成人无码免费| 男人天堂AV片| 91免费观看网站| 亚洲va在线| 欧美国产日韩在线| 欧美人操逼一二区| 91综合在线观看| 欧美日韩中文在线| 成人av免费在线观看| 国产黄色av| 99热黄色| 欧美精品一卡二卡| 免费AV片| 成人激情视频A极| 91丨PORN首页| 国产免费av片| 亚洲骚逼| 九热大香蕉| 午夜精品久久久久久久91蜜桃| 中文字幕亚洲欧美| 成人做爰A片AAA毛真人| 丁香婷婷久久久综合精品国产| 大香蕉少妇| 国产一级操逼视频| 人人精品| 在线日韩| 亚洲片在线观看| 中文av在线播放| 高清无码1区| 国产精品囯产三级囯产AV野外| 黄色电影一级片| 国产乱伦免费| 日本免费福利视频| 韩国免费一级a一片在线播放| 成人激情在线观看| 欧美高清无码| 水多多成人视频| 影音先锋色av| 国产第一页在线观看| 亚洲视频欧洲视频| 精品无码一区二区三区蜜桃李宗瑞| 18毛片| 91福利在线观看| 日韩在线观看免| 天堂俺去俺来也www久久婷婷| 国产女人18毛片18精品| 久久久久久99| 自拍视频一区| 97碰碰碰| 亚洲高清无码播放| 91精品久| 好吊视频一区二区| 特黄特色免费大片| 色情小电影免费网站观看网址在线播| 天天操天天操天天| 亚洲三级网站| 东北骚妇大战黑人视频| 先锋资源在线视频| av在线免费播放| 在线观看免费黄视频| 在线看一区| 国产午夜成人福利在线| 成人五月天黄色电影| 国产精品成人免费视频| 日韩AV无码电影| 美日韩一级| 午夜福利成人网站| 国产无码电影| 性性性性性XXXXX| 粉嫩小泬BBBB免费看-百度| 欧美A级视频| 一级片免费观看视频| av在线资源观看| 亚洲无码久久久| 亚洲国产一| 麻豆内射| 91最新在线播放| 欧美日韩国产成人综合| 黄色AV免费看| 91狠狠爱| 天干天干天夜夜| 人人色综合| 国产超碰免费| 成人性生活片| 婷婷色图| 在线播放一区二区三区| 久久成人小电影| 懂色av粉嫩AV蜜臀AV| 亚洲专区区免费| 国产精品色色| 日韩精品成人AV| 五月天久久|