精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

探索Kubernetes 1.28調度器OOM的根源

云計算 云原生
Kubernetes社區在1.28版本中默認開啟了調度特性SchedulerQueueingHints,導致調度組件內存異常。為了臨時解決內存等問題,社區在1.28.5中將該特性調整為默認關閉。因為問題并未完全修復,所以建議審慎開啟該特性。

1、問題描述

年前,同事升級K8s調度器至1.28.3,觀察到內存異常現象,幫忙一起看看,在集群pod及node隨業務潮汐變動的情況下,內存呈現不斷上升的趨勢,直至OOM.(下述數據均來源自社區)

圖片圖片

觸發場景有以下兩種(社區還有其他復現方式):

Case 1

for (( ; ; ))
do
    kubectl scale deployment nginx-test --replicas=0 
    sleep 30
    kubectl scale deployment nginx-test --replicas=60
    sleep 30
done

Case 2

1. Create a Pod with NodeAffinity under the situation where no Node can accommodate the Pod.
2. Create a new Node.

我們在社區的發現多起類似內存異常場景,復現方式不盡相同,關于上述問題的結論是:

Kubernetes社區在1.28版本中默認開啟了調度特性SchedulerQueueingHints,導致調度組件內存異常。為了臨時解決內存等問題,社區在1.28.5中將該特性調整為默認關閉。因為問題并未完全修復,所以建議審慎開啟該特性。

2、技術背景

該章節介紹以下內容:

  • 介紹K8s調度器相關結構體
  • 介紹K8s調度器QueueingHint
  • golang的雙向鏈表

調度器簡介

PriorityQueue是SchedulingQueue的接口實現。它的頭部存放著優先級最高的待調度Pod。PriorityQueue包含以下重要字段:

  1. activeQ:存放準備好調度的Pod。新添加的Pod會被放入該隊列。調度隊列需要執行調度時,會從該隊列中獲取Pod。activeQ由堆來實現。
  2. backoffQ:存放因各種原因(比如未滿足節點要求)而被判定為無法調度的Pod。這些Pod會在一段退避時間后,被移到activeQ以嘗試再次調度。backoffQ也由堆來實現。
  3. unschedulablePods:存放因各種原因無法調度的Pod,是一個map數據結構。這些Pod被認定為無法調度,不會直接放入backoffQ,而是被記錄在這里。待條件滿足時,它們將被移到activeQ或者backoffQ中,調度隊列會定期清理unschedulablePods 中的 Pod。
  4. inFlightEvents:用于保存調度隊列接收到的事件(entry的值是clusterEvent),以及正在處理中的Pod(entry的值是*v1.Pod),基于golang內部實現的雙向鏈表
  5. inFlightPods:保存了所有已經Pop,但尚未調用Done的Pod的UID,換句話說,所有當前正在處理中的Pod(正在調度、在admit中或在綁定周期中)。
// PriorityQueue implements a scheduling queue.
type PriorityQueue struct {


  ...
  inFlightPods map[types.UID]*list.Element


  inFlightEvents *list.List


  activeQ *heap.Heap


  podBackoffQ *heap.Heap
  // unschedulablePods holds pods that have been tried and determined unschedulable.
  unschedulablePods *UnschedulablePods
  // schedulingCycle represents sequence number of scheduling cycle and is incremented
  // when a pod is popped.
  ...


  // preEnqueuePluginMap is keyed with profile name, valued with registered preEnqueue plugins.
  preEnqueuePluginMap map[string][]framework.PreEnqueuePlugin
  ...


  // isSchedulingQueueHintEnabled indicates whether the feature gate for the scheduling queue is enabled.
  isSchedulingQueueHintEnabled bool
}

關于K8s調度器介紹,參看kuberneter調度由淺入深:框架,后續會更新最新的K8s調度器梳理

QueueingHint簡介

K8s調度器引入了QueueingHint特性,通過從每個插件獲取有關Pod重新入隊的建議,以減少不必要的調度重試,從而提升調度吞吐量。同時,在適當情況下跳過退避,進一步提高Pod調度效率。

需求背景

當前,每個插件可以通過EventsToRegister定義何時重試調度被插件拒絕的Pod。

比如,NodeAffinity會在節點添加或更新時重試調度Pod,因為新添加或更新的節點可能具有與Pod上的NodeAffinity匹配的標簽。然而,實際上,在集群中會發生大量節點更新事件,這并不能保證之前被NodeAffinity拒絕的Pod能夠成功調度。

