国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

機器學習平臺在Kubernetes上的實踐

人工智能 機器學習
本文回顧總結近一段時間網易云音樂機器學習平臺(GoblinLab)在容器化實踐的一些嘗試。截止今日,音樂機器學習平臺(GoblinLab)在容器化方面的嘗試,已開展了一段時間,并且已經有了階段性的成果。

背景

過去音樂算法的模型訓練任務,是在物理機上進行開發、調試以及定時調度。每個算法團隊使用屬于自己的獨立物理機,這種現狀會造成一些問題。比如物理機的分布零散,缺乏統一的管理,主要依賴于doc文檔的表格記錄機器的使用與歸屬;各業務間機器資源的調配,有時需要機器在不同機房的搬遷,耗時耗力。另外,由于存在多人共用、開發與調度任務共用等情況,會造成環境的相互影響,以及資源的爭奪。針對當前的情況,總結問題如下:

  • 資源利用率低:部分機器資源利用率偏低;無法根據各個業務的不同階段,在全局內快速、動態的實現擴縮容,以達到資源的合理配置,提升資源整體利用率;
  • 環境相互影響:存在多人共用、測試與調度混用同一開發機,未做任何的隔離,造成可能的環境、共享資源的相互影響與爭奪;
  • 監控報警缺失:物理機模式,任務監控報警功能缺失,導致任務無法運維,或者效率低。

資源沒有全局統一的合理調配,會出現負載不均衡,資源不能最大化的利用。

Kubernetes的嘗試

在快速的擴縮容、環境隔離、資源監控等方面,Kubernetes及其相關擴展,可以很好的解決問題。現將物理機集中起來,并構建成一個Kubernetes集群。通過分析算法同事以往的工作方式,機器學習平臺(GoblinLab)決定嘗試基于Kubernetes提供在線的開發調試容器環境以及任務的容器化調度兩種方案,其分別針對任務開發和任務調度兩種場景。

任務開發

為最大化的減少算法同事由物理機遷移到容器化環境的學習成本,GoblinLab系統中基本將Kubernetes的容器當做云主機使用。容器的鏡像以各版本Tensoflow鏡像為基礎(底層是Ubuntu),集成了大數據開發環境(Hadoop、Hive、Spark等Client),安裝了常用的軟件。另外,為了方便使用,容器環境提供了Jupyter Lab、SSH登錄、Code Server(VSCode)三種使用方式。

在GoblinLab中新建容器化開發環境比較簡單,只需選擇鏡像,填寫所需的資源,以及需要掛載的外部存儲即可(任務開發的環境下文簡稱開發實例)。

新建環境配置后,點擊啟動實例,容器初始化時,會自動啟動Jupyter lab、SSH以及CodeServer。

Jupyter Lab:

Code Server:

SSH登錄:

算法可以選擇以上任意一種方式進行任務的開發,或者調試。由于提供了Code Server(VSCode),所以可以獲得更好的體驗。

