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

使用Go構建Kubernetes應用

系統 Linux
本篇文章介紹了如何使用kubernetes client-go實踐一個簡單的與K8s交互過程。

 Kubernetes項目使用Go語言編寫,對Go api原生支持非常便捷。本篇文章介紹了如何使用kubernetes client-go實踐一個簡單的與K8s交互過程。

kubernetes 的Go Client項目(client-go)

go client是k8s client中最古老的一個,具有很多特性。Client-go 沒有使用Swagger生成器,它使用的是源于k8s項目中的源代碼生成工具,這個工具的目的是要生成k8s風格的對象和序列化程序。

該項目是一組包的集合,該包能夠滿足從REST風格的原語到復雜client的不同的編程需求。

RESTClient是一個基礎包,它使用api-machinery庫中的類型作為一組REST原語提供對API的訪問。作為對RESTClient之上的抽象,_clientset_將是你創建k8s client工具的起點。它暴露了公開化的API資源及其對應的序列化。

注意:在 client-go中還包含了如discovery, dynamic, 和 scale這樣的包,雖然本次不介紹這些包,但是了解它們的能力還是很重要的。

一個簡單的k8s client 工具

讓我們再次回顧我們將要構建的工具,來說明go client的用法。pvcwatch是一個簡單的命令行工具,它可以監聽集群中聲明的PVC容量。當總數到達一個閾值的時候,他會采取一個action(在這個例子中是在屏幕上通知顯示)

你能在github上找到完整的例子

這個例子是為了展示k8s的go client的以下幾個方面:- 如何去連接 - 資源列表的檢索和遍歷 - 對象監聽

Setup

client-go支持Godep和dep作為vendor的管理程序,我覺得dep便于使用所以繼續使用dep。例如,以下是client-go v6.0和k8s API v1.9所需最低限度的Gopkg.toml。 

  1. [[constraint]]  
  2.   name = "k8s.io/api"  
  3.   version = "kubernetes-1.9.0"  
  4. [[constraint]]  
  5.   name = "k8s.io/apimachinery"  
  6.   version = "kubernetes-1.9.0"  
  7. [[constraint]]  
  8.   name = "k8s.io/client-go"  
  9.   version = "6.0.0" 

運行dep ensure確保剩下的工作。

連接 API Server