為了解決這個問題,調度器引入了更精細的回調函數,以過濾掉無關的事件,從而在下一個調度周期中僅重試可能成功調度的Pod。

另外,DRA(動態資源分配)調度插件有時需要拒絕Pod以等待來自設備驅動程序的狀態更新。因此,某些Pod可能需要經過幾個調度周期才能完成調度。針對這種情況,與等待設備驅動程序狀態更新相比,回退等待的時間更長。因此,希望能夠使插件在特定情況下跳過回退以改善調度性能。

實現目標

為了提高調度吞吐量,社區提出以下改進:

  1. 引入QueueingHint
  • 將 QueueingHint 引入到 EventsToRegister 機制中,允許插件提供針對Pods重新入隊的建議
  1. 增強 Pod 跟蹤和重新入隊機制:
  • 優化追蹤調度隊列內正在處理的 Pods實現
  • 實現一種機制,將被拒絕的 Pods 重新入隊到適當的隊列
  • 優化被拒絕的Pods的退避策略,能夠使插件在特定情況下跳過回退,從而提高調度吞吐量。

潛在風險

1)實現中的錯誤可能導致 Pod 在 unschedulablePods 中長時間無法被調度

如果一個插件配置了 QueueingHint,但它錯過了一些可以讓 Pod 可調度的事件, 被該插件拒絕的 Pod 可能會長期困在 unschedulablePods 中。

雖然調度隊列會定期清理unschedulablePods 中的 Pod。(默認為 5 分鐘,可配)

2)內存使用量的增加

因為調度隊列需要保留調度過程中發生的事件,kube-scheduler的內存使用量會增加。所以集群越繁忙,它可能需要的內存就越多。

雖然無法完全消除內存增長,但如果能夠盡快釋放緩存的事件,就可以延緩內存增長的速度。

3)EnqueueExtension 中 EventsToRegister 中的重大變更

自定義調度器插件的開發者需要進行兼容性升級, EnqueueExtension 中的 EventsToRegister 將返回值從 ClusterEvent 更改為 ClusterEventWithHint。ClusterEventWithHint 允許每個插件通過名為 QueueingHintFn 的回調函數過濾更多無用的事件。

社區為了簡化遷移工作,空的 QueueingHintFn 被視為始終返回 Queue。因此,如果他們只想保持現有行為,他們只需要將 ClusterEvent 更改為 ClusterEventWithHint 并不需要注冊任何 QueueingHintFn。

QueueingHints設計

EventsToRegister 方法的返回類型已更改為 []ClusterEventWithHint

// EnqueueExtensions 是一個可選接口,插件可以實現在內部調度隊列中移動無法調度的 Pod。可以導
// 致Pod無法調度(例如,Filter 插件)的插件可以實現此接口。
type EnqueueExtensions interface {
    Plugin
    ...
    EventsToRegister() []ClusterEventWithHint
}

每個 ClusterEventWithHint結構體包含一個 ClusterEvent 和一個 QueueingHintFn,當事件發生時執行 QueueingHintFn,并確定事件是否可以讓 Pod滿足調度。

type ClusterEventWithHint struct {
    Event ClusterEvent


    QueueingHintFn QueueingHintFn
}


type QueueingHintFn func(logger klog.Logger, pod *v1.Pod, oldObj, newObj interface{}) (QueueingHint, error)


type QueueingHint int


const (
    // QueueSkip implies that the cluster event has no impact on
    // scheduling of the pod.
    QueueSkip QueueingHint = iota


    // Queue implies that the Pod may be schedulable by the event.
    Queue
)

類型 QueueingHintFn 是一個函數,其返回類型為 (QueueingHint, error)。其中,QueueingHint 是一個枚舉類型,可能的值有 QueueSkip 和 Queue。QueueingHintFn 調用時機位于將 Pod 從 unschedulableQ 移動到 backoffQ 或 activeQ 之前,如果返回錯誤,將把調用方返回的 QueueingHint 處理為 QueueAfterBackoff,這種處理無論返回的結果是什么,都可以防止 Pod 永遠待在unschedulableQ 隊列中。

a. 何時跳過/不跳過 backoff

BackoffQ 通過防止“長期無法調度”的 Pod 阻塞隊列以保持高吞吐量的輕量級隊列。

Pod 在調度周期中被拒絕的次數越多,Pod 需要等待的時間就越長,即在BackoffQ 待得時間就越長。