任務開發所用的容器化環境,在底層Kubernetes上是通過StatefulSet類型實現,對應資源編排文件如下(已精簡細節): 

  1. kind: StatefulSet 
  2. apiVersion: apps/v1 
  3. metadata: 
  4. name: ${name
  5. namespace: "${namespace}" 
  6. spec: 
  7. replicas: 1 
  8. selector: 
  9. matchLabels: 
  10.   statefulset: ${name
  11.   system/app: ${name
  12. template: 
  13. spec: 
  14.   <#if (gpu > 0)> 
  15.   tolerations: 
  16.       - effect: NoSchedule 
  17.         key: nvidia.com/gpu 
  18.         value: "true" 
  19.   </#if> 
  20.   <#if usePrivateRepository == "true"
  21.   imagePullSecrets: 
  22.     - name: registrykey-myhub 
  23.   </#if> 
  24.   volumes: 
  25.     - name: localtime 
  26.       hostPath: 
  27.         path: /etc/localtime 
  28.     <#if MountPVCs?? && (MountPVCs?size > 0)> 
  29.     <#list MountPVCs?keys as key
  30.     - name"${key}" 
  31.       persistentVolumeClaim: 
  32.         claimName: "${key}" 
  33.     </#list> 
  34.   containers: 
  35.     - name: notebook 
  36.       image: ${image} 
  37.       imagePullPolicy: IfNotPresent 
  38.       volumeMounts: 
  39.         - name: localtime 
  40.           mountPath: /etc/localtime 
  41.         <#if readMountPVCs?? && (readMountPVCs?size > 0)> 
  42.         <#list readMountPVCs?keys as key
  43.         - name"${key}" 
  44.           mountPath: "${readMountPVCs[key]}" 
  45.           readOnly: true 
  46.         </#list> 
  47.         </#if> 
  48.         <#if writeMountPVCs?? && (writeMountPVCs?size > 0)> 
  49.         <#list writeMountPVCs?keys as key
  50.         - name"${key}" 
  51.           mountPath: "${writeMountPVCs[key]}" 
  52.         </#list> 
  53.         </#if> 
  54.       env: 
  55.         - name: NOTEBOOK_TAG 
  56.           value: "${name}" 
  57.         - name: HADOOP_USER 
  58.           value: "${hadoopUser}" 
  59.         - namePASSWORD 
  60.           value: "${password}" 
  61.       resources: 
  62.         requests: 
  63.           cpu: ${cpu} 
  64.           memory: ${memory}Gi 
  65.           <#if (gpu > 0)> 
  66.           nvidia.com/gpu: ${gpu} 
  67.           </#if> 
  68.         limits: 
  69.           cpu: ${cpu} 
  70.           memory: ${memory}Gi 
  71.           <#if (gpu > 0)> 
  72.           nvidia.com/gpu: ${gpu} 
  73.           </#if> 

目前GolbinLab已提供基于Tensoflow各版本的CPU與GPU通用鏡像11個,以及多個定制化鏡像。

任務調度

算法同事在使用容器化環境之前,任務的開發調度都是在GPU物理機器上完成,調度一般都是通過定時器或crontab命令調度任務,任務無失敗、超時等報警,以及也沒有重試等機制,基本無相關的任務運維工具。

在介紹容器中開發的任務如何上線調度之前,先簡要介紹一下GoblinLab的系統架構。

上圖為GoblinLab簡化的系統架構,其中主要分為四層,由上到下分別為:

  • Application-應用層:提供直接面向用戶的機器學習開發平臺(GoblinLab)
  • Middle-中間層: 中間層,主要是接入了統一的調度、報警、以及配置等服務
  • Wizard-執行服務: 其提供統一的執行服務,提供包含Kubernetes、Spark、Jar等各類任務的提交執行。插件式,支持快速擴展
  • Infrastructure-基礎設施: 底層的基礎設施,主要包含Kubernetes集群、Spark集群以及普通服務器等

GolbinLab為了保障調度任務的穩定性,將任務的開發與調度拆分,改變之前算法直接在物理機上開發完任務后,通過定時器或者crontab調度任務的方式。如上圖所示,在開發完成后,任務的調度是通過任務流中的容器化任務調度組件實現,用戶需填組件的相關參數(代碼所在PVC及路徑,配置鏡像等),再通過任務流的調度功能實現任務調度。與任務開發不同,每個調度任務執行在獨立的容器中,保證任務間相互隔離,同時通過后續介紹的資源隔離方案,可以優先保障線上調度任務所需資源。

任務調度執行的一般流程如下:

任務調度執行時在Kubernetes上資源編排文件(已精簡細節): 

  1. apiVersion: batch/v1 
  2. kind: Job 
  3. metadata: 
  4. name: ${name
  5. namespace: ${namespace} 
  6. spec: 
  7. template: 
  8. spec: 
  9.   containers: 
  10.     - name: jupyter-job 
  11.       image: ${image} 
  12.       env: 
  13.         - name: ENV_TEST 
  14.           value: ${envTest} 
  15.       command: ["/bin/bash""-ic", "cd ${workDir} && \ 
  16.         ${execCommand} /root/${entryPath} ${runArgs}"] 
  17.       volumeMounts: 
  18.         - mountPath: "/root" 
  19.           name"root-dir" 
  20.       resources: 
  21.         requests: 
  22.           cpu: ${cpu} 
  23.           memory: ${memory}Gi 
  24.           <#if (gpu > 0)> 
  25.           nvidia.com/gpu: ${gpu} 
  26.           </#if> 
  27.         limits: 
  28.           cpu: ${cpu} 
  29.           memory: ${memory}Gi 
  30.           <#if (gpu > 0)> 
  31.           nvidia.com/gpu: ${gpu} 
  32.           </#if> 
  33.   volumes: 
  34.     - name"root-dir" 
  35.       persistentVolumeClaim: 
  36.         claimName: "${pvc}" 
  37. backoffLimit: 0 

權限控制

容器化開發環境配置啟動后,用戶可以通過SSH登錄、CodeServer或JupyterLab等其中一種方式使用。為了避免容器化開發環境被其他人使用,GoblinLab給每種方式都設置了統一的密鑰,而密鑰在每次啟動時隨機生成。

1、隨機生成密碼

2、設置賬號密碼(SSH登錄密碼)

  1. echo "root:${password}" | chpasswd 

3、設置Code Server密碼 (VSCode) 

  1. #設置環境變量PASSWORD即可 
  2. env:      
  3. namePASSWORD        
  4. value: "${password}"  

4、設置Jupyter Lab密碼 

  1. jupyter notebook --generate-config,~/.jupyter 目錄下生成jupyter_notebook_config.py,并添加代碼 
  2. import os  
  3. from IPython.lib import passwd 
  4. c = c  # pylint:disable=undefined-variable  
  5. c.NotebookApp.ip = '0.0.0.0'  # https://github.com/jupyter/notebook/issues/3946 c.NotebookApp.port = int(os.getenv('PORT', 8888)) c.NotebookApp.open_browser = False 
  6. sets a password if PASSWORD is set in the environment 
  7. if 'PASSWORD' in os.environ:    
  8. password = os.environ['PASSWORD']    
  9. if password:      
  10.  c.NotebookApp.password = passwd(password)    
  11. else:      
  12.  c.NotebookApp.password = ''      
  13.  c.NotebookApp.token = ''    
  14. del os.environ['PASSWORD']  

數據持久化

在Kubernetes容器中,如無特殊配置,容器中的數據是沒有進行持久化,這意味著隨著容器的刪除或者重啟,數據就會丟失。對應的解決方法比較簡單,只需給需要持久化的目錄,掛載外部存儲即可。在GoblinLab中,會給每個用戶自動創建一個默認的外部存儲PVC,并掛載到容器的/root目錄。另外,用戶也可以自定義外部存儲的掛載。

除了自動創建的PVC外,用戶也可以自己創建PVC,并支持將創建的PVC只讀或者讀寫分享給其他人。

另外,在Goblinlab上也可以對PVC里的數據進行管理。

服務暴露

Kubernetes集群中創建的服務,在集群外無法直接訪問,GoblinLab使用Nginx Ingress + Gateway訪問,將集群內的服務暴露到外部。

容器化開發環境的Service資源編排文件如下(已精簡細節): 

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata: 
  4. name: ${name
  5. namespace: ${namespace} 
  6. spec: 
  7. clusterIP: None 
  8. ports: 
  9. name: port-notebook 
  10.   port: 8888 
  11.   protocol: TCP 
  12.   targetPort: 8888 
  13. name: port-sshd 
  14.   port: 22 
  15.   protocol: TCP 
  16.   targetPort: 22 
  17. name: port-vscode 
  18.   port: 8080 
  19.   protocol: TCP 
  20.   targetPort: 8080 
  21. name: port-tensofboard 
  22.   port: 6006 
  23.   protocol: TCP 
  24.   targetPort: 6006 
  25. <#if ports?? && (ports?size > 0)> 
  26. <#list ports as port> 
  27. name: port-${port} 
  28.   port: ${port} 
  29.   targetPort: ${port} 
  30. </#list> 
  31. </#if> 
  32. selector: 
  33. statefulset: ${name
  34. type: ClusterIP 

每當用戶啟動一個容器化開發環境,GoblinLab將通過接口自動修改Nginx Ingress配置,將服務暴露出來,以供用戶使用,Ingress轉發配置如下: 

  1. apiVersion: v1 
  2. kind: ConfigMap 
  3. metadata: 
  4. name: tcp-services 
  5. namespace: kube-system 
  6. data: 
  7. "20000": ns/notebook-test:8888 
  8. "20001": ns/notebook-test:8080 
  9. "20002": ns/notebook-test:22 

資源管控

為提高資源的利用率,GoblinLab底層Kubernetes中的資源,基本都是以共享的方式使用,并進行一定比例的超售。但是當多個團隊共享一個資源總量固定的集群時,為了確保每個團隊公平的共享資源,此時需要對資源進行管理和控制。在Kubernetes中,資源配額就是解決此問題的工具。目前GoblinLab需要管控的資源主要為CPU、內存、GPU以及存儲等。平臺在考慮各個團隊的實際需求后,將資源劃分為多個隊列(Kubernetes中的概念為namespace),提供給各個團隊使用。 

  1. apiVersion: v1 
  2. kind: ResourceQuota 
  3. metadata: 
  4. name: skiff-quota 
  5. namespace: test 
  6. spec: 
  7. hard: 
  8. limits.cpu: "2" 
  9. limits.memory: 5Gi 
  10. requests.cpu: "2" 
  11. requests.memory: 5Gi 
  12. requests.nvidia.com/gpu: "1" 
  13. requests.storage: 10Gi 

在集群中,最常見的資源為CPU與內存,由于可以超售(overcommit),所以存在limits與requests兩個配額限制。除此以外,其他資源為擴展類型,由于不允許overcommit,所以只有requests配額限制。參數說明:

  • limits.cpu:Across all pods in a non-terminal state, the sum of CPU limits cannot exceed this value.
  • limits.memory: Across all pods in a non-terminal state, the sum of memory limits cannot exceed this value.
  • requests.cpu:Across all pods in a non-terminal state, the sum of CPU requests cannot exceed this value.
  • requests.memory:Across all pods in a non-terminal state, the sum of memory requests cannot exceed this value.
  • http://requests.nvidia.com/gpu:Across all pods in a non-terminal state, the sum of gpu requests cannot exceed this value.
  • requests.storage:Across all persistent volume claims, the sum of storage requests cannot exceed this value.

可以進行配額控制的資源不僅有CPU、內存、存儲、GPU,其他類型參見官方文檔:https://kubernetes.io/docs/con ... otas/

資源隔離

GoblinLab的資源隔離,指的是在同一Kubernetes集群中,資源在調度層面的相對隔離,其中包含GPU機器資源的隔離、線上與測試任務的隔離。

GPU機器資源的隔離

在Kubernetes集群中,相對于CPU機器,GPU機器資源較為珍貴,因此為了提供GPU的利用率,禁止CPU任務調度在GPU機器上。

GPU節點設置污點(Taint):禁止一般任務調度在GPU節點 

  1. key:    nvidia.com/gpu  
  2. value:  true  
  3. effect: NoSchedule   

Taint的effect可選配置:

  • NoSchedule:Pod不會被調度到標記為taints節點。
  • PreferNoSchedule:NoSchedule的軟策略版本。盡量避免將Pod調度到存在其不能容忍taint的節點上。
  • NoExecute:該選項意味著一旦Taint生效,如該節點內正在運行的Pod沒有對應Tolerate設置,會直接被逐出。

GPU任務設置容忍(Toleration):讓GPU任務可以調度在GPU節點 

  1. <#if (gpu > 0)>    
  2. tolerations:        
  3. - effect: NoSchedule          
  4. key: nvidia.com/gpu          
  5. value: "true"    
  6. </#if> 

線上與測試任務隔離

線上與測試任務(GolbinLab中線上任務與測試任務為業務層面的定義,指的是周期調度任務和開發測試任務)使用同一Kubernetes集群,但為了保障線上任務的資源,會特殊設置一些機器節點為線上任務的專有資源池。線上任務執行時優先調度在線上節點上,線上資源池無資源時,也可調度于非線上節點。

線上資源池節點設置污點(Taint):禁止一般任務調度在線上資源池 

  1. key:    node.netease.com/node-pool  
  2. value:  online  
  3. effect: NoSchedule  

線上任務添加容忍(Toleration):允許線上任務調度于線上資源池,但不是必須調度于線上資源池中 

  1. tolerations:        
  2. - effect: NoSchedule          
  3. key: node.netease.com/node-pool          
  4. value: "online"          
  5. operator: Equal 

線上資源池中機器節點設置標簽 + 線上任務設置節點親和性(nodeAffinity):優先將線上任務調度在線上資源池中,但如果線上資源池中無已資源,此時也可以調度在其他節點上

線上資源池中節點設置標簽:為了方便,標簽與污點同名:

  1. node.netease.com/node-pool: online 

線上任務設置節點親和性(nodeAffinity):線上任務優先調度在線上資源池中 

  1. affinity:      
  2. nodeAffinity: 
  3. preferredDuringSchedulingIgnoredDuringExecution: 
  4.   nodeSelectorTerms: 
  5.     - matchExpressions: 
  6.     - key: node.netease.com/node-pool                
  7.     operator: In                
  8.    values:                  
  9.     - online 

目前Node affinity有以下幾種策略,官方文檔affinity-and-anti-affinity:

  • requiredDuringSchedulingIgnoredDuringExecution表示Pod必須部署到滿足條件的節點上,如果沒有滿足條件的節點,就不停重試。其中IgnoreDuringExecution表示Pod部署之后運行的時候,如果節點標簽發生了變化,不再滿足Pod指定的條件,Pod也會繼續運行。
  • requiredDuringSchedulingRequiredDuringExecution表示Pod必須部署到滿足條件的節點上,如果沒有滿足條件的節點,就不停重試。其中RequiredDuringExecution表示Pod部署之后運行的時候,如果節點標簽發生了變化,不再滿足Pod指定的條件,則重新選擇符合要求的節點。
  • preferredDuringSchedulingIgnoredDuringExecution表示優先部署到滿足條件的節點上,如果沒有滿足條件的節點,就忽略這些條件,按照正常邏輯部署。
  • preferredDuringSchedulingRequiredDuringExecution表示優先部署到滿足條件的節點上,如果沒有滿足條件的節點,就忽略這些條件,按照正常邏輯部署。其中RequiredDuringExecution表示如果后面節點標簽發生了變化,滿足了條件,則重新調度到滿足條件的節點。

策略生效后效果如下圖所示, 線上任務優先執行與線上資源池節點中,但當線上資源池沒有空閑資源后,線上任務Job5也可以去使用普通節點的資源。

階段性結果

截止今日,音樂機器學習平臺(GoblinLab)在容器化方面的嘗試,已開展了一段時間,并且已經有了階段性的成果。

集群建設

經過近一段時間的嘗試,目前音樂數據平臺的Kubernetes,隨著承載的業務越來越多,以及基于Kubernetes的大數據計算平臺(Flink等)的落地,后續將有大量的CPU資源加入, 其穩定性將會成為比較大的挑戰。

用戶使用

  • 任務遷移:目前協助算法同事已完成80%任務遷移

任務開發

  • 用戶情況 : 已有60%算法同學使用開發實例的容器化環境;其中用戶來源包含音樂推薦算法、社交視頻推薦算法、搜索算法、音視頻、數據應用、實時計算算法等團隊
  • 開發實例:平臺鼓勵組內共用開發實例,限制了每人最多創建3個開發實例
  • 任務調度: 覆蓋云音樂音樂推薦、社交視頻推薦算法、搜索算法、音視頻、數據應用、實時計算算法等多個團隊

容器化的好處

對于算法同事,由物理機遷移到機器學習平臺提供容器化的環境,能夠帶來的好處是:

  • 更多資源:由于整理資源利用率的提高,將有機會獲取到比之前單獨使用物理機更多的資源;另外資源擴縮容的周期由之前的以天為單位減少到秒級別即可完成
  • 更好體驗:通過打通大數據、Git環境,提供多樣化的使用方式(SSH和在線IDE),由機器學習平臺統一維護環境鏡像,避免了每個團隊需自己搭建、運維環境的苦惱
  • 更完善的任務調度:GoblinLab的調度,提供了更完善的報警、重試、依賴檢查等功能,并且能夠與之前已有PS、Ironbaby任務的整合,實現在一個任務流的統一調度
  • 更好的隔離:環境隔離是容器化的天然優勢。另外資源在調度層面的隔離,可以更好的保障線上任務
  • 統一的入口:統一了開發的入口后,可以有更大的操作空間。例如將通用的服務抽象后由平臺直接提供(依賴檢查、調度、報警監控等等)、數據的共享、鏡像的更新以及后面持續的支持服務等

后續規劃

目前音樂機器學習平臺已能提供完整的容器化開發基礎能力,為進一步提高集群的資源利用率、提升運維效率,后續計劃從資源調度策略優化(搶占等)、更豐富的資源監控等方面入手,進一步優化。

作者:網易云音樂數據智能部數據平臺組王軍正

 

責任編輯:未麗燕 來源: 小石頭的碼瘋窩
相關推薦

2016-12-23 09:09:54

TensorFlowKubernetes框架

2021-06-05 06:52:16

Kubernetes

2022-10-09 08:08:02

人工智能機器學習平臺

2021-01-08 13:42:28

愛奇藝機器學習深度學習

2022-02-21 16:05:26

機器學習優勢Python

2018-07-19 10:35:12

機器學習數據平臺

2023-10-23 07:13:04

2023-02-20 07:46:45

機器學習AI 技術

2018-12-16 16:21:08

HadoopKubernetes容器

2019-08-16 11:48:53

容器云平臺軟件

2024-03-18 00:00:04

AIKubernetes機器學習

2023-01-26 11:56:31

Kubernete虛擬機k3s

2022-05-10 08:27:15

小紅書FlinkK8s

2025-07-31 01:22:00

2022-12-29 14:25:22

2019-04-23 09:48:21

KubernetesPostgreSQL

2019-07-12 14:41:31

微服務Kubernetes容器

2022-04-14 10:29:57

機器學習時間技術

2018-10-05 23:26:00

機器學習算法數據

2021-01-26 09:46:59

PythonStacking機器學習
點贊
收藏

51CTO技術棧公眾號

日韩成人精品在线| 亚洲精品久久久久| 四虎永久在线高清国产精品| 久久精品视频在线看| 一道本在线免费视频| 亚洲综合免费观看高清在线观看| 天堂成人在线| 欧美日韩电影在线播放| 91高清在线观看视频| 亚洲深夜福利视频| 日韩精品视频一区二区三区| 国产成人精品日本亚洲| 国产精品99一区二区| 亚洲日本japanese丝袜| 久久久久久综合| 少妇性bbb搡bbb爽爽爽欧美| xxxx欧美18另类的高清| 国产二区视频在线播放| 久久久综合九色合综国产精品| 黄页视频在线观看| 亚洲专区欧美专区| 在线不卡中文字幕| 国产美女被下药99| 国产乱妇乱子在线播视频播放网站| 午夜国产精品一区| 亚洲承认视频| 美女av免费观看| 国产成人综合视频| 97影视大全免费追剧大全在线观看| 日韩在线欧美在线国产在线| 国产精品香蕉一区二区三区| eeuss在线观看| 欧美精品一区二区蜜臀亚洲| 国产在线不卡一区| 欧美日韩在线一二三| 亚洲国产欧美在线| 一区二区三区日本久久久| 亚洲影视一区| 国产这里只有精品| 国产一区二区三区黄视频 | 最美情侣韩剧在线播放| 日韩午夜av电影| 台湾色综合娱乐中文网| 午夜精品一区二区在线观看的| 日韩理论片中文av| av高清不卡| 国产精品日韩一区二区三区| 久久婷婷久久一区二区三区| 欧美黑人激情| 欧美中文在线视频| 大陆成人av片| 性直播体位视频在线观看| 日本成熟性欧美| 99麻豆久久久国产精品免费优播| 尤物视频在线免费观看| 国产99久久久欧美黑人| 91在线丨porny丨国产| 欧美xxxx视频| 国产伦精品一区二区三区视频孕妇 | 国产精品视频网址| 高潮精品一区videoshd| 一级毛片视频在线| 欧洲成人在线观看| jiyouzz国产精品久久| 2019中文字幕在线视频| 国产精品91久久久| 成人在线综合网站| 大桥未久在线播放| 国产精华一区二区三区| 国产精品久久久久aaaa樱花| 日韩精品专区| 日韩亚洲一区在线播放| 欧美日韩免费高清一区色橹橹| 精品国产91乱码一区二区三区四区 | 欧美日韩中文字幕一区| 波多野结衣在线观看一区二区三区 | jizz亚洲女人高潮大叫| 亚洲精品久久区二区三区蜜桃臀| 一本大道久久a久久综合婷婷| 亚洲理论电影| 男人艹女人网站| 欧美激情精品久久久久久黑人| 久久av中文字幕片| 麻豆av在线免费观看| 精品久久久三级| 欧美日韩国产一二三| 欧美a级片网站| 国产鲁鲁视频在线观看免费| 亚洲综合精品一区二区| 欧美视频在线看| 成人三级视频| 自拍av在线| 91亚洲精品在线观看| 日韩欧美有码在线| 欧美成人久久| 日韩av中文| 色视频一区二区三区| 亚洲精品xxx| 国产成人在线视频网址| 欧美free嫩15| www日韩视频| 亲子乱一区二区三区电影| 亚洲综合激情小说| 中文在线日韩| 黄网站app在线观看| 五月天久久狠狠| 亚洲免费高清视频| 91网站最新网址| 日韩成人一级| 亚洲色图图片网| 麻豆久久久9性大片| 亚洲第一精品夜夜躁人人躁| 国产99久久久国产精品潘金| 日韩在线精品强乱中文字幕| 久草在线资源网站| 国产欧美一区二区白浆黑人| 精品毛片三在线观看| 女生裸体视频一区二区三区| 宅男在线观看免费高清网站| 免费极品av一视觉盛宴| 国产69精品久久久久99| 亚洲电影一区二区| 久久久久久婷| 色综合一区二区日本韩国亚洲| 四虎影视av| 国内精品久久国产| 在线观看国产欧美| 一区二区三区在线免费播放| 亚洲精一区二区三区| 激情亚洲影院在线观看| 国产一级黄色片免费| 久久99精品国产99久久| 国产一区二区动漫| 亚洲永久精品国产| 看片的网站亚洲| 三级小说欧洲区亚洲区| 国产福利在线播放麻豆| 凹凸国产熟女精品视频| 国产欧美久久一区二区| 91精品免费观看| 久久免费视频色| 欧美91精品| 日韩毛片免费看| 免费看男男www网站入口在线 | 亚洲国产成人自拍| 一区免费在线| 久久亚洲国产精品尤物| 嫩草研究院在线| 黄色成人在线免费观看| 国产精品国产自产拍高清av水多| 欧美一区二区三区在线观看视频 | 欧美日韩一区二区三区69堂| 国产精品久久久久久久久久直播 | 小说区图片区色综合区| 欧美猛烈性xbxbxbxb| 国产精品无码一本二本三本色| 成人黄色生活片| 日韩网站免费观看| 欧美三级韩国三级日本三斤| 久久亚洲私人国产精品va媚药| 欧美破处大片在线视频| 麻豆精品国产| 午夜成年人在线免费视频| 又黄又爽又色视频| 国产卡一卡二在线| 国产欧美中文字幕| 久久精品国产一区二区三区| 欧美视频三区在线播放| 国产拍揄自揄精品视频麻豆| 国产午夜久久| 成人黄色av| 日韩三级网址| 免费v片在线观看| 第一福利在线| 18av网站| 欧美 日韩 激情| 亚洲国产精品久久久久婷婷老年| 国产精品视频网站| 中文字幕日韩高清| 精品日韩一区二区三区免费视频| 亚洲成人综合在线| 久久久天堂av| 国产成人自拍高清视频在线免费播放| 欧美视频一区| 国精一区二区| 中文字幕亚洲在线观看| 国精产品一区二区三区有限公司 | 精精国产xxxx视频在线中文版| 日本全棵写真视频在线观看| 欧美啪啪免费视频| 亚洲v国产v在线观看| 91精品国产高清久久久久久91裸体| 欧美激情一区二区三区久久久| 亚洲另类图片色| 日韩精品资源二区在线| 欧美午夜精品一区二区三区| 亚洲v精品v日韩v欧美v专区| 亚洲欧美精品午睡沙发| 国产精品素人视频| 国产欧美日韩卡一|