我們Go client的第一步就是建立一個與API Server的連接。為了做到這一點,我們要使用實體包中的clientcmd,如下代碼所示: 

  1. import (  
  2. ...  
  3.     "k8s.io/client-go/tools/clientcmd"  
  4.  
  5. func main() {  
  6.     kubeconfig :filepath.Join(  
  7.          os.Getenv("HOME"), ".kube", "config",  
  8.     )  
  9.     config, err :clientcmd.BuildConfigFromFlags("", kubeconfig)  
  10.     if err != nil {  
  11.         log.Fatal(err)  
  12.     }  
  13. ...  

_Client-go_通過提供實體功能來從不同的上下文中獲取你的配置,從而使之成為一個不重要的任務。

從config文件

正如上面的例子所做的那樣,你能從kubeconfig文件啟動配置來連接API server。當你的代碼運行在集群之外的時候這是一個理想的方案。clientcmd.BuildConfigFromFlags("", configFile)

從集群

當你的代碼運行在這個集群中的時候,你可以用上面的函數并且不使用任何參數,這個函數就會通過集群的信息去連接api server。

clientcmd.BuildConfigFromFlags("", "")

或者我們可以通過rest包來創建一個使用集群中的信息去配置啟動的(譯者注:k8s里所有的Pod都會以Volume的方式自動掛載k8s里面默認的ServiceAccount,所以會用默認的ServiceAccount的授權信息),如下: 

  1. import "k8s.io/client-go/rest"  
  2. ...  
  3. rest.InClusterConfig() 

創建一個clientset

我們需要創建一個序列化的client為了讓我們獲取API對象。在kubernetes包中的Clientset類型定義,提供了去訪問公開的API對象的序列化client,如下: 

  1. type Clientset struct {  
  2.     *authenticationv1beta1.AuthenticationV1beta1Client  
  3.     *authorizationv1.AuthorizationV1Client  
  4. ...  
  5.     *corev1.CoreV1Client  

一旦我們有正確的配置連接,我們就能使用這個配置去初始化一個clientset,如下: 

  1. func main() {  
  2.     config, err :clientcmd.BuildConfigFromFlags("", kubeconfig)  
  3.     ...  
  4.     clientset, err :kubernetes.NewForConfig(config)  
  5.     if err != nil {  
  6.         log.Fatal(err)  
  7.     }  

對于我們的例子,我們使用的是v1的API對象。下一步,我們要使用clientset通過CoreV1()去訪問核心api資源,如下: 

  1. func main() {  
  2.     ...  
  3.     clientset, err :kubernetes.NewForConfig(config)  
  4.     if err != nil {  
  5.         log.Fatal(err)  
  6.     }  
  7.     api :clientset.CoreV1()  

你能在這里看到可以獲得clientsets。

獲取集群的PVC列表

我們對clientset執行的最基本操作之一獲取存儲的API對象的列表。在我們的例子中,我們將要拿到一個namespace下面的pvc列表,如下: 

  1. import (  
  2. ...  
  3.     metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"  
  4.  
  5. func main() {  
  6.     var ns, label, field string  
  7.     flag.StringVar(&ns, "namespace", "", "namespace")  
  8.     flag.StringVar(&label, "l", "", "Label selector")  
  9.     flag.StringVar(&field, "f", "", "Field selector")  
  10. ...  
  11.     api :clientset.CoreV1()  
  12.     // setup list options  
  13.     listOptions :metav1.ListOptions{  
  14.         LabelSelector: label,   
  15.         FieldSelector: field,  
  16.     }  
  17.     pvcs, err :api.PersistentVolumeClaims(ns).List(listOptions)  
  18.     if err != nil {  
  19.         log.Fatal(err)  
  20.     }  
  21.     printPVCs(pvcs)  
  22. ...  

在上面的代碼中,我們使用ListOptions指定 label 和 field selectors (還有namespace)來縮小pvc列表的范圍,這個結果的返回類型是v1.PeristentVolumeClaimList。下面的這個代碼展示了我們如何去遍歷和打印從api server中獲取的pvc列表。 

  1. func printPVCs(pvcs *v1.PersistentVolumeClaimList) {  
  2.     template :"%-32s%-8s%-8s\n"  
  3.     fmt.Printf(template, "NAME", "STATUS", "CAPACITY")  
  4.     for _, pvc :range pvcs.Items {  
  5.         quant :pvc.Spec.Resources.Requests[v1.ResourceStorage]  
  6.         fmt.Printf(  
  7.             template,   
  8.             pvc.Name,   
  9.             string(pvc.Status.Phase),   
  10.             quant.String())  
  11.     }  

監聽集群中pvc

k8s的Go client框架支持為指定的API對象在其生命周期事件中監聽集群的能力,包括創建,更新,刪除一個指定對象時候觸發的CREATED,MODIFIED,DELETED事件。對于我們的命令行工具,我們將要監聽在集群中已經聲明的PVC的總量。

對于某一個namespace,當pvc的容量到達了某一個閾值(比如說200Gi),我們將會采取某個動作。為了簡單起見,我們將要在屏幕上打印個通知。但是在更復雜的實現中,可以使用相同的辦法觸發一個自動操作。

啟動監聽功能

現在讓我們為PersistentVolumeClaim這個資源通過Watch去創建一個監聽器。然后這個監聽器通過ResultChan從go的channel中訪問事件通知。 

  1. func main() {  
  2. ...  
  3.     api :clientset.CoreV1()  
  4.     listOptions :metav1.ListOptions{  
  5.         LabelSelector: label,   
  6.         FieldSelector: field,  
  7.     }  
  8.     watcher, err :=api.PersistentVolumeClaims(ns). 
  9.        Watch(listOptions)  
  10.     if err != nil {  
  11.       log.Fatal(err)  
  12.     }  
  13.     ch :watcher.ResultChan()  
  14. ...  

循環事件

接下來我們將要處理資源事件。但是在我們處理事件之前,我們先聲明resource.Quantity類型的的兩個變量為maxClaimsQuant和totalClaimQuant來分別表示我們的申請資源閾值(譯者注:代表某個ns下集群中運行的PVC申請的上限)和運行總數。 

  1. import(  
  2.     "k8s.io/apimachinery/pkg/api/resource"  
  3.     ...  
  4.  
  5. func main() {  
  6.     var maxClaims string  
  7.     flag.StringVar(&maxClaims, "max-claims", "200Gi",   
  8.         "Maximum total claims to watch")  
  9.     var totalClaimedQuant resource.Quantity  
  10.     maxClaimedQuant :resource.MustParse(maxClaims)  
  11. ...  
  12.     ch :watcher.ResultChan()  
  13.     for event :range ch {  
  14.         pvc, ok :event.Object.(*v1.PersistentVolumeClaim)  
  15.         if !ok {  
  16.             log.Fatal("unexpected type")  
  17.         }  
  18.         ...  
  19.     }  

在上面的for-range循環中,watcher的channel用于處理來自服務器傳入的通知。每個事件賦值給變量event,并且event.Object的類型被聲明為PersistentVolumeClaim類型,所以我們能從中提取出來。

處理ADDED事件

當一個新的PVC創建的時候,event.Type的值被設置為watch.Added。然后我們用下面的代碼去獲取新增的聲明的容量(quant),將其添加到正在運行的總容量中(totalClaimedQuant)。最后我們去檢查是否當前的容量總值大于當初設定的最大值(maxClaimedQuant),如果大于的話我們就觸發一個事件。 

  1. import(  
  2.     "k8s.io/apimachinery/pkg/watch"  
  3.     ...  
  4.  
  5. func main() {  
  6. ...  
  7.     for event :range ch {  
  8.         pvc, ok :event.Object.(*v1.PersistentVolumeClaim)  
  9.         if !ok {  
  10.             log.Fatal("unexpected type")  
  11.         }  
  12.         quant :pvc.Spec.Resources.Requests[v1.ResourceStorage]  
  13.         switch event.Type {  
  14.             case watch.Added:  
  15.                 totalClaimedQuant.Add(quant)  
  16.                 log.Printf("PVC %s added, claim size %s\n",  
  17.                     pvc.Name, quant.String())  
  18.                 if totalClaimedQuant.Cmp(maxClaimedQuant) == 1 {  
  19.                     log.Printf(  
  20.                         "\nClaim overage reached: max %s at %s",  
  21.                         maxClaimedQuant.String(),  
  22.                         totalClaimedQuant.String())  
  23.                     // trigger action  
  24.                     log.Println("*** Taking action ***")  
  25.                 }  
  26.             }  
  27.         ...  
  28.         }  
  29.     }  

處理DELETED事件

代碼也會在PVC被刪除的時候做出反應,它執行相反的邏輯以及把被刪除的這個PVC申請的容量在正在運行的容量的總值里面減去。 

  1. func main() {  
  2. ...  
  3.     for event :range ch {  
  4.         ...  
  5.         switch event.Type {  
  6.         case watch.Deleted:  
  7.             quant :pvc.Spec.Resources.Requests[v1.ResourceStorage]  
  8.             totalClaimedQuant.Sub(quant)  
  9.             log.Printf("PVC %s removed, size %s\n",   
  10.                pvc.Name, quant.String())  
  11.             if totalClaimedQuant.Cmp(maxClaimedQuant) <= 0 { 
  12.                 log.Printf("Claim usage normal: max %s at %s",  
  13.                     maxClaimedQuant.String(),  
  14.                     totalClaimedQuant.String(),  
  15.                 )  
  16.                 // trigger action  
  17.                 log.Println("*** Taking action ***")  
  18.             }  
  19.         }  
  20.         ...  
  21.     }  

運行程序

當程序在一個運行中的集群被執行的時候,首先會列出PVC的列表。然后開始監聽集群中新的PersistentVolumeClaim事件。 

  1. $> ./pvcwatch  
  2. Using kubeconfig:  /Users/vladimir/.kube/config  
  3. --- PVCs ----  
  4. NAME                            STATUS  CAPACITY  
  5. my-redis-redis                  Bound   50Gi  
  6. my-redis2-redis                 Bound   100Gi  
  7. -----------------------------  
  8. Total capacity claimed: 150Gi  
  9. -----------------------------  
  10. --- PVC Watch (max claims 200Gi) ----  
  11. 2018/02/13 21:55:03 PVC my-redis2-redis added, claim size 100Gi  
  12. 2018/02/13 21:55:03  
  13. At 50.0% claim capcity (100Gi/200Gi)  
  14. 2018/02/13 21:55:03 PVC my-redis-redis added, claim size 50Gi  
  15. 2018/02/13 21:55:03  
  16. At 75.0% claim capcity (150Gi/200Gi) 

下面讓我們部署一個應用到集群中,這個應用會申請75Gi容量的存儲。(例如,讓我們通過helm去部署一個實例influxdb)。 

  1. helm install --name my-influx \  
  2. --set persistence.enabled=true,persistence.size=75Gi stable/influxdb 

正如下面你看到的,我們的工具立刻反應出來有個新的聲明以及一個警告因為當前的運行的聲明總量已經大于我們設定的閾值。 

  1. --- PVC Watch (max claims 200Gi) ----  
  2. ...  
  3. 2018/02/13 21:55:03  
  4. At 75.0% claim capcity (150Gi/200Gi)  
  5. 2018/02/13 22:01:29 PVC my-influx-influxdb added, claim size 75Gi  
  6. 2018/02/13 22:01:29  
  7. Claim overage reached: max 200Gi at 225Gi  
  8. 2018/02/13 22:01:29 *** Taking action ***  
  9. 2018/02/13 22:01:29  
  10. At 112.5% claim capcity (225Gi/200Gi) 

相反,從集群中刪除一個PVC的時候,該工具會相應展示提示信息。 

  1. ...  
  2. At 112.5% claim capcity (225Gi/200Gi)  
  3. 2018/02/14 11:30:36 PVC my-redis2-redis removed, size 100Gi  
  4. 2018/02/14 11:30:36 Claim usage normal: max 200Gi at 125Gi  
  5. 2018/02/14 11:30:36 *** Taking action *** 

總結

這篇文章是進行的系列的一部分,使用Go語言的官方k8s客戶端與API server進行交互。和以前一樣,這個代碼會逐步的去實現一個命令行工具去監聽指定namespace下面的PVC的大小。這個代碼實現了一個簡單的監聽列表去觸發從服務器返回的資源事件。 

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2023-12-26 00:58:53

Web應用Go語言

2025-05-06 08:09:02

2022-10-27 18:03:04

GogRPC云原生

2025-07-14 06:10:00

Go編程代碼

2021-04-16 20:43:18

Go區塊鏈編程

2024-05-17 09:00:45

SwiftUIvisionOS

2014-10-15 11:01:02

Web應用測試應用

2025-04-18 08:37:09

2025-02-04 13:53:18

NixGogRPC

2021-12-07 10:04:34

Azure Kuber場景應用

2023-11-03 13:20:13

Kubernetes

2023-05-06 08:00:00

KubernetesK8s數據服務自動化

2023-12-01 08:01:33

GoValidator

2023-12-01 07:06:14

Go命令行性能

2023-12-14 08:01:08

事件管理器Go

2025-04-28 01:22:00

2023-01-16 00:12:20

Go語言Web

2022-08-10 10:46:13

?CrossplanKubernete插件

2022-08-11 08:41:31

CrossplaneVCluster

2009-01-03 14:54:36

ibmdwWebSphere
點贊
收藏

51CTO技術棧公眾號

久草资源在线视频| 午夜精品在线免费观看| 国模私拍视频在线| 亚洲欧美日韩国产一区| 尤物yw午夜国产精品视频明星 | 中文字幕人妻熟女在线| 大菠萝精品导航| 国产三级精品视频| av色综合网| 亚洲av无码不卡| 欧美日韩91| 国产亚洲欧洲黄色| 91人妻一区二区| 亚洲电影有码| 五月婷婷另类国产| 亚洲巨乳在线观看| 色香蕉在线视频| 精品一区在线看| 欧美夜福利tv在线| 亚洲av无码一区二区三区在线| 日韩av字幕| 日韩一区二区三区在线观看| www.日本xxxx| 密臀av在线播放| 尤物在线观看一区| 亚洲一区二区三区精品动漫| 日韩一区免费视频| 国产一区啦啦啦在线观看| 国产成人精品久久| 日韩精品视频播放| 欧美日本亚洲韩国国产| 最近2019中文字幕大全第二页 | 亚洲影院一区二区三区| 国产午夜精品一区二区三区欧美 | 亚洲美女黄色片| 伊人影院在线观看视频| 亚洲成人毛片| 欧美三级电影精品| 亚洲一区二区三区四区五区xx| 超碰在线cao| 亚洲一区二区三区四区在线免费观看| 一本久道久久综合狠狠爱亚洲精品| 污视频软件在线观看| 国产成人精品免费网站| 91精品视频在线看| 一卡二卡三卡在线观看| 日韩和的一区二区| 日韩美女在线看| www.伊人久久| 午夜影院日韩| 欧美一区二区三区艳史| 日韩欧美三级视频| 性8sex亚洲区入口| 欧美在线观看视频| 国产精品一区二区三区四| 亚洲精品精选| 欧美影院在线播放| 亚洲精品男人的天堂| 免费看的黄色欧美网站| 青青青国产精品一区二区| 国产精品免费av一区二区| 亚洲国产精品第一区二区| 国内偷自视频区视频综合| 久久一级黄色片| 一本综合精品| 国产精品99久久久久久久久| 国产乡下妇女三片| 久久av老司机精品网站导航| 成人黄色av网站| hs视频在线观看| 成人h精品动漫一区二区三区| 国产亚洲情侣一区二区无| 网站黄在线观看| 国产欧美日韩在线看| 一区二区三区不卡在线| 超碰在线观看免费| 亚洲国产精品麻豆| 午夜dv内射一区二区| 亚瑟国产精品| 亚洲成人a**站| 伊人网伊人影院| 天天射—综合中文网| 欧美放荡办公室videos4k| 国产一级特黄aaa大片| 久久成人亚洲| 91在线观看免费高清完整版在线观看| 成人免费观看在线视频| 久久综合精品国产一区二区三区| 午夜精品一区二区在线观看| 18+激情视频在线| 日韩欧美在线国产| 亚洲精品国产久| 欧美调教在线| 久久精品99久久久久久久久| 久久精品波多野结衣| 亚洲尤物精选| 91影视免费在线观看| 日本人妖在线| 亚洲人妖av一区二区| www.99热这里只有精品| 久久av影院| 亚洲精品www久久久| 国产黄色录像视频| 亚洲毛片视频| 91欧美视频网站| 经典三级在线| 亚洲高清免费一级二级三级| 91欧美视频在线| 亚洲福利网站| 欧美日韩国产成人高清视频| 亚洲精品国产精品乱码视色| av在线播放不卡| 黄瓜视频免费观看在线观看www| 偷拍自拍在线看| 日韩一卡二卡三卡四卡| 天天干天天舔天天操| 136国产福利精品导航网址| 成人a免费视频| 成人全视频高清免费观看| 亚洲成人免费视| 亚洲五月激情网| 色天天久久综合婷婷女18| 456国产精品| 亚洲女人18毛片水真多| 亚洲丝袜另类动漫二区| 97公开免费视频| 曰本一区二区三区视频| 久久久久久久一区二区| jizz中国少妇| 自拍偷拍国产精品| 中文久久久久久| 少妇精品久久久一区二区三区| 97欧美精品一区二区三区| www.av日韩| 亚洲免费观看高清在线观看| 嫩草影院国产精品| 欧美精品久久久久久| 青青青国产精品一区二区| 日韩大胆人体| 欧美日韩午夜剧场| 极品白嫩丰满美女无套| 日韩一级精品| 精品国产综合久久| 阿v视频在线观看| 欧美精品一区二区三区很污很色的| 全程偷拍露脸中年夫妇| 国产一区二区三区综合| 天堂av免费看| 午夜电影一区| 欧美精品999| 日本免费网站在线观看| 亚洲图片欧美色图| 中文字幕精品视频在线| 亚洲精品孕妇| 蜜桃传媒一区二区| 中文字幕av一区二区三区佐山爱| 亚洲美女福利视频网站| 国产精品无码粉嫩小泬| 国产精品国产自产拍在线| 自拍偷拍一区二区三区四区| 999国产精品| 91av免费看| 国产蜜臀一区二区打屁股调教| 精品国精品国产尤物美女| 日韩免费不卡视频| 26uuu久久综合| 无码人妻精品一区二区三区66| 日韩欧美一区二区三区在线视频| 国产人妖伪娘一区91| av网站网址在线观看| 精品国产露脸精彩对白| 综合激情网五月| 国产日本一区二区| 午夜国产福利在线观看| 欧美日韩少妇| 免费亚洲一区二区| 欧美爱爱视频| 久久久久久12| 第一视频专区在线| 91精品免费在线观看| 日本三级片在线观看| 久久久久久久免费视频了| 岛国毛片在线播放| 伊人久久亚洲热| 色就是色欧美| theporn国产在线精品| 欧美一区二区.| 精品国产白色丝袜高跟鞋| 亚洲国产毛片完整版| 亚洲 欧美 中文字幕| 亚洲色图19p| 久久人人爽人人爽人人片| 久久丁香综合五月国产三级网站| 欧美激情亚洲天堂| 日本在线电影一区二区三区| 成人av中文| 最新日韩一区| 久久久亚洲影院| 亚洲欧美视频一区二区| 亚洲福利在线视频| ,一级淫片a看免费| 精品露脸国产偷人在视频| 国产91在线播放九色| 99在线视频精品| 制服丝袜中文字幕第一页| 夜夜嗨av一区二区三区网站四季av| 亚洲精品国产一区| 欧美日日夜夜| av色综合网| 欧美高清你懂的| 欧美亚洲国产日韩2020| 在线观看男女av免费网址| 国产一区二区三区在线免费观看| 人妻一区二区三区免费| 51精品秘密在线观看| 中文字幕手机在线视频| 亚洲成人tv网| 久久国产精品波多野结衣av| 成人欧美一区二区三区小说| 久久久久久九九九九九| 成人免费毛片a| 日韩高清在线一区二区| 精品一区二区三区在线观看国产| 韩国日本美国免费毛片| 亚洲一区二区毛片| 青青草精品视频在线| 嫩草伊人久久精品少妇av杨幂| 久久久久国产一区二区三区| av小次郎在线| 另类天堂视频在线观看| 日本a在线播放| 在线日韩中文字幕| 国产日本在线| 亚洲三级免费看| 免费一级在线观看播放网址| 亚洲激情久久久| 人妻妺妺窝人体色www聚色窝 | 日本成人黄色片| av第一福利在线导航| 欧美激情视频一区二区| 日本高清在线观看| 欧美精品情趣视频| 怡红院红怡院欧美aⅴ怡春院| 久久精品欧美视频| 久久综合之合合综合久久| 日韩有码在线观看| 日本三级在线视频| 久久精品最新地址| 美女免费久久| 久久视频在线播放| 黄网站在线免费看| 久久99热精品| 草草在线视频| 国产精品亚洲欧美| 中文字幕不卡av| 77777影视视频在线观看| 中文字幕不卡在线视频极品| 日本中文字幕在线看| 久久视频在线免费观看| 在线中文字幕-区二区三区四区| 欧美xxxx做受欧美.88| 国产精品蜜臀| 97国产在线观看| 1024在线看片你懂得| 欧美性在线观看| 影视一区二区三区| 成人a级免费视频| 136导航精品福利| 久久资源av| 欧美一站二站| 国产精品啪啪啪视频| 亚洲精品一二| 欧美成人三级在线播放| 国产精品99久久久久久久vr| 中文字幕在线播放视频| 国产日韩欧美高清在线| 国产稀缺精品盗摄盗拍| 亚洲图片欧美一区| 国产美女www爽爽爽| 欧美一区二区啪啪| 欧美理论在线观看| 久久久999精品视频| 91制片在线观看| 国产精品丝袜白浆摸在线| 欧美区一区二区| 久久精品日产第一区二区三区精品版| 欧美日韩激情| 大陆av在线播放| 天堂久久一区二区三区| 日本特黄在线观看| 久久久久久久久久久久久女国产乱 | 美女福利精品视频| av小说在线播放| 国产精品久久二区| 99久热这里只有精品视频免费观看| 国产精品久久久对白| 精品国产乱码| 野外做受又硬又粗又大视频√| 日韩精品欧美精品| av影片在线播放| 欧美激情一区二区三区全黄| 久久视频免费看| 欧美日韩亚洲高清一区二区| 天天操天天干天天爱| 久久精品国产96久久久香蕉| 成人短视频app| 成人在线观看91| 91亚洲一区| 88av.com| 99re成人精品视频| 亚洲最大的黄色网址| 欧洲一区二区三区在线| 五月色婷婷综合| 欧美成人sm免费视频| yiren22亚洲综合| 久久一区二区精品| 在线成人欧美| 国产chinesehd精品露脸| 国产精品视频九色porn| 中文字幕在线欧美| 亚洲精品国产免费| 视频在线这里都是精品| 国产一区香蕉久久| 欧美亚洲国产激情| 99精品人妻少妇一区二区| 国产精品夜夜爽| www.97视频| 精品视频1区2区| 国产专区在线| 国产91精品最新在线播放| 看全色黄大色大片免费久久久| 欧美一级中文字幕| 国产美女久久久久| 99热6这里只有精品| 在线精品视频免费观看| 免费黄色片在线观看| 2019最新中文字幕| 欧美激情久久久久久久久久久| 亚洲 自拍 另类小说综合图区| 国产高清在线精品| 强乱中文字幕av一区乱码| 欧美一区二区三区公司| 好了av在线| 亚洲中国色老太| 欧美日韩精品一本二本三本| 99热这里只有精品2| 亚洲黄色录像片| 秋霞网一区二区| 2019中文字幕免费视频| 你懂的一区二区三区| 黄色一级免费大片| 亚洲国产精品ⅴa在线观看| 中文精品久久久久人妻不卡| 中文字幕精品一区二区精品| 黑人一区二区三区| 欧美日韩一区二区三区电影| 国产精品中文字幕一区二区三区| 欧美极品视频在线观看| 亚洲国产天堂网精品网站| 日韩av影片| 日韩久久在线| 久久99久久99精品免视看婷婷| 粉嫩av性色av蜜臀av网站| 日韩午夜激情电影| 成人免费一区二区三区牛牛| 久久久久久亚洲精品不卡4k岛国 | 五月婷婷激情久久| 中文字幕在线不卡一区二区三区| 国产视频在线观看视频| 色综合男人天堂| 色婷婷av一区二区三区丝袜美腿| 国产精品99久久免费黑人人妻| 中文字幕精品一区 | 亚洲美女在线看| 久久av日韩| 成人性生活视频免费看| 久久久影视传媒| 99久久国产免费| 欧美一级黄色网| 国产高清一区二区| 97人妻精品一区二区三区免费| 色av成人天堂桃色av| 黄在线免费看| 免费看成人午夜电影| 精品一区二区久久久| 亚欧洲精品在线视频| 伊人久久精品视频| 看亚洲a级一级毛片| 国产91对白刺激露脸在线观看| 国产精品毛片a∨一区二区三区| 亚洲精品成av人片天堂无码| 日本高清视频一区| 欧美激情 亚洲a∨综合| 美女久久久久久久久久| 日韩视频中午一区| 欧美日韩成人影院| 国产精品videossex国产高清 | 欧美成人vr18sexvr| 国产免费不卡| 国产精品日韩三级|