例如,當 NodeAffinity 拒絕了 Pod,后來在其 QueueingHintFn 中返回 Queue 時,Pod 需要等待 backoff 后才能重試調度。

但是,某些插件的設計本身就需要在調度周期中經歷一些失敗。比如內置插件DRA(動態資源分配),在 Reserve extension處,它告訴資源驅動程序調度結果,并拒絕 Pod 一次以等待資源驅動程序的響應。針對這種拒絕情況,不能將其視作調度周期的浪費,盡管特定調度周期失敗了,但基于該周期的調度結果可以促進 Pod 的調度。因此,由于這種原因被拒絕的 Pod 不需要受到懲罰(backoff)。

為了支持這種情況,我們引入了一個新的狀態 Pending。當 DRA 插件使用 Pending 拒絕 Pod,并且后續在其 QueueingHintFn 中返回 Queue 時,Pod 跳過 backoff,Pod 被重新調度。

b. QueueingHint 如何工作

當K8s集群事件發生時,調度隊列將執行在之前調度周期中拒絕 Pod 的那些插件的 QueueingHintFn。

通過下述幾個場景,描述一下它們如何被執行以及如何移動 Pod。

Pod被一個或多個插件拒絕

假設有三個節點。當 Pod 進入調度周期時,一個節點由于資源不足拒絕了Pod,其他兩個節因為Pod 的 NodeAffinity不匹配拒絕了Pod。

在這種情況下,Pod 被 NodeResourceFit 和 NodeAffinity 插件拒絕,最終被放到 unschedulableQ 中。

此后,每當注冊在這些插件中的集群事件發生時,調度隊列通過 QueueingHint 通知它們。如果來自 NodeResourceFit 或 NodeAffinity 的任何一個的 QueueingHintFn 返回 Queue,則將 Pod 移動到 activeQ或者backoffQ中。(例如,當 NodeAdded 事件發生時,NodeResourceFit 的 QueueingHint 返回 Queue,因為 Pod 可能可調度到該新節點。)

它是移動到 activeQ 還是 backoffQ,這取決于此 Pod 在unschedulableQ 中停留的時間有多長。如果在unschedulableQ 停留的時間超過了預期的 Pod 的 backoff 延遲時間,則它將直接移動到 activeQ。否則,它將移動到 backoffQ。

Pod因 Pending 狀態而被拒絕

當 DRA 插件在 Reserve extension 階段針對Pod返回 Pending時,調度隊列將 DRA 插件添加到 Pod 的pendingPlugins 字典中的同時,Pod 返回調度隊列。

當 DRA 插件的 QueueingHint 之后的調用中返回 Queue 時,調度隊列將此 Pod 直接放入 activeQ。

// Reserve reserves claims for the pod.
func (pl *dynamicResources) Reserve(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeName string) *framework.Status {


    ...


    if numDelayedAllocationPending == 1 || numClaimsWithStatusInfo == numDelayedAllocationPending {
        ...
        schedulingCtx.Spec.SelectedNode = nodeName
        logger.V(5).Info("start allocation", "pod", klog.KObj(pod), "node", klog.ObjectRef{Name: nodeName})
        ...
        return statusUnschedulable(logger, "waiting for resource driver to allocate resource", "pod", klog.KObj(pod), "node", klog.ObjectRef{Name: nodeName})
    }


    ...
    return statusUnschedulable(logger, "waiting for resource driver to provide information", "pod", klog.KObj(pod))
}

c. 跟蹤調度隊列中正在處理的 Pod

通過引入 QueueingHint,我們只能在特定事件發生時重試調度。但是,如果這些事件發生在Pod 的調度期間呢?

調度器對集群數據進行快照,并根據快照調度 Pod。每次啟動調度周期時都會更新快照,換句話說,相同的快照在相同的調度周期中使用。

考慮到這樣一個情景,比如,在調度一個 Pod 時,由于沒有任何節點符合 Pod 的節點親和性(NodeAffinity),因此被拒絕,但是在調度過程中加入了一個新的節點,它與 Pod 的節點親和性匹配。

如前所述,這個新節點在本次調度周期內不被視為候選節點,因此 Pod 仍然被節點親和性插件拒絕。問題在于,如果調度隊列將 Pod 放入unschedulableQ中,那么即使已經有一個節點匹配了 Pod 的節點親和性要求,該 Pod 仍需要等待另一個事件。

