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

一篇帶給你pod創建源碼分析

運維 系統運維
接觸kubernetes已經4年多了,不過多是停留在能夠使用,對其原理、源碼不是很熟悉。對于平常執行的命令,它背后執行的流程、邏輯也不是很清楚。

[[424936]]

大家好,我是華仔。

接觸kubernetes已經4年多了,不過多是停留在能夠使用,對其原理、源碼不是很熟悉。對于平常執行的命令,它背后執行的流程、邏輯也不是很清楚。所以,最近打算去看看k8s各模塊的源碼。一來是加深對k8s各模塊的理解和認識;二來是方便以后遇到問題好分析問題的根本原因,有理有據,則可以服人;再者后續跳槽也不怕被面試官的技術問題所難到了。那么今天,就來簡單說一說pod創建的源碼吧。文章有錯誤的地方還請指正,輕噴。首先,k8s的源碼在github上即可獲取。本次我看的是1.21.3。另外,很多翻譯都是直譯或翻譯軟件翻譯的。請諒解。

正文

1、k8s源碼中針對pod的增刪改查是在源碼包/pkg/kubelet/kubelet.go中的syncLoop()進行。如下所示:

  1. // syncLoop is the main loop for processing changes. It watches for changes from 
  2. // three channels (file, apiserver, and http) and creates a union of them. For 
  3. // any new change seen, will run a sync against desired state and running state. If 
  4. // no changes are seen to the configuration, will synchronize the last known desired 
  5. // state every sync-frequency seconds. Never returns
  6. // syncLoop是處理更改的主循環。它感知來自三個channel(file,apiserver,http)的pod的變化,并且聚合它們。有任何的改變發生,將運行狀態同步為期望狀態。反之,則在每個同步周期內同步最后已知的期望狀態。 
  7. func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHandler) { 
  8.  klog.InfoS("Starting kubelet main sync loop"

在syncLoop()中則通過kl.syncLoopIteration()針對pod具體執行具體的操作。

  1. kl.syncLoopMonitor.Store(kl.clock.Now()) 
  2. if !kl.syncLoopIteration(updates, handler, syncTicker.C, housekeepingTicker.C, plegCh) { 
  3.  break 

2、在syncLoopIteration有幾個重要的參數,如下所示:

  1. // Arguments: 
  2. // 1.  configCh:       a channel to read config events from 
  3. // 2.  handler:        the SyncHandler to dispatch pods to 
  4. // 3.  syncCh:         a channel to read periodic sync events from 
  5. // 4.  housekeepingCh: a channel to read housekeeping events from 
  6. // 5.  plegCh:         a channel to read PLEG updates from 
  7.  
  8. // * configCh: dispatch the pods for the config change to the appropriate 
  9. //             handler callback for the event type 
  10. // * plegCh: update the runtime cache; sync pod 
  11. // * syncCh: sync all pods waiting for sync 
  12. // * housekeepingCh: trigger cleanup of pods 
  13. // * health manager: sync pods that have failed or in which one or more 
  14. //                     containers have failed health checks 
  15.  
  16. func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate, handler SyncHandler, 
  17.  syncCh <-chan time.Time, housekeepingCh <-chan time.Time, plegCh <-chan *pleg.PodLifecycleEvent) bool { 
  18.  select { 
  19.  case u, open := <-configCh: 
  20.   // Update from a config source; dispatch it to the right handler 
  21.   // callback. 
  22.   if !open { 
  23.    klog.ErrorS(nil, "Update channel is closed, exiting the sync loop"
  24.    return false 
  25.   } 
  26.      

SyncHandler是一個interface。包含對pod常見操作的幾個方法。該接口由kubelet來實現。如下所示:

  1. // SyncHandler is an interface implemented by Kubelet, for testability 
  2. # pod創建、更新、 刪除... 
  3. type SyncHandler interface { 
  4.  HandlePodAdditions(pods []*v1.Pod)  
  5.  HandlePodUpdates(pods []*v1.Pod)  
  6.  HandlePodRemoves(pods []*v1.Pod) 
  7.  HandlePodReconcile(pods []*v1.Pod) 
  8.  HandlePodSyncs(pods []*v1.Pod) 
  9.  HandlePodCleanups() error 

3、針對pod可進行的操作如下,每個操作都有對應的方法。比如ADD,就會去執行HandlePodAdditions方法

  1. // These constants identify the PodOperations that can be made on a pod configuration. 
  2. const ( 
  3.  // SET is the current pod configuration. 
  4.  SET PodOperation = iota 
  5.  // ADD signifies pods that are new to this source. 
  6.  ADD 
  7.  // DELETE signifies pods that are gracefully deleted from this source. 
  8.  DELETE 
  9.  // REMOVE signifies pods that have been removed from this source. 
  10.  REMOVE 
  11.  // UPDATE signifies pods have been updated in this source. 
  12.  UPDATE 
  13.  // RECONCILE signifies pods that have unexpected status in this source, 
  14.  // kubelet should reconcile status with this source. 
  15.  RECONCILE 
  16.  
  17.  
  18. switch u.Op { 
  19.   case kubetypes.ADD
  20.    klog.V(2).InfoS("SyncLoop ADD""source", u.Source, "pods", format.Pods(u.Pods)) 
  21.    // After restarting, kubelet will get all existing pods through 
  22.    // ADD as if they are new pods. These pods will then go through the 
  23.    // admission process and *may* be rejected. This can be resolved 
  24.    // once we have checkpointing. 
  25.    handler.HandlePodAdditions(u.Pods) 

4、HandlePodAdditions又是如何去執行創建pod的呢?主要有以下幾個操作:

  1. 1. 根據pod的創建時間進行排序 
  2. sort.Sort(sliceutils.PodsByCreationTime(pods)) 
  3.  
  4. 2. 將pod添加到podmanager中.因為kubelet它會依賴這個pod manager作為期望狀態的一個憑證。 
  5. 如果一個在pod manager中無法查詢,那么就意味著它已經被apiserver刪除了,不再需要其他操作 
  6. // Always add the pod to the pod manager. Kubelet relies on the pod 
  7. // manager as the source of truth for the desired state. If a pod does 
  8. // not exist in the pod manager, it means that it has been deleted in 
  9. // the apiserver and no action (other than cleanup) is required. 
  10. kl.podManager.AddPod(pod) 
  11.  
  12. 3. 判斷pod是不是靜態pod 
  13. mirrorPod, _ := kl.podManager.GetMirrorPodByPod(pod) 
  14.  
  15. 4. 通過dispatchWork分發任務 
  16. kl.dispatchWork(pod, kubetypes.SyncPodCreate, mirrorPod, start) 
  17.  
  18. 5. 將pod加入到probe manager,即健康檢查.包括startup probe、liveness probe、readiness probe。  
  19. kl.probeManager.AddPod(pod) 

dispatchWork又做了哪些事情呢?如下:

  1. // Run the sync in an async worker. 在一個異步worker中執行同步 
  2.  kl.podWorkers.UpdatePod(&UpdatePodOptions{ 
  3.   Pod:        pod, 
  4.   MirrorPod:  mirrorPod, 
  5.   UpdateType: syncType, 
  6.   OnCompleteFunc: func(err error) { 
  7.    if err != nil { 
  8.     metrics.PodWorkerDuration.WithLabelValues(syncType.String()).Observe(metrics.SinceInSeconds(start)) 
  9.    } 
  10.   }, 
  11.  }) 

那么UpdatePod()又做哪些事情呢?

  1. // Creating a new pod worker either means this is a new pod, or that the 
  2. // kubelet just restarted. In either case the kubelet is willing to believe 
  3. // the status of the pod for the first pod worker sync. See corresponding 
  4. // comment in syncPod. 
  5.   // 創建一個新的pod worker,意味著這是一個新的pod 
  6. go func() { 
  7.  defer runtime.HandleCrash() 
  8.  p.managePodLoop(podUpdates) 
  9. }() 

managePodLoop()去執行同步。

  1. for update := range podUpdates { 
  2.   err := func() error { 
  3.    podUID := update.Pod.UID 
  4.    // This is a blocking call that would return only if the cache 
  5.    // has an entry for the pod that is newer than minRuntimeCache 
  6.    // Time. This ensures the worker doesn't start syncing until 
  7.    // after the cache is at least newer than the finished time of 
  8.    // the previous sync. 
  9.    status, err := p.podCache.GetNewerThan(podUID, lastSyncTime) 
  10.    if err != nil { 
  11.     // This is the legacy event thrown by manage pod loop 
  12.     // all other events are now dispatched from syncPodFn 
  13.     p.recorder.Eventf(update.Pod, v1.EventTypeWarning, events.FailedSync, "error determining status: %v", err) 
  14.     return err 
  15.    } 
  16.       // 這里去做同步 
  17.    err = p.syncPodFn(syncPodOptions{ 
  18.     mirrorPod:      update.MirrorPod, 
  19.     pod:            update.Pod, 
  20.     podStatus:      status, 
  21.     killPodOptions: update.KillPodOptions, 
  22.     updateType:     update.UpdateType, 
  23.    }) 
  24.    lastSyncTime = time.Now() 
  25.    return err 
  26.   }() 

5、最終調用到pkg/kubelet/kuberuntime/kuberuntime_manager.go中SyncPod()進行pod的創建

  1. // SyncPod syncs the running pod into the desired pod by executing following steps: 
  2. // 執行以下的步驟將運行的pod同步到期望的狀態 
  3. //  1. Compute sandbox and container changes. 
  4. // 計算sanbox和container改變 
  5. //  2. Kill pod sandbox if necessary. 
  6. // 如果有必要就刪除pod sandbox 
  7. //  3. Kill any containers that should not be running. 
  8. // 刪除不需要運行的容器 
  9. //  4. Create sandbox if necessary. 
  10. // 需要的情況下創建sandbox 
  11. //  5. Create ephemeral containers. 
  12. // 創建臨時容器 
  13. //  6. Create init containers. 
  14. // 創建初始化容器 
  15. //  7. Create normal containers. 
  16. // 創建普通容器 
  17. func (m *kubeGenericRuntimeManager) SyncPod() 
  18.  
  19. // Step 1: Compute sandbox and container changes. 
  20.  podContainerChanges := m.computePodActions(pod, podStatus) 
  21.  klog.V(3).InfoS("computePodActions got for pod""podActions", podContainerChanges, "pod", klog.KObj(pod)) 
  22.  if podContainerChanges.CreateSandbox { 
  23.   ref, err := ref.GetReference(legacyscheme.Scheme, pod) 
  24.   if err != nil { 
  25.    klog.ErrorS(err, "Couldn't make a ref to pod""pod", klog.KObj(pod)) 
  26.   } 
  27.   if podContainerChanges.SandboxID != "" { 
  28.    m.recorder.Eventf(ref, v1.EventTypeNormal, events.SandboxChanged, "Pod sandbox changed, it will be killed and re-created."
  29.   } else { 
  30.    klog.V(4).InfoS("SyncPod received new pod, will create a sandbox for it""pod", klog.KObj(pod)) 
  31.   } 
  32.  } 
  33.    
  34.   // Step 2: Kill the pod if the sandbox has changed. 
  35.  if podContainerChanges.KillPod { 
  36.    
  37.   // Step 3: kill any running containers in this pod which are not to keep. 
  38.   for containerID, containerInfo := range podContainerChanges.ContainersToKill { 
  39.    klog.V(3).InfoS("Killing unwanted container for pod""containerName", containerInfo.name"containerID", containerID, "pod", klog.KObj(pod)) 
  40.    killContainerResult := kubecontainer.NewSyncResult(kubecontainer.KillContainer, containerInfo.name
  41.    result.AddSyncResult(killContainerResult) 
  42.    if err := m.killContainer(pod, containerID, containerInfo.name, containerInfo.message, containerInfo.reason, nil); err != nil { 
  43.     killContainerResult.Fail(kubecontainer.ErrKillContainer, err.Error()) 
  44.     klog.ErrorS(err, "killContainer for pod failed""containerName", containerInfo.name"containerID", containerID, "pod", klog.KObj(pod)) 
  45.     return 
  46.    } 
  47.        
  48.       // Step 4: Create a sandbox for the pod if necessary. 
  49.  podSandboxID := podContainerChanges.SandboxID 
  50.  if podContainerChanges.CreateSandbox { 
  51.   var msg string 
  52.   var err error 
  53.  
  54.   klog.V(4).InfoS("Creating PodSandbox for pod""pod", klog.KObj(pod)) 
  55.   createSandboxResult := kubecontainer.NewSyncResult(kubecontainer.CreatePodSandbox, format.Pod(pod)) 
  56.   result.AddSyncResult(createSandboxResult) 
  57.   podSandboxID, msg, err = m.createPodSandbox(pod, podContainerChanges.Attempt) 
  58.      
  59.     // Step 5: start ephemeral containers 
  60.  // These are started "prior" to init containers to allow running ephemeral containers even when there 
  61.  // are errors starting an init container. In practice init containers will start first since ephemeral 
  62.  // containers cannot be specified on pod creation. 
  63.  if utilfeature.DefaultFeatureGate.Enabled(features.EphemeralContainers) { 
  64.   for _, idx := range podContainerChanges.EphemeralContainersToStart { 
  65.    start("ephemeral container", ephemeralContainerStartSpec(&pod.Spec.EphemeralContainers[idx])) 
  66.   } 
  67.  } 
  68.    
  69.   // Step 6: start the init container. 
  70.  if container := podContainerChanges.NextInitContainerToStart; container != nil { 
  71.   // Start the next init container. 
  72.   if err := start("init container", containerStartSpec(container)); err != nil { 
  73.    return 
  74.   } 
  75.  
  76.   // Successfully started the container; clear the entry in the failure 
  77.   klog.V(4).InfoS("Completed init container for pod""containerName", container.Name"pod", klog.KObj(pod)) 
  78.  } 
  79.  
  80.  // Step 7: start containers in podContainerChanges.ContainersToStart. 
  81.  for _, idx := range podContainerChanges.ContainersToStart { 
  82.   start("container", containerStartSpec(&pod.Spec.Containers[idx])) 
  83.  } 

6、另外,pod worker還要做以下事情:

  1. # 創建pod數據目錄、volume、獲取image pull secrets。。。 
  2. newPodWorkers(klet.syncPod --->pkg/kubelet/kubelet.go) //通過syncPod 
  3.                                kubetypes.SyncPodKill 
  4.                                 kubetypes.SyncPodCreate 
  5.                                 podStatus.IPs = append(podStatus.IPs, ipInfo.IP) 
  6.                                 runnable.Admit 
  7.                                 kubetypes.IsStaticPod(pod) 
  8.                                kl.makePodDataDirs(pod) 
  9.                                 kl.volumeManager.WaitForAttachAndMount(pod) 
  10.                                 kl.getPullSecretsForPod(pod) 
  11.                                 kl.containerRuntime.SyncPod(pkg/kubelet/container/runtime.go) 

本文轉載自微信公眾號「運維開發故事」

 

責任編輯:姜華 來源: 運維開發故事
相關推薦

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2022-03-01 07:51:53

IDEAMaven父子工程

2022-04-29 14:38:49

class文件結構分析

2021-04-14 14:16:58

HttpHttp協議網絡協議

2021-04-08 11:00:56

CountDownLaJava進階開發

2021-07-21 09:48:20

etcd-wal模塊解析數據庫

2024-06-13 08:34:48

2022-02-17 08:53:38

ElasticSea集群部署

2021-03-12 09:21:31

MySQL數據庫邏輯架構

2021-06-21 14:36:46

Vite 前端工程化工具

2022-03-22 09:09:17

HookReact前端

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2023-03-29 07:45:58

VS編輯區編程工具

2021-04-01 10:51:55

MySQL鎖機制數據庫

2021-07-08 07:30:13

Webpack 前端Tree shakin

2023-03-13 09:31:04

2021-04-14 07:55:45

Swift 協議Protocol

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-10-28 08:51:53

GPIO軟件框架 Linux

2021-05-08 08:36:40

ObjectString前端
點贊
收藏

51CTO技術棧公眾號

久本草在线中文字幕亚洲| 国产精品二线| 在线日韩中文| 亚洲性线免费观看视频成熟| 日本三级黄色网址| 国产第一页在线| 国产日韩精品视频一区| 91超碰在线电影| 无码人妻一区二区三区线| 中文字幕一区二区三区乱码图片| 亚洲精品久久久一区二区三区| 国产97色在线 | 日韩| 主播国产精品| 国产午夜精品福利| 国产亚洲欧美一区二区三区| 自拍偷拍福利视频| 中文欧美日韩| 另类色图亚洲色图| 国产在线观看h| 国产精品中文字幕制服诱惑| 欧美老肥妇做.爰bbww| 免费黄色福利视频| 欧美精品videosex| 亚洲色图制服丝袜| 西游记1978| 三级国产在线观看| 成人午夜电影小说| 亚洲综合在线中文字幕| 国语对白做受69按摩| 狠狠综合久久| 欧美精品在线极品| 日本精品在线免费观看| 国产欧美日韩在线一区二区 | 色多多国产成人永久免费网站| 特级西西人体4444xxxx| 色妞ww精品视频7777| 7777精品伊人久久久大香线蕉的| 国产成人av影视| 在线看片国产福利你懂的| 亚洲成人一区在线| 毛片av在线播放| 亚洲精品天堂| 一区二区三区日本| av磁力番号网| av免费网站在线| 18欧美乱大交hd1984| 一级二级三级欧美| 在线观看麻豆蜜桃| 国产精品国产三级国产三级人妇| 日产精品一线二线三线芒果| 蜜桃视频在线观看视频| 久久综合久久综合九色| 欧美二级三级| 日色在线视频| 国产亚洲综合av| 日日噜噜噜噜夜夜爽亚洲精品| 欧美孕妇性xxxⅹ精品hd| 91一区二区三区在线观看| 狠狠色噜噜狠狠狠狠色吗综合| 欧美一区二区三区成人片在线| 国产91在线观看丝袜| 国产激情一区二区三区在线观看 | 欧美a级黄色大片| 成人短视频在线| 亚洲黄色在线视频| 国产精品裸体瑜伽视频| 中文字幕在线官网| 91黄色免费看| 国产乱女淫av麻豆国产| 久久影院一区二区三区| 精品国产凹凸成av人导航| 精品中文字幕在线播放| 精品日韩一区| 久久夜色精品国产欧美乱| 青娱乐国产在线视频| 亚洲激情女人| 国产精品91在线观看| 一区二区精品视频在线观看| 国产精品自拍在线| 精品综合久久| 婷婷视频在线| 一区二区高清在线| 国产无套内射久久久国产| 97成人超碰| 欧美精品日日鲁夜夜添| 人妻换人妻a片爽麻豆| 久久综合影院| 久久九九免费视频| www.国产高清| 久久91精品国产91久久小草| 国产精品v欧美精品∨日韩| 日韩毛片在线一区二区毛片| 国产精品九色蝌蚪自拍| 欧美 日韩 国产精品| 樱桃视频成人在线观看| 91精品国产综合久久精品| 在线精品一区二区三区| 久久精品国产亚洲夜色av网站| 欧美老少做受xxxx高潮| 日日骚av一区二区| 国产成人午夜99999| 欧美18视频| 亚洲小说区图片区都市| 色狠狠桃花综合| 麻豆传媒在线看| jiujiure精品视频播放| 久久久久久久久久久91| 中文字幕久久熟女蜜桃| 99热这里都是精品| 四虎免费在线观看视频| 婷婷激情一区| 亚洲国产另类 国产精品国产免费| 影音先锋男人在线| 国产欧美欧美| 7777精品伊久久久大香线蕉语言 | 国产精品美女一区二区三区| 久久99中文字幕| 伊人久久大香线蕉综合影院首页| 亚洲老头同性xxxxx| 欧美另类视频在线观看| 久久国产人妖系列| 热舞福利精品大尺度视频| cao在线视频| 日韩欧美在线1卡| 少妇愉情理伦三级| 视频一区视频二区中文| 精品免费二区三区三区高中清不卡| caoporn97在线视频| 欧美中文字幕一区二区三区| 不卡一区二区在线观看| 99伊人成综合| 国产美女精品在线观看| 51xtv成人影院| 制服丝袜中文字幕一区| 日本午夜精品视频| 秋霞影院一区二区| 热舞福利精品大尺度视频| 在线观看欧美日韩电影| 亚洲精品日韩在线| 69视频免费在线观看| 99视频有精品| 欧美 日韩 激情| 欧洲在线一区| 欧美一级视频在线观看| 亚洲人妻一区二区三区| 欧美日韩国产在线看| 亚洲综合自拍网| 亚洲一区亚洲| 欧美日韩高清免费| 欧洲av一区二区| 一区二区三区四区在线观看视频| jizz国产在线| 欧美国产成人在线| 亚洲一区二区三区四区五区| 色婷婷一区二区三区| 成人福利网站在线观看11| 黄色成人影院| 日韩美女一区二区三区四区| 青娱乐国产在线视频| 白白色亚洲国产精品| 日本成年人网址| 国产一区二区在线| 国产欧美精品日韩精品| 99自拍视频在线观看| 日韩欧美电影在线| 亚洲男人第一av| 国产亚洲成年网址在线观看| 婷婷免费在线观看| 中文精品电影| 久久综合久久综合这里只有精品| 欧美大胆成人| 久久久成人av| 手机看片国产1024| 在线观看日韩毛片| 男人与禽猛交狂配| 99久久精品国产一区二区三区| 久久久精品在线视频| 青草国产精品| 国产精品久久久久久久小唯西川| 永久免费毛片在线播放| 久久精品91久久久久久再现| 亚洲毛片欧洲毛片国产一品色| 欧美日韩一二三四五区| 久久久久人妻一区精品色| 国产一区久久久| 亚洲中文字幕无码专区| 日韩欧美视频在线播放| 岛国一区二区三区高清视频| 久久夜夜操妹子| 九九热精品视频| 韩国福利在线| 日韩免费观看高清完整版在线观看| av中文在线播放| 亚洲视频免费观看| 成人性生交大免费看| 国产乱码字幕精品高清av | 另类综合日韩欧美亚洲| 国产精彩视频一区二区| 日本不卡二三区| 国产精品乱码视频| 欧美91在线|欧美| 97久久超碰福利国产精品…| 免费黄网在线观看| 亚洲女人天堂成人av在线| 精品久久久无码中文字幕| 色伊人久久综合中文字幕| 欧美激情一区二区视频| 国产视频一区不卡| 国产福利在线观看视频| 国产精品一区二区三区四区 | 国产自产2019最新不卡| 黑森林福利视频导航| 国产一区亚洲| 手机看片日韩国产| 欧美理论在线播放| 久久久久久久免费| a看欧美黄色女同性恋| 91精品国产综合久久香蕉922| 日本成人三级电影| 97久久精品国产| av电影免费在线看| 欧美xxxx做受欧美.88| 亚洲视频tv| 亚洲视频在线观看免费| 人妻少妇精品无码专区| 日韩午夜在线观看| 国产一区二区视频免费观看| 在线免费观看日韩欧美| 亚洲自拍一区在线观看| 亚洲va国产天堂va久久en| 欧美成人三级视频| 亚洲精品亚洲人成人网| 蜜桃av.com| 一区视频在线播放| 制服丨自拍丨欧美丨动漫丨| 欧美极品另类videosde| 中文字幕有码在线播放| 久久久久国产精品人| 成人免费网站黄| 久久综合狠狠综合| av在线网站观看| 久久亚洲二区三区| 一级片手机在线观看| 91免费观看在线| 亚洲av无码一区二区二三区| 26uuu久久天堂性欧美| 中文乱码人妻一区二区三区视频| 99热精品国产| 三级黄色片网站| 久久久久久久久久久久久女国产乱| 成人精品在线观看视频| 久久久久久久久久久久久久久99| 中文字幕一区二区三区人妻| 国产日韩v精品一区二区| 精品国产成人亚洲午夜福利| 国产女同性恋一区二区| 国产精品久久久免费看| 亚洲欧美日韩在线不卡| 欧美人妻精品一区二区三区| 亚洲国产乱码最新视频 | 亚洲色图 激情小说| 国产精品久久久久9999吃药| 国产大片免费看| 亚洲地区一二三色| 久久久久99精品成人片我成大片 | 精品久久久亚洲| 亚洲欧美久久234| 中文字幕一区二区精品区| 青青青青在线视频| 鲁大师成人一区二区三区| 又色又爽又高潮免费视频国产| 蜜臀av亚洲一区中文字幕| 自拍一级黄色片| 97成人超碰视| 日本爱爱小视频| 亚洲一区av在线| 亚洲 欧美 日韩 在线| 制服视频三区第一页精品| 亚洲精品久久久久久久久久久久久久 | 牛牛精品成人免费视频| 日本一区二区在线视频| 香蕉久久网站| 欧美精品自拍视频| 免费观看久久久4p| 又黄又色的网站| 国产三级精品三级| 青青草手机在线视频| 欧美性xxxxxx| 99久久久久久久| 亚洲欧美中文字幕在线一区| 国产写真视频在线观看| 91精品国产高清久久久久久91 | 成人区精品一区二区| 狠狠色丁香婷婷综合影院| 可以在线看黄的网站| 久热re这里精品视频在线6| 国产乱叫456| 久久久久久久精| 免费毛片在线播放免费| 欧美影院午夜播放| 四季av日韩精品一区| www.久久久久久.com| 亚洲天堂资源| 国产精品视频500部| 999国产精品视频| 北条麻妃在线一区| 国产suv精品一区二区三区| 国产精品成人在线视频| 丁香五六月婷婷久久激情| 国产成人三级一区二区在线观看一| 亚洲美女在线视频| 蜜臀av在线| 91精品视频在线看| 清纯唯美综合亚洲| 国产熟女高潮视频| 97se亚洲国产综合在线| 免费网站观看www在线观| 欧美日韩国产美| 成人在线观看免费| 日本人成精品视频在线| 精品午夜电影| 国产青草视频在线观看| 国产剧情av麻豆香蕉精品| 阿v天堂2014| 欧美亚洲一区三区| 欧美18xxxxx| 4438全国亚洲精品在线观看视频| 91久久偷偷做嫩草影院电| 亚洲美女自拍偷拍| 蜜臀av一区二区在线免费观看| 国产精品20p| 在线精品视频免费播放| 久久国产精品高清一区二区三区| 97不卡在线视频| 动漫视频在线一区| 97在线国产视频| 高清国产一区二区三区| 毛片a片免费观看| 欧美xxx久久| 久草在线资源站资源站| 成人在线观看91| 黄色成人在线网址| 久久久久久久久久久久国产精品| 伊人色综合久久天天| 午夜精品久久久久久久99热黄桃| 欧美插天视频在线播放| 一区二区三区在线资源| 国产一二三区在线播放| 99视频精品在线| 九九精品免费视频| 国产亚洲一区精品| 羞羞视频在线观看一区二区| 国产精品无码乱伦| 国产精品系列在线播放| 国产亚洲精品av| 亚洲国产天堂久久综合| 亚洲日本天堂| 天堂av一区二区| 国产一区福利在线| 国产一级视频在线观看| 亚洲精品v天堂中文字幕 | 欧洲精品在线观看| 成人精品福利| 51国产成人精品午夜福中文下载| 欧美体内she精视频在线观看| 中国免费黄色片| 一本到三区不卡视频| yiren22综合网成人| 91麻豆国产语对白在线观看| 欧美视频官网| 日韩av在线看免费观看| 欧美日本一道本在线视频| а√天堂资源地址在线下载| 国产精品一区二区免费| 久久人人超碰| www深夜成人a√在线| 亚洲成人免费网站| 日韩三区免费| 美女av免费观看| 久久美女艺术照精彩视频福利播放 | 羞羞的视频在线看| 久久久久网址| 精品一区二区三区免费播放| 亚洲国产精一区二区三区性色| 亚洲人成毛片在线播放| 国产亚洲字幕| 中国丰满人妻videoshd| 中文字幕在线不卡一区| 特黄视频在线观看| 国产精品综合久久久| 亚洲精品系列| 欧美视频一区二区在线| 日韩电视剧在线观看免费网站| 黑人一区二区三区| 亚洲不卡中文字幕无码| 自拍偷拍亚洲综合| 国产玉足榨精视频在线观看| 99中文字幕| 精品亚洲成a人在线观看| av大全在线观看|