精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

极品白嫩少妇无套内谢| 久久一夜天堂av一区二区三区| 中文字幕一区在线观看| 久久久免费观看视频| 亚洲一区二区在线观| 日韩xxx高潮hd| 视频一区中文字幕精品| 日本一区二区三区视频视频| 91超碰中文字幕久久精品| 亚洲911精品成人18网站| 性欧美18~19sex高清播放| 不卡av在线网| 久久久亚洲天堂| 中文字幕免费在线看线人动作大片 | 日韩不卡在线观看日韩不卡视频| 亚洲国产欧美久久| 丁香六月激情网| 国内精品久久久久久久久久久| 欧美独立站高清久久| 欧美怡红院视频| 无码免费一区二区三区免费播放| 久久久蜜桃一区二区| 亚洲视频分类| 色哟哟国产精品| 欧美精品一区二区视频| av大片在线免费观看| 日韩深夜影院| 色伊人久久综合中文字幕| 黄色网在线视频| 好男人www在线视频| 激情婷婷亚洲| 日韩成人久久久| 动漫av网站免费观看| 国产无套粉嫩白浆在线2022年| 日韩欧美四区| 精品三级av在线| 男人添女荫道口图片| 天堂网在线播放| 国产日韩亚洲欧美精品| 亚洲女人天堂视频| 超碰在线人人爱| 麻豆视频网站在线观看| 国产精品 日产精品 欧美精品| 久久天天躁狠狠躁夜夜爽蜜月| 91丨porny丨九色| 成人在线黄色电影| 久久久亚洲国产美女国产盗摄| 国产成人av网址| 成人无码精品1区2区3区免费看| 91成人精品观看| 亚洲第一福利视频在线| 欧美精品久久久| 日本黄在线观看| 老司机精品视频导航| www.亚洲天堂| 制服丝袜第一页在线观看| 成人私拍视频| 亚洲视频一区二区在线观看| 国产精品视频一区二区三区经| 99热在线观看免费精品| 久久理论电影| 日韩中文字幕免费| 69夜色精品国产69乱| 欧美日韩一区二区三区不卡视频| 欧美色图免费看| 日韩在线观看a| av2020不卡| 国产精品久久久一区麻豆最新章节| 91手机在线视频| av毛片在线免费观看| 美女国产精品| 欧美另类精品xxxx孕妇| 动漫精品一区二区三区| 日韩亚洲精品在线观看| 欧美成人女星排名| jlzzjizz在线播放观看| 国产精品久久久久久av公交车| 精品日韩视频在线观看| 97超碰免费观看| 国产一级免费在线观看| 岛国av在线一区| 国产在线视频一区| 中文字幕亚洲高清| 日日欢夜夜爽一区| 成人精品福利视频| 国产精品免费无遮挡无码永久视频| 中文字幕日韩一区二区不卡| 亚洲片国产一区一级在线观看| 美女又黄又免费的视频| 老司机aⅴ在线精品导航| 欧美一级一级性生活免费录像| 国产一区二区视频免费在线观看| 国产在线拍揄自揄拍视频| 国产精品对白交换视频| 91传媒免费视频| 小早川怜子影音先锋在线观看| 在线观看视频91| 国产一区亚洲二区三区| 日本午夜免费一区二区| 91久久线看在观草草青青| 欧美深夜福利视频| 欧美人与禽猛交乱配| 自拍偷拍国产亚洲| 夜夜爽www精品| segui88久久综合| 欧美偷拍一区二区| 免费黄色a级片| 日韩一区免费| 国产亚洲欧美日韩一区二区| mm131美女视频| 综合激情在线| 国产精品美女主播在线观看纯欲| 中文字幕精品无码一区二区| 亚洲专区一区| 欧洲亚洲在线视频| 国产毛片aaa| 国产又黄又大久久| 成人免费淫片aa视频免费| 亚洲色图欧美视频| 久久久影院官网| 久久人妻无码一区二区| 成人一区视频| 777久久久精品| 五月天婷婷在线观看视频| 99久久久成人国产精品| 亚洲欧美在线免费观看| 久久综合色综合| 国产欧美大片| 97超碰最新| 黄色网址在线免费观看| 亚洲精品老司机| 日本手机在线视频| 91麻豆精品| 中文字幕亚洲无线码在线一区| 亚洲精品成人av久久| 99久久婷婷这里只有精品 | 黄色小网站在线观看| 欧美影院一区二区三区| 日本二区在线观看| 欧美综合二区| 蜜桃导航-精品导航| 成人动漫在线播放| 中文字幕永久在线不卡| 在线免费观看视频黄| 深爱激情综合网| 久久精品视频在线观看| 妺妺窝人体色www聚色窝仙踪| 亚洲人成久久| 国产精品一区二区三区毛片淫片 | 久久精品国产99久久6| 日本一区二区三区精品视频| 久久日韩视频| 欧美日韩第一区日日骚| 99热超碰在线| 色偷偷综合网| 91国内精品久久| 香蕉视频黄色片| 高跟丝袜欧美一区| 人妻大战黑人白浆狂泄| 奇米精品一区二区三区在线观看| 亚洲影院在线看| 免费国产在线观看| 一区二区三区免费| 国产真人无码作爱视频免费| 日韩一区二区三区在线看| 欧美高清激情视频| 中文字幕一区2区3区| 成人高清视频免费观看| 久久精品视频16| 免费视频国产一区| 国产精品嫩草视频| 久草资源在线观看| 亚洲а∨天堂久久精品9966| 久久久久亚洲AV成人无在| 久久精品国产77777蜜臀| 99热一区二区三区| 香蕉成人av| 精品国产91九色蝌蚪| 日韩av无码中文字幕| 91女厕偷拍女厕偷拍高清| 永久免费网站视频在线观看| 超级碰碰久久| 中文字幕日韩欧美在线| 99这里有精品视频| 欧美日韩加勒比精品一区| 国产三级在线观看完整版| 国产精品一区二区三区四区| 日韩精品一区二区三区丰满| 免费成人在线电影| 精品日产卡一卡二卡麻豆| 天天操天天干视频| 国产精品美女一区二区三区| 欧美图片自拍偷拍| 日韩精品一二三区| 激情六月天婷婷| 精品一区二区三区在线| 欧美亚洲在线观看| 国产黄色片av| 一本大道久久a久久精二百 | 99精品小视频| 精品一区二区国产| 欧美极品少妇videossex| 国产午夜精品久久久| 动漫性做爰视频| 麻豆91在线观看| 日本手机在线视频| 91久久国产| 欧美日韩日本网| 亚洲精品观看| 欧美高清激情视频| av电影在线观看一区二区三区| 在线看日韩精品电影| 精品少妇theporn| 国产精品色一区二区三区| 欲求不满的岳中文字幕| 国产麻豆欧美日韩一区| 久久久国产欧美| 色中色综合网| 蜜桃成人免费视频| 白嫩白嫩国产精品| 91av视频在线免费观看| av免费在线网站| 日韩视频免费观看高清完整版在线观看| 日韩一卡二卡在线观看| 久久婷婷色综合| 国产激情第一页| 国产精品资源网| 亚洲一区精品视频在线观看| 一区二区三区午夜探花| 日韩欧美一区二区三区久久婷婷| 蜜桃一区av| 国产精品国产亚洲精品看不卡15| 国产精品欧美一区二区三区不卡| 国产精品极品美女在线观看免费 | 欧美激情中文字幕一区二区| 亚洲第一页av| 97精品国产97久久久久久久久久久久| 成人在线免费在线观看 | 少妇高潮喷水久久久久久久久久| 欧美日韩精品一本二本三本| 精品一区国产| 老牛影视av一区二区在线观看| 丁香五月网久久综合| 午夜欧美激情| 98精品国产自产在线观看| av小说在线播放| 久久免费视频在线观看| 不卡av免费观看| 久久久久久有精品国产| av午夜在线| 中文字幕欧美在线| 91高清在线视频| 日韩在线中文字| 亚洲精品福利网站| 在线影院国内精品| 波多野结衣视频观看| 在线观看91精品国产入口| 免费精品一区二区| 欧美日韩国产天堂| 国产喷水福利在线视频| 欧美午夜宅男影院在线观看| 神马午夜精品91| 91免费版在线| 在线观看国产精品一区| 成人精品免费网站| 污污污www精品国产网站| 91网站最新网址| 丁香花五月婷婷| 亚洲天堂精品在线观看| 欧美丰满艳妇bbwbbw| 欧美国产精品中文字幕| 国产精品久久AV无码| 久久色中文字幕| 男女男精品视频网站| 99久久精品国产导航| 波多野结衣a v在线| 成人精品视频一区二区三区尤物| 亚洲av网址在线| 国产区在线观看成人精品| 我要看一级黄色录像| 亚洲综合视频在线观看| 欧美国产成人精品一区二区三区| 欧美亚洲综合另类| 精品人妻一区二区三区含羞草| 欧美在线视频全部完| 国产女人18毛片水18精| 日韩av在线免费| 午夜激情在线观看| 亚洲一级黄色av| dy888亚洲精品一区二区三区| 伊人久久大香线蕉av一区二区| 天堂av在线资源| 亚洲大胆人体av| www.精品视频| 亚洲色图第一页| 日本在线视频www鲁啊鲁| 久久天天躁狠狠躁夜夜av| 成人观看网址| 成人h猎奇视频网站| 欧美一区二区三区红桃小说| 中文字幕色一区二区| 久久国产成人午夜av影院宅| 欧美精品卡一卡二| 亚洲高清av| 成人不卡免费视频| 激情五月婷婷综合| 午夜激情影院在线观看| wwwwxxxxx欧美| 国产精品白嫩白嫩大学美女| 91精品福利视频| 免费看黄网站在线观看| 亚洲国产精久久久久久久| www视频在线观看免费| 久久久亚洲影院你懂的| 91成人精品观看| 水蜜桃一区二区三区| 午夜在线一区二区| 野战少妇38p| 亚洲激情图片一区| 无码人妻久久一区二区三区 | 999久久久精品国产| 国产精品动漫网站| 视频一区二区欧美| 99热手机在线| 91免费小视频| 亚洲天堂日韩av| 色婷婷av一区二区| 国模人体一区二区| 欧美成人午夜影院| 岛国在线视频网站| 成人h在线播放| 要久久电视剧全集免费| 欧美日韩成人免费视频| 丁香婷婷综合五月| 好吊色视频在线观看| 欧美精品日韩一区| 好男人www在线视频| 久久99精品久久久久久噜噜 | 91精品福利在线一区二区三区 | 亚洲免费观看高清完整版在线| 国产一级一片免费播放| 一本色道综合亚洲| 亚洲三区在线播放| 欧洲美女7788成人免费视频| 亚洲综合图色| 国产精品无码av无码| 久久久99久久精品欧美| 中文字幕一区二区三区精品| 亚洲精品一区二区三区四区高清| 爱情岛亚洲播放路线| 国产乱码一区| 亚洲一区激情| 精品人妻无码一区二区三区| 色综合久久精品| 岛国在线大片| 国产综合在线观看视频| 91精品一区国产高清在线gif| 缅甸午夜性猛交xxxx| 99久久综合色| 爱爱视频免费在线观看| 欧美一区二区三区免费| 青青草原av在线| 狠狠久久综合婷婷不卡| 久久国产精品99国产| 谁有免费的黄色网址| 欧美电影一区二区| 日本大胆在线观看| 精品卡一卡二| 三级在线观看一区二区| 国产精品18在线| 日韩欧美高清在线| 在线视频自拍| 91视频网页| 老司机午夜精品视频| 熟女少妇a性色生活片毛片| 日韩欧美一区二区久久婷婷| 丁香花电影在线观看完整版| 麻豆成人av| 久久99久久精品欧美| av女人的天堂| 制服视频三区第一页精品| 后进极品白嫩翘臀在线播放| 欧美极品视频一区二区三区| 蜜臀av一区二区| 亚洲一区二区三区日韩| 欧美高清激情brazzers| 6699嫩草久久久精品影院| 日本精品二区| 国产麻豆欧美日韩一区| 精品国产一区二区三区四| 久久精品在线播放| 日本欧美韩国国产| 精品亚洲一区二区三区四区| 国产欧美在线观看一区| 国产女人高潮毛片| 欧洲美女免费图片一区| 亚洲男女av一区二区| www.中文字幕av| 日韩美女天天操| 久久亚洲人体|