為了避免類似Pod 在調度過程中錯過事件的場景,調度隊列會記錄 Pod 調度期間發生的事件,并根據這些事件和QueueingHint來決定Pod 入隊的位置。

因此,調度隊列會緩存自 Pod 離開調度隊列直到 Pod 返回調度隊列或被調度的所有事件。當不再需要緩存的事件時,緩存的事件將被丟棄。

Golang雙向鏈表

*list.List 是 Go 語言標準庫 container/list 包中的一種數據結構,表示一個雙向鏈表。在 Go 中,雙向鏈表是一種常見的數據結構,用于在元素的插入、刪除和遍歷等操作上提供高效性能。

以下是 *list.List 結構的簡要介紹:

  • 定義:*list.List 是一個指向雙向鏈表的指針,它包含了鏈表的頭部和尾部指針,以及鏈表的長度信息。
  • 特性:雙向鏈表中的每個節點都包含指向前一個節點和后一個節點的指針,這使得在鏈表中插入和刪除元素的操作效率很高。
  • 用途:*list.List 常用于需要頻繁插入和刪除操作的場景,尤其是當元素的數量不固定或順序可能經常變化時。

下面示例:

package main


import (
    "container/list"
    "fmt"
)


func main() {
    // 創建一個新的雙向鏈表
    l := list.New()


    // 在鏈表尾部添加元素
    l.PushBack(1)
    l.PushBack(2)
    l.PushBack(3)


    // 遍歷鏈表并打印元素
    for e := l.Front(); e != nil; e = e.Next() {
        fmt.Println(e.Value)
    }
}

PushBack 方法會向鏈表的尾部添加一個新元素,并返回表示新元素的 *list.Element 指針。這個指針可以用于后續對該元素的操作,例如刪除或修改。

*list.Element 結構體包含了指向鏈表中前一個和后一個元素的指針,以及一個存儲元素值的字段。通過返回 *list.Element 指針,我們可以方便地在需要時訪問到新添加的元素,以便進行進一步的操作。要從雙向鏈表中刪除元素,你可以使用list.Remove()方法。這個方法需要傳入一個鏈表元素,然后會將該元素從鏈表中移除。

package main


import (
    "container/list"
    "fmt"
)


func main() {
    // 創建一個新的雙向鏈表
    myList := list.New()


    // 在鏈表尾部添加元素
    myList.PushBack(1)
    myList.PushBack(2)
    myList.PushBack(3)


    // 找到要刪除的元素
    elementToRemove := myList.Front().Next()


    // 從鏈表中移除該元素
    myList.Remove(elementToRemove)


    // 打印剩余的元素
    for element := myList.Front(); element != nil; element = element.Next() {
        fmt.Println(element.Value)
    }
}

這段代碼輸出結果:

1
3

在這個例子中,我們移除了鏈表中第二個元素(值為2)。

3、淺析一番

直接上pprof來分析一下內存使用情況,部分pprof列表,如下所示:

圖片圖片

這里可以發現,內存主要集中在protobuf的Decode,在不具體分析pprof的前提下,我們的思路有三點:

  • grpc-go是否有內存問題
  • go本身是否問題
  • K8s內存問題

針對第一個的假設,可以撈一下grpc-go的相關issue,可以發現近期未見相關內存異常的報告,go本身的問題,看起來也不太像,但倒是找到一個THP的相關問題,以后可以簡單介紹一下,那么只剩一個結果,就是K8s本身存在問題,但其中(*FieldsV1).Unmarshal5年沒動了,大概率不會存在問題,那么我們簡單分析一下pprof吧

k8s.io/apimachinery/pkg/apis/meta/v1.(*FieldsV1).Unmarshal
vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go


Total:     309611     309611 (flat, cum) 2.62%
  6502           .         .           if postIndex > l {
  6503           .         .           return io.ErrUnexpectedEOF
  6504           .         .           }
  6505       309611     309611           m.Raw = append(m.Raw[:0], dAtA[iNdEx:postIndex]...)
  6506           .         .           if m.Raw == nil {
  6507           .         .           m.Raw = []byte{}
  6508           .         .           }

過段時間:

k8s.io/apimachinery/pkg/apis/meta/v1.(*FieldsV1).Unmarshal
vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go


Total:     2069705   2069705 (flat, cum) 2.49%
  6502           .         .           if postIndex > l {
  6503           .         .           return io.ErrUnexpectedEOF
  6504           .         .           }
  6505     2069705   2069705           m.Raw = append(m.Raw[:0], dAtA[iNdEx:postIndex]...)
  6506           .         .           if m.Raw == nil {
  6507           .         .           m.Raw = []byte{}
  6508           .         .           }

在持續增長的 Pod 列表中,發現了一些未釋放的數據似乎與先前使用 pprof 分析的結果吻合,僅發現 Pod 是持續變更的對象。因此,我嘗試了另一種排查方法,驗證社區是否已解決此問題。我使用 minikube 在本地啟動了 Kubernetes 1.18.5 版本進行排查。幸運的是,我未能復現這一現象,表明問題可能在 1.18.5 版本后已修復。

為了進一步縮小排查范圍,我讓同事檢查了這三個小版本之間的提交記錄。最終發現了一個關閉了 SchedulerQueueingHints 特性的 PR。正如在技術背景中提到的,SchedulerQueueingHints 特性可能導致內存增長問題。

通過PriorityQueue結構體可以發現其通過isSchedulingQueueHintEnabled來控制特性的邏輯處理,如果開啟了QueueingHint 特性,那么在執行Pop方法來調度Pod時,需要為inFlightPods對應pod的UID填充相同inFlightEvents的鏈表

func (p *PriorityQueue) Pop(logger klog.Logger) (*framework.QueuedPodInfo, error) {
  p.lock.Lock()
  defer p.lock.Unlock()


  obj, err := p.activeQ.Pop()
  ...
  // In flight, no concurrent events yet.
  if p.isSchedulingQueueHintEnabled {
    p.inFlightPods[pInfo.Pod.UID] = p.inFlightEvents.PushBack(pInfo.Pod)
  }


  ...


  return pInfo, nil
}

那么鏈表字段何時移除?我們可以觀察到移除的唯一時間點在pod完成調度周期時,也就是調用Done方法時

func (p *PriorityQueue) Done(pod types.UID) {
  p.lock.Lock()
  defer p.lock.Unlock()


  p.done(pod)
}


func (p *PriorityQueue) done(pod types.UID) {
  if !p.isSchedulingQueueHintEnabled {
    // do nothing if schedulingQueueHint is disabled.
    // In that case, we don't have inFlightPods and inFlightEvents.
    return
  }
  inFlightPod, ok := p.inFlightPods[pod]
  if !ok {
    // This Pod is already done()ed.
    return
  }
  delete(p.inFlightPods, pod)


  // Remove the pod from the list.
  p.inFlightEvents.Remove(inFlightPod)




  for {
    ...
    p.inFlightEvents.Remove(e)
  }
}

這里可以發現如何done的時機越晚,內存的增長將越明顯,并且如果Pod的事件被忽視或者遺漏,鏈表的內存同樣會出現異常增加的現象,可以看到針對上述場景的一些修復:

  • 出現了call Done() as soon as possible這樣的PR,參看PR#120586
  • NodeAffinity/NodeUnschedulable插件的QueueingHint 遺漏相關Node事件,參看PR#122284

由于筆者時間、視野、認知有限,本文難免出現錯誤、疏漏等問題,期待各位讀者朋友、業界專家指正交流。

參考文獻

1. https://github.com/kubernetes/kubernetes/issues/122725

2. https://github.com/kubernetes/kubernetes/issues/122284

3. https://github.com/kubernetes/kubernetes/pull/122289

4. https://github.com/kubernetes/kubernetes/issues/118893

4. https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/4247-queueinghint/README.md?plain=1#L579

5. https://github.com/kubernetes/kubernetes/issues/122661

6. https://github.com/kubernetes/kubernetes/pull/120586

7. https://github.com/kubernetes/kubernetes/issues/118059

本文轉載自微信公眾號「 DCOS」,作者「DCOS」,可以通過以下二維碼關注。

轉載本文請聯系「DCOS」公眾號。

責任編輯:武曉燕 來源: DCOS
相關推薦

2023-04-17 08:13:13

KubernetesPod

2021-02-26 14:40:16

Kubernetes調度器

2025-07-04 08:43:51

2023-06-19 15:11:39

Kubernetes開發容器

2023-10-25 12:51:28

Go調度器

2021-11-05 15:55:35

作業幫Kubernetes調度器

2021-12-09 08:50:35

Kubernetes增強功能版本更新

2016-06-15 10:35:59

云計算

2017-08-23 11:10:44

Kubernetes 調度詳解

2024-03-14 09:27:55

KubernetesAIPyTorch

2022-07-24 21:11:19

KubernetesLinux

2022-06-27 10:25:55

Kubernetes調度CPU

2022-05-16 08:27:20

KubernetePodLinux

2025-10-13 07:00:00

KubernetesPod調度運維

2022-01-25 18:24:20

KubernetesDeschedule

2022-08-26 09:29:01

Kubernetes策略Master

2023-09-17 17:59:28

邊緣計算調度方案

2025-04-08 08:05:00

PodKubernetes容器

2024-02-26 00:00:00

TypeScript裝飾器decorators

2009-11-24 11:09:32

路由器崩潰
點贊
收藏

51CTO技術棧公眾號

久久电影网站中文字幕| 日韩欧美视频| 色综合色综合色综合| 日本高清一区| 超碰免费在线97| 久久xxxx精品视频| 综合网日日天干夜夜久久| 四虎国产精品永久免费观看视频| 182在线播放| 中文成人综合网| 国产精品一区二区三区在线| 麻豆精品久久久久久久99蜜桃| 91亚洲国产成人久久精品| 亚洲国产精品小视频| 亚洲精品视频导航| 国产激情视频在线看| 国产精品初高中害羞小美女文| 国产三级精品在线不卡| 曰批又黄又爽免费视频| 亚洲乱码视频| 久久伊人精品视频| mm131丰满少妇人体欣赏图| 亚洲精品高潮| 欧美美女一区二区三区| 黄色片久久久久| 青青草原国产在线| 亚洲同性gay激情无套| 欧美一区1区三区3区公司| 亚洲xxx在线| 精品一区二区免费在线观看| 日本精品va在线观看| 久久久久久久久精| 91精品国产麻豆国产在线观看| 伊人伊成久久人综合网站| 极品白嫩丰满美女无套| 午夜日韩影院| 欧美一区二区三区播放老司机| 激情 小说 亚洲 图片: 伦| 日韩欧美一中文字暮专区| 亚洲国产一区二区三区| 免费看污污视频| caoporm免费视频在线| 国产精品久久久久久久裸模| 免费日韩av电影| 日本高清视频www| 国产a久久麻豆| 97se国产在线视频| 午夜美女福利视频| 丁香婷婷综合网| 99电影网电视剧在线观看| 国产欧美综合视频| 国产精品1区2区| 亚洲一区二区三区xxx视频| 亚洲一区二区影视| 韩国一区二区三区| 99久久99| 手机看片福利在线| 久久蜜桃一区二区| 视频三区二区一区| 69xxxx欧美| ...xxx性欧美| 欧美一区二区三区综合| 爱看av在线入口| 香蕉久久一区二区不卡无毒影院 | 永久免费av在线| 国产精品超碰97尤物18| 伊人久久99| a视频在线免费看| 亚洲午夜在线电影| 免费看的黄色大片| 欧美magnet| 欧美人妇做爰xxxⅹ性高电影| 亚洲污视频在线观看| 二区三区精品| 精品久久一区二区三区| av无码av天天av天天爽| 精品久久久久中文字幕小说| 日韩一级裸体免费视频| 欧美国产日韩综合| 亚洲综合国产激情另类一区| 国产精品成人播放| 国产特级黄色片| 99久久伊人网影院| 日韩久久不卡| 黑人玩欧美人三根一起进| 欧美日韩国产精品| 色国产在线视频| 成人台湾亚洲精品一区二区| 亚洲人成自拍网站| 日韩欧美123区| 国产农村妇女精品一区二区| 国产精品视频99| 欧美熟女一区二区| 国产亲近乱来精品视频| 国产av熟女一区二区三区 | 国产精品九九九| 99热在线只有精品| 久久色视频免费观看| 手机在线视频你懂的| 色在线中文字幕| 91精品国产91久久久久久一区二区| 人妻无码中文久久久久专区| 日韩精品水蜜桃| 亚州成人av在线| 国产欧美日韩综合精品一区二区三区 | 亚洲免费观看高清| 日本在线视频www| 麻豆一二三区精品蜜桃| 亚洲香蕉av在线一区二区三区| 真实国产乱子伦对白在线| 视频一区二区国产| 国产欧美亚洲日本| 免费在线观看av网站| 欧美视频在线免费看| 性生交大片免费看l| 欧美一区三区| 8x海外华人永久免费日韩内陆视频| 又色又爽又黄无遮挡的免费视频| 91婷婷韩国欧美一区二区| 四虎永久免费网站| 国产日本久久| 亚洲午夜激情免费视频| 日本三级片在线观看| 极品少妇一区二区| 亚洲不卡一卡2卡三卡4卡5卡精品| gogo在线高清视频| 欧美日本一道本| 影音先锋男人在线| 久久久成人网| 免费日韩av电影| 国产激情在线播放| 亚洲国产精品嫩草影院久久| 在线免费观看亚洲视频| 久久99国产精品成人| 日韩国产高清一区| 久久夜夜操妹子| 亚洲另类xxxx| 免费的毛片视频| 久久一区二区三区四区| 日韩av黄色网址| 欧美午夜寂寞| 97成人在线视频| 天天综合永久入口| 欧美日韩在线影院| 30一40一50老女人毛片| 国产一级久久| 欧美极品视频一区二区三区| 性欧美xxx69hd高清| 日韩av在线免费观看| 国产午夜小视频| 99免费精品视频| 大肉大捧一进一出好爽视频| 欧美绝顶高潮抽搐喷水合集| 97在线免费视频| 日韩亚洲视频在线观看| 在线亚洲精品福利网址导航| 中文字幕成人动漫| 蜜臀av性久久久久蜜臀aⅴ四虎 | 999国产在线视频| 欧美日韩亚州综合| 欧美老熟妇一区二区三区| 国产精品一区二区无线| www..com日韩| 国产精品欧美三级在线观看| 国产精品久久一区| 国产美女在线观看| 欧美精品一区二区三区在线播放| 国产午夜精品无码一区二区| 91在线观看地址| 免费黄色特级片| 色乱码一区二区三区网站| 亚洲一区免费网站| 波多野一区二区| 亚洲图中文字幕| 国产jzjzjz丝袜老师水多| 亚洲一二三专区| 免费看污黄网站在线观看| 免费成人在线观看| 国产91在线亚洲| 伊人春色精品| 91久久久久久久久| 亚洲天堂av在线| 久久视频这里只有精品| 人妻视频一区二区三区| 欧美亚洲禁片免费| 国产亚洲精品久久久久久打不开| 久久综合狠狠综合久久综合88| 国产3p在线播放| 亚洲一区国产一区| 中文字幕av日韩精品| 国内自拍欧美| 国产日韩欧美在线观看| h片在线观看下载| 中文精品99久久国产香蕉| 丰满人妻一区二区三区免费| 一本久久a久久精品亚洲| 久草综合在线视频| 久久久久国色av免费看影院| 日韩精品xxx| 日韩电影在线一区二区三区| 久久久久久久久久伊人| 欧美精品一区二区三区中文字幕| 成人91视频| 色综合久久久| 91超碰caoporn97人人| av中文字幕在线播放| 亚洲视频电影图片偷拍一区| 国产成人精品免费看视频| 在线观看av一区| 免费在线看黄网址| 中文字幕一区二区在线观看| 李宗瑞91在线正在播放| 国产a精品视频| 女人高潮一级片| 日日夜夜精品视频免费| 美女扒开大腿让男人桶| 天堂美国久久| 亚洲欧洲一区二区| 尤物tv在线精品| 国产伦精品一区二区三区在线| 欧美高清你懂的| 国产精品99蜜臀久久不卡二区| 成人av影院在线观看| 久久精品久久久久久国产 免费| 欧美色综合一区二区三区| 精品99一区二区三区| 精品久久久久中文慕人妻| 欧美日韩一区中文字幕| 337p粉嫩色噜噜噜大肥臀| 色综合天天做天天爱| 国产特黄大片aaaa毛片| 亚洲www啪成人一区二区麻豆| 欧美高清视频一区二区三区| 亚洲人成小说网站色在线| 大胸美女被爆操| 中文在线免费一区三区高中清不卡 | 欧美男男gaygay1069| 国产精品久久久久久超碰| 欧美色片在线观看| 国产精品69久久| 蜜桃精品在线| 国产精品国产亚洲伊人久久| 成人看片网页| 国产精品视频一区二区高潮| 一区二区视频免费完整版观看| 日本三级韩国三级久久| 北岛玲heyzo一区二区| 日本视频久久久| 欧美日韩五码| 91精品久久久久久久久久另类| 久久爱.com| 成人在线国产精品| 人人九九精品视频| 国产精品一区二区三区免费观看| 麻豆国产欧美一区二区三区r| 精品国产一区二区三区久久久久久 | 巨乳诱惑日韩免费av| 国产裸体免费无遮挡| 日本伊人午夜精品| 久久久久久久久久一区| 国产一区二区三区四区五区美女| 能看毛片的网站| 99久久综合国产精品| b站大片免费直播| 国产精品日韩精品欧美在线| 午夜爽爽爽男女免费观看| 一区二区三区在线免费视频 | 黄色免费在线网站| 欧美高跟鞋交xxxxxhd| yellow字幕网在线| 国产精品成久久久久三级| 国产高清视频一区二区| 国产精品日韩一区二区三区 | 久久99久久久久久| 一级成人国产| 少妇一级淫免费放| 国产成人免费视频精品含羞草妖精| 无码av免费精品一区二区三区| 91欧美一区二区| 影音先锋制服丝袜| 亚洲黄一区二区三区| 国产一区二区99| 欧美精品色一区二区三区| 欧美一级性视频| 一本一道久久a久久精品逆3p| 污视频网站在线免费| 6080yy精品一区二区三区| 欧美jizz18| 久久视频在线观看中文字幕| 天天插综合网| 国产91在线视频观看| 狠狠网亚洲精品| 亚洲第一成人网站| 亚洲精品菠萝久久久久久久| 国内自拍视频在线播放| 日韩午夜三级在线| 国产在线电影| 久久久噜噜噜久久| 成人免费黄色| 久久综合九色欧美狠狠| 亚洲国产精品综合久久久| 国产xxxxx在线观看| 国产一区二区按摩在线观看| 欧美做受高潮6| 亚洲午夜在线视频| 99热这里只有精品在线| 亚洲人成网站免费播放| 福利成人导航| 亚洲影影院av| 天天做天天爱天天爽综合网| 成人羞羞国产免费网站| 成人免费不卡视频| 手机在线免费看毛片| 色八戒一区二区三区| 三级网站免费观看| 欧美老女人性视频| 欧美男女视频| 亚洲成人网上| 男女性色大片免费观看一区二区| 久久人人妻人人人人妻性色av| 亚洲精品日韩一| 91精品国自产| 日韩专区在线观看| 日韩色淫视频| 欧美一进一出视频| 久久精品动漫| 日本丰满少妇裸体自慰| 亚洲www啪成人一区二区麻豆| www.桃色av嫩草.com| 久久影院免费观看| 四虎国产精品免费久久5151| 亚欧洲精品在线视频免费观看| 免播放器亚洲| 久久久亚洲av波多野结衣| 亚洲超丰满肉感bbw| 蜜桃av中文字幕| 久久久这里只有精品视频| 动漫av一区| 2018日日夜夜| av午夜精品一区二区三区| 日韩伦理在线视频| 亚洲精品久久久久国产| 男人久久天堂| 欧美大香线蕉线伊人久久国产精品| 亚洲免费观看| 亚洲调教欧美在线| 黑人精品xxx一区| 四虎影视在线观看2413| 欧美一级视频免费在线观看| 网友自拍一区| 久久手机精品视频| www.18av.com| 伊人影院在线视频| 久久91精品国产91久久久| 国产精品久久久久久久久久久久久久久| 色综合久久久久久久久五月| 日韩国产精品久久久久久亚洲| 91激情视频在线观看| 欧美三级蜜桃2在线观看| 国产在线激情视频| 成人看片在线| 国产精品美女久久久| 亚洲成人黄色av| 欧美剧在线免费观看网站 | 欧美第一淫aaasss性| 国产欧美自拍一区| 男人天堂999| 一区在线中文字幕| www.国产精品视频| 55夜色66夜色国产精品视频 | 亚洲色图美腿丝袜| 97久久精品一区二区三区的观看方式| 黄色成人在线免费观看| 9人人澡人人爽人人精品| 91黑人精品一区二区三区| www.色综合| 精品淫伦v久久水蜜桃| 91淫黄看大片| 亚洲激情图片一区| 日本成人一区| 91成人在线看| 天堂久久一区二区三区| 国产精品丝袜一区二区| 日韩成人中文字幕| 亚洲人体在线| 91九色在线观看视频| 国产精品久久久一本精品| 免费看国产片在线观看| 国产精品美女www爽爽爽视频| 亚洲乱码精品| 91成年人网站| 精品毛片乱码1区2区3区| 网友自拍亚洲| 日韩一级性生活片| 国产精品麻豆久久久| 人妻精品无码一区二区| 国产欧美在线看| 免费久久99精品国产自在现线| 欧美风情第一页| 亚洲色图美腿丝袜|