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

一篇帶你kubebuilder 進階: webhook

開發 項目管理
準入控制存在兩種 WebHook,變更準入控制 MutatingAdmissionWebhook,和驗證準入控制 ValidatingAdmissionWebhook,執行的順序是先執行 MutatingAdmissionWebhook 再執行 ValidatingAdmissionWebhook。

[[399996]]

在前面的文章當中我們已經完成了 NodePool Operator 的基本功能開發與測試,但是有時候我們會有這種需求,例如創建或者刪除資源的時候需要對資源進行一些檢查的操作,如果校驗不成功就不通過。或者是需要在完成實際的創建之前做一些其他操作,例如我創建一個 pod 之前對 pod 的資源做一些調整等。這些都可以通過準入控制的WebHook來實現。

準入控制存在兩種 WebHook,變更準入控制 MutatingAdmissionWebhook,和驗證準入控制 ValidatingAdmissionWebhook,執行的順序是先執行 MutatingAdmissionWebhook 再執行 ValidatingAdmissionWebhook。

創建 webhook

我們通過命令創建相關的腳手架代碼和 api

  1. kubebuilder create webhook --group nodes --version v1 --kind NodePool --defaulting --programmatic-validation 

執行之后可以看到多了一些 webhook 相關的文件和配置

  1.   ├── api 
  2.   │   └── v1 
  3.   │       ├── groupversion_info.go 
  4.   │       ├── nodepool_types.go 
  5. + │       ├── nodepool_webhook.go # 在這里實現 webhook 的相關接口 
  6. + │       ├── webhook_suite_test.go # webhook 測試 
  7.   │       └── zz_generated.deepcopy.go 
  8.   ├── bin 
  9.   ├── config 
  10. + │   ├── certmanager # 用于部署 
  11.   │   ├── crd 
  12.   │   │   ├── bases 
  13.   │   │   │   └── nodes.lailin.xyz_nodepools.yaml 
  14.   │   │   ├── kustomization.yaml 
  15.   │   │   ├── kustomizeconfig.yaml 
  16.   │   │   └── patches 
  17.   │   │       ├── cainjection_in_nodepools.yaml 
  18. + │   │       └── webhook_in_nodepools.yaml 
  19.   │   ├── default 
  20.   │   │   ├── kustomization.yaml 
  21.   │   │   ├── manager_auth_proxy_patch.yaml 
  22.   │   │   ├── manager_config_patch.yaml 
  23. + │   │   ├── manager_webhook_patch.yaml 
  24. + │   │   └── webhookcainjection_patch.yaml 
  25.   │   ├── manager 
  26.   │   ├── prometheus 
  27.   │   ├── rbac 
  28.   │   ├── samples 
  29.   │   │   └── nodes_v1_nodepool.yaml 
  30. + │   └── webhook # webhook 部署配置 
  31.   ├── controllers 
  32.   ├── main.go 

實現邏輯

實現 MutatingAdmissionWebhook 接口

這個只需要實現 Default 方法就行

  1. // Default implements webhook.Defaulter so a webhook will be registered for the type 
  2. func (r *NodePool) Default() { 
  3.  nodepoollog.Info("default""name", r.Name
  4.  
  5.  // 如果 labels 為空,我們就給 labels 加一個默認值 
  6.  if len(r.Labels) == 0 { 
  7.   r.Labels["node-pool.lailin.xyz"] = r.Name 
  8.  } 

實現 ValidatingAdmissionWebhook 接口

實現 ValidatingAdmissionWebhook也是一樣只需要實現對應的方法就行了,默認是注冊了 Create 和 Update 事件的校驗,我們這里主要是限制 Labels 和 Taints 的 key 只能是滿足正則 ^node-pool.lailin.xyz/*[a-zA-z0-9]*$ 的固定格式

  1. // TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation. 
  2. //+kubebuilder:webhook:path=/validate-nodes-lailin-xyz-v1-nodepool,mutating=false,failurePolicy=fail,sideEffects=None,groups=nodes.lailin.xyz,resources=nodepools,verbs=create;update,versions=v1,name=vnodepool.kb.io,admissionReviewVersions={v1,v1beta1} 
  3.  
  4. var _ webhook.Validator = &NodePool{} 
  5.  
  6. // ValidateCreate implements webhook.Validator so a webhook will be registered for the type 
  7. func (r *NodePool) ValidateCreate() error { 
  8.  nodePoolLog.Info("validate create""name", r.Name
  9.  
  10.  return r.validate() 
  11.  
  12. // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type 
  13. func (r *NodePool) ValidateUpdate(old runtime.Object) error { 
  14.  nodePoolLog.Info("validate update""name", r.Name
  15.  
  16.  return r.validate() 
  17.  
  18. // ValidateDelete implements webhook.Validator so a webhook will be registered for the type 
  19. func (r *NodePool) ValidateDelete() error { 
  20.  nodePoolLog.Info("validate delete""name", r.Name
  21.  
  22.  // TODO(user): fill in your validation logic upon object deletion. 
  23.  return nil 
  24.  
  25. // validate 驗證 
  26. func (r *NodePool) validate() error { 
  27.  err := errors.Errorf("taint or label key must validatedy by %s", keyReg.String()) 
  28.  
  29.  for k := range r.Spec.Labels { 
  30.   if !keyReg.MatchString(k) { 
  31.    return errors.WithMessagef(err, "label key: %s", k) 
  32.   } 
  33.  } 
  34.  
  35.  for _, taint := range r.Spec.Taints { 
  36.   if !keyReg.MatchString(taint.Key) { 
  37.    return errors.WithMessagef(err, "taint key: %s", taint.Key
  38.   } 
  39.  } 
  40.  
  41.  return nil 

部署

實現了之后直接在 make run 是跑不起來的,因為 webhook 注冊的地址不對,我們這里先看一下如何進行部署運行,然后再來看如何對 WebHook 進行本地調試。

WebHook 的運行需要校驗證書,kubebuilder 官方建議我們使用 cert-manager 簡化對證書的管理,所以我們先部署一下 cert-manager 的服務

  1. kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yaml 

然后我們 build 鏡像并且將鏡像 load 到集群中

  1. make docker-build 
  2.  
  3. kind load docker-image --name kind --nodes kind-worker controller:latest 

然后查看一下 config/default/kustomization.yaml文件,確認 webhook 相關的配置沒有被注釋掉

  1. # Adds namespace to all resources. 
  2. namespace: node-pool-operator-system 
  3.  
  4. # Value of this field is prepended to the 
  5. # names of all resources, e.g. a deployment named 
  6. "wordpress" becomes "alices-wordpress"
  7. # Note that it should also match with the prefix (text before '-'of the namespace 
  8. # field above. 
  9. namePrefix: node-pool-operator- 
  10.  
  11. # Labels to add to all resources and selectors. 
  12. #commonLabels: 
  13. #  someName: someValue 
  14.  
  15. bases: 
  16. - ../crd 
  17. - ../rbac 
  18. - ../manager 
  19. # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in 
  20. # crd/kustomization.yaml 
  21. - ../webhook 
  22. # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER''WEBHOOK' components are required. 
  23. - ../certmanager 
  24. # [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'
  25. #- ../prometheus 
  26.  
  27. patchesStrategicMerge: 
  28. # Protect the /metrics endpoint by putting it behind auth. 
  29. # If you want your controller-manager to expose the /metrics 
  30. # endpoint w/o any authn/z, please comment the following line. 
  31. - manager_auth_proxy_patch.yaml 
  32.  
  33. # Mount the controller config file for loading manager configurations 
  34. # through a ComponentConfig type 
  35. #- manager_config_patch.yaml 
  36.  
  37. # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in 
  38. # crd/kustomization.yaml 
  39. - manager_webhook_patch.yaml 
  40.  
  41. # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'
  42. # Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks. 
  43. 'CERTMANAGER' needs to be enabled to use ca injection 
  44. - webhookcainjection_patch.yaml 
  45.  
  46. # the following config is for teaching kustomize how to do var substitution 
  47. vars: 
  48. # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. 
  49. name: CERTIFICATE_NAMESPACE # namespace of the certificate CR 
  50.   objref: 
  51.     kind: Certificate 
  52.     group: cert-manager.io 
  53.     version: v1 
  54.     name: serving-cert # this name should match the one in certificate.yaml 
  55.   fieldref: 
  56.     fieldpath: metadata.namespace 
  57. name: CERTIFICATE_NAME 
  58.   objref: 
  59.     kind: Certificate 
  60.     group: cert-manager.io 
  61.     version: v1 
  62.     name: serving-cert # this name should match the one in certificate.yaml 
  63. name: SERVICE_NAMESPACE # namespace of the service 
  64.   objref: 
  65.     kind: Service 
  66.     version: v1 
  67.     name: webhook-service 
  68.   fieldref: 
  69.     fieldpath: metadata.namespace 
  70. name: SERVICE_NAME 
  71.   objref: 
  72.     kind: Service 
  73.     version: v1 
  74.     name: webhook-service 

檢查一下 manager/manager.yaml 是否存在 imagePullPolicy: IfNotPresent不存在要加上

然后執行部署命令即可

  1. make deploy 
  2.  
  3. # 檢查 pod 是否正常啟動 
  4. ▶ kubectl -n node-pool-operator-system get pods 
  5. NAME                                                     READY   STATUS              RESTARTS   AGE 
  6. node-pool-operator-controller-manager-66bd747899-lf7xb   0/2     ContainerCreating   0          7s 

使用 yaml 文件測試一下

  1. apiVersion: nodes.lailin.xyz/v1 
  2. kind: NodePool 
  3. metadata: 
  4.   name: worker 
  5. spec: 
  6.   labels: 
  7.     "xxx""10" 
  8.   handler: runc 

提交之后可以發現報錯,因為 label key 不滿足我們的要求

  1. ▶ kubectl apply -f config/samples/                                           
  2. Error from server (label key: xxx: taint or label key must validatedy by ^node-pool.lailin.xyz/*[a-zA-z0-9]*$): error when applying patch: 
  3. {"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"nodes.lailin.xyz/v1\",\"kind\":\"NodePool\",\"metadata\":{\"annotations\":{},\"name\":\"worker\"},\"spec\":{\"handler\":\"runc\",\"labels\":{\"xxx\":\"10\"}}}\n"}},"spec":{"labels":{"node-pool.lailin.xyz/worker":null,"xxx":"10"},"taints":null}} 
  4. to
  5. Resource: "nodes.lailin.xyz/v1, Resource=nodepools", GroupVersionKind: "nodes.lailin.xyz/v1, Kind=NodePool" 
  6. Name"worker", Namespace: "" 
  7. for"config/samples/nodes_v1_nodepool.yaml": admission webhook "vnodepool.kb.io" denied the request: label key: xxx: taint or label key must validatedy by ^node-pool.lailin.xyz/*[a-zA-z0-9]*$ 

再用一個正常的 yaml 測試

  1. apiVersion: nodes.lailin.xyz/v1 
  2. kind: NodePool 
  3. metadata: 
  4.   name: worker 
  5. spec: 
  6.   labels: 
  7.     "node-pool.lailin.xyz/xxx""10" 
  8.   handler: runc 

可以正常提交

  1. ▶ kubectl apply -f config/samples/                      
  2. nodepool.nodes.lailin.xyz/worker configured 

本地調試

雖然 kubebuilder 已經為我們做了很多事情將服務部署運行基本傻瓜化了,但是每次做一點點修改就需要重新編譯部署還是非常的麻煩,所以我們來看看如何在本地進行聯調。

  • PS: 這里會用到之前 4. kustomize 簡明教程 講到的 kustomize 的特性構建開發環境,如果忘記了可以先看看之前的文章哦

我們先看看 config/webhook/manifests.yaml這里面包含了兩個準入控制的信息,不過他們的配置類似,我們看一個就行了,這里以 MutatingWebhookConfiguration 為例

  1. apiVersion: admissionregistration.k8s.io/v1 
  2. kind: MutatingWebhookConfiguration 
  3. metadata: 
  4.   creationTimestamp: null 
  5.   name: mutating-webhook-configuration 
  6. webhooks: 
  7. - admissionReviewVersions: 
  8.   - v1 
  9.   - v1beta1 
  10.   clientConfig: 
  11.     service: 
  12.       name: webhook-service 
  13.       namespace: system 
  14.       path: /mutate-nodes-lailin-xyz-v1-nodepool 
  15.   failurePolicy: Fail 
  16.   name: mnodepool.kb.io 
  17.   rules: 
  18.   - apiGroups: 
  19.     - nodes.lailin.xyz 
  20.     apiVersions: 
  21.     - v1 
  22.     operations: 
  23.     - CREATE 
  24.     - UPDATE 
  25.     resources: 
  26.     - nodepools 
  27.   sideEffects: None 

主要是 clientConfig 的配置,如果想要本地聯調,我們需要將 clientConfig.service 刪掉,替換成

  1. clientConfig: 
  2.   url: https://host.docker.internal:9443/mutate-nodes-lailin-xyz-v1-nodepool 

注意: host.docker.internal是 docker desktop 的默認域名,通過這個可以調用到宿主機上的服務,url path mutate-nodes-lailin-xyz-v1-nodepool需要和 service 中的 path 保持一致

然后再加上 caBundle

  1. clientConfig: 
  2.   caBundle: CA證書 base64 后的字符串 

證書

想要本地聯調需要先生成證書,我們使用 openssl 來生成,先創建一個 config/cert 文件夾,我們把證書都放到這里

首先創建一個 csr.conf文件

  1. [ req ] 
  2. default_bits = 2048 
  3. prompt = no 
  4. default_md = sha256 
  5. req_extensions = req_ext 
  6. distinguished_name = dn 
  7.  
  8. [ dn ] 
  9. C = CN 
  10. ST = Guangzhou 
  11. L = Shenzhen 
  12. CN = host.docker.internal 
  13.  
  14. [ req_ext ] 
  15. subjectAltName = @alt_names 
  16.  
  17. [ alt_names ] 
  18. DNS.1 = host.docker.internal # 這里由于我們直接訪問的是域名所以用 DNS 
  19.  
  20. [ v3_ext ] 
  21. authorityKeyIdentifier=keyid,issuer:always 
  22. basicConstraints=CA:FALSE 
  23. keyUsage=keyEncipherment,dataEncipherment 
  24. extendedKeyUsage=serverAuth,clientAuth 
  25. subjectAltName=@alt_names 

然后生成 CA 證書并且簽發本地證書

  1. # 生成 CA 證書 
  2. openssl genrsa -out ca.key 2048 
  3. openssl req -x509 -new -nodes -key ca.key -subj "/CN=host.docker.internal" -days 10000 -out ca.crt 
  4.  
  5. # 簽發本地證書 
  6. openssl genrsa -out tls.key 2048 
  7. openssl req -new -SHA256 -newkey rsa:2048 -nodes -keyout tls.key -out tls.csr -subj "/C=CN/ST=Shanghai/L=Shanghai/O=/OU=/CN=host.docker.internal" 
  8. openssl req -new -key tls.key -out tls.csr -config csr.conf 
  9. openssl x509 -req -in tls.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out tls.crt -days 10000 -extensions v3_ext -extfile csr.conf 

配置變更

我們為了和原本的開發體驗保持一致,所以利用 kustomize 的特性新建一個 config/dev 文件夾,包含兩個文件修改我們想要的配置

  1. ▶ tree config/dev 
  2. config/dev 
  3. ├── kustomization.yaml 
  4. └── webhook_patch.yaml 

先看一下 kustomization.yaml,從 default 文件夾中繼承配置,然后使用 patches 修改一些配置,主要是分別給兩種準入控制 WebHook 添加 url 字段,然后使用 webhook_patch.yaml對兩個文件做些統一的配置

  1. resources: 
  2. - ../default 
  3.  
  4. patches: 
  5. - patch: | 
  6.     - op: "add" 
  7.       path: "/webhooks/0/clientConfig/url" 
  8.       value: "https://host.docker.internal:9443/mutate-nodes-lailin-xyz-v1-nodepool" 
  9.   target: 
  10.     kind: MutatingWebhookConfiguration 
  11. - patch: | 
  12.     - op: "add" 
  13.       path: "/webhooks/0/clientConfig/url" 
  14.       value: "https://host.docker.internal:9443/validate-nodes-lailin-xyz-v1-nodepool" 
  15.   target: 
  16.     kind: ValidatingWebhookConfiguration 
  17. - path: webhook_patch.yaml 
  18.   target: 
  19.     group: admissionregistration.k8s.io 

webhook_patch.yaml 這個主要是移除 cert-manager.io 的 annotation,本地調試不需要使用它進行證書注入,然后移除掉 service 并且添加 CA 證書

  1. - op: "remove" 
  2.   path: "/metadata/annotations/cert-manager.io~1inject-ca-from" 
  3. - op: "remove" 
  4.   path: "/webhooks/0/clientConfig/service" 
  5. - op: "add" 
  6.   path: "/webhooks/0/clientConfig/caBundle" 
  7.   value: CA 證書 base64 后的值 

CA 證書的值可以通過以下命令獲取

  1. cat config/cert/ca.crt | base64 | tr -d '\n' 

然后修改一下 main.go將證書文件夾指定到我們剛剛生成好的文件目錄

  1. mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ 
  2.   Scheme:                 scheme, 
  3.   MetricsBindAddress:     metricsAddr, 
  4.   Port:                   9443, 
  5.   HealthProbeBindAddress: probeAddr, 
  6.   LeaderElection:         enableLeaderElection, 
  7.   LeaderElectionID:       "97acaccf.lailin.xyz"
  8. +  CertDir:                "config/cert/", // 手動指定證書位置用于測試 
  9. }) 

為了方便調試,在 makefile 中添加

  1. dev: manifests kustomize 
  2.  cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} 
  3.  $(KUSTOMIZE) build config/dev | kubectl apply -f - 

最后執行一下 make dev 然后再執行 make run 就行了

總結

今天完成了準入控制 WebHook 的實現,雖然這個例子可能不太好,如果只需要校驗正則,直接配置一下//+kubebuilder:validation:Pattern=string就行了,但是學習了這個之后其實可以做很多事情,例如給 pod 增加 sidecar 根據應用類型的不同注入不同的一些 agent 等等.

本文轉載自微信公眾號「mohuishou」,可以通過以下二維碼關注。轉載本文請聯系mohuishou公眾號。

 

責任編輯:姜華 來源: mohuishou
相關推薦

2021-05-17 05:51:31

KubeBuilderOperator測試

2021-05-12 06:18:19

KubeBuilderOperatork8s

2021-05-16 10:52:58

kubebuilderstatus event

2021-05-08 09:02:48

KubeBuilderOperatork8s

2021-01-01 09:20:20

操作DjangoORM

2023-04-20 08:00:00

ES搜索引擎MySQL

2021-05-20 06:57:16

RabbitMQ開源消息

2025-01-17 07:00:00

2022-02-24 07:56:42

開發Viteesbuild

2022-03-10 08:31:51

REST接口規范設計Restful架構

2021-06-16 08:28:25

unary 方法函數技術

2021-10-27 09:59:35

存儲

2021-11-24 08:51:32

Node.js監聽函數

2023-02-28 23:04:15

2023-04-21 08:11:54

KubernetesPod

2021-11-08 08:42:44

CentOS Supervisor運維

2021-08-02 06:34:55

Redis刪除策略開源

2020-11-27 08:02:41

Promise

2021-11-16 14:09:58

Containerd Dockerk8s

2021-12-15 11:52:34

GPLLinuxGNU
點贊
收藏

51CTO技術棧公眾號

97在线视频一区| 91麻豆精品国产自产在线观看一区 | 天堂成人国产精品一区| 中文字幕av一区二区| 午夜免费一级片| av影视在线| 日本一区二区三区免费乱视频| 成人国产精品av| 五月婷婷开心网| 久久电影院7| 亚洲精品黄网在线观看| 97超碰人人爽| 国产精品av一区二区三区 | 婷婷四月色综合| 亚洲国产成人在线观看| 日韩在线观看一区二区| 欧美第一黄色网| 免费成人深夜蜜桃视频| 欧美巨大xxxx| 欧美一级欧美三级在线观看| 国产xxxxx视频| 国产丝袜视频在线播放| 欧美国产精品一区| 久久99精品久久久久久水蜜桃| 国产又粗又长又大视频| 丝袜美腿亚洲综合| 91精品国产91久久久久久不卡| 久久久久久久久久97| 欧美日韩xxxx| 亚洲精品国产综合区久久久久久久| 亚洲天堂av一区二区| 日韩精品第一| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 色综合狠狠操| 永久免费看mv网站入口亚洲| 一本加勒比波多野结衣| av在线亚洲色图| 69堂国产成人免费视频| 狠狠躁狠狠躁视频专区| 精品成人av| 欧美日韩在线一区| 99视频在线免费播放| 麻豆福利在线观看| 一区二区日韩av| 女女百合国产免费网站| 黄色网址视频在线观看| 国产精品久久久久久久久免费相片 | 欧美在线视频在线播放完整版免费观看 | 亚洲AV午夜精品| 国产乱码精品一区二区三区av| 国产日韩精品综合网站| 中文字幕在线观看免费| 日本成人超碰在线观看| 国产精品久久久久久久久久东京 | 欧美日韩亚洲一区二区三区四区| 日韩一级片免费在线观看| 懂色av中文字幕一区二区三区| 亚洲伊人第一页| 国产哺乳奶水91在线播放| 国产伦精一区二区三区| 成人免费视频网站| 亚洲精品久久久狠狠狠爱 | 熟女少妇内射日韩亚洲| 精品视频网站| 欲色天天网综合久久| 1024在线看片| 91成人免费| 九九九热精品免费视频观看网站| 久久久久无码国产精品| 亚洲激情视频| 日韩免费中文字幕| 亚洲在线免费观看视频| 国产在线看一区| 国产精华一区| 青青青免费视频在线2| 国产日产欧产精品推荐色| 亚洲精品中文综合第一页| 成人午夜在线影视| 亚洲一级片在线观看| 日韩在线一级片| 黄色成人在线观看网站| 欧美一级高清片| 性活交片大全免费看| 一本久久青青| 久久久精品亚洲| 国产福利拍拍拍| 日韩国产欧美视频| 91久久极品少妇xxxxⅹ软件| 午夜视频在线免费播放| 中文字幕av一区二区三区免费看 | 深夜福利影院在线观看| 一区二区日本视频| 国产有码在线一区二区视频| 丰满人妻一区二区三区免费| 久久久久久夜精品精品免费| 中文字幕一区二区三区四区五区六区| 色网在线观看| 91福利视频在线| 少妇丰满尤物大尺度写真| 丝袜美腿综合| 久久综合88中文色鬼| 亚洲黄色三级视频| 久草中文综合在线| 久久久影院一区二区三区 | 中文字幕综合网| 欧美日韩在线中文| 99久久久国产| 亚洲三级免费看| 久久在线视频精品| 蜜臀av在线播放一区二区三区| 国产精品久久久久久久久久直播| 99视频在线观看地址| 午夜欧美在线一二页| 精品国产鲁一鲁一区二区三区| 国产精品日韩精品中文字幕| 欧美精品videossex88| 一二三区中文字幕| 久久午夜羞羞影院免费观看| 裸体裸乳免费看| 草民电影神马电影一区二区| 日韩av在线看| 欧美人妻精品一区二区三区| 久久国产精品色婷婷| 欧美国产一二三区| а√天堂8资源中文在线| 51精品久久久久久久蜜臀| 公肉吊粗大爽色翁浪妇视频| 日韩香蕉视频| 99久热re在线精品996热视频| 日韩在线免费电影| 在线视频欧美区| 亚洲第一页av| 国产视频一区欧美| 国产乱码精品一区二区三区卡 | 国产精品老女人视频| 三级黄视频在线观看| 性做久久久久久久久| 91精品又粗又猛又爽| 欧美激情五月| 亚洲综合中文字幕在线观看| 精品国产白色丝袜高跟鞋| 欧美日韩午夜在线| www.xx日本| 久久国产日韩欧美精品| 五月天丁香综合久久国产| 国模一区二区| 伊人久久久久久久久久久久久 | 日韩一区二区三| 四虎免费在线视频| 国产自产2019最新不卡| 免费看啪啪网站| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 国模私拍国内精品国内av| 在线播放国产一区二区三区| 欧美在线视频精品| 国产精品理伦片| www.成人黄色| 欧美日韩亚洲一区三区| 国产精品日韩欧美一区二区三区| 久久免费电影| 亚洲精品美女在线观看| 亚洲欧美一区二区三区在线观看| 久久久久久久久久久久久久久99| 日韩一级片播放| 97精品视频| 91视频免费进入| 成年人黄色大片在线| 亚洲欧美国产视频| 中文字幕在线观看免费| 一区二区高清视频在线观看| 日韩精品视频一区二区| 久久国产精品99国产| 亚洲美女搞黄| 一区二区三区欧洲区| 68精品国产免费久久久久久婷婷| 国产一二三区在线视频| 欧美精品自拍偷拍动漫精品| 九九在线观看视频| 26uuu亚洲综合色| 美女一区二区三区视频| 欧美在线亚洲| 国产精品三区四区| 播放一区二区| 欧美精品久久久久久久免费观看 | 欧美成人精品不卡视频在线观看| 性生活黄色大片| 精品人伦一区二区三区蜜桃网站| 国产亚洲精品熟女国产成人| 国产一区二区三区免费| 中国丰满人妻videoshd| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 另类欧美日韩国产在线| 国产精品第157页| 国产影视一区| 国产超碰91| 国产成人午夜性a一级毛片| 欧美黑人狂野猛交老妇| 国产毛片av在线| 欧美成人激情免费网| 久久久久亚洲视频| 亚洲国产欧美日韩另类综合| 国产精品久久久视频| 岛国一区二区在线观看| 免费看涩涩视频| 国产日韩专区| 欧美一二三不卡| 成人在线免费观看视频| 黑人中文字幕一区二区三区| 国产95亚洲| 国产精品久久色| 国模精品视频| 久久久91精品国产| 久久伊伊香蕉| 亚洲成人中文字幕| 国产免费视频一区二区三区| 91久久精品一区二区三区| 久久中文字幕在线观看| 国产精品毛片a∨一区二区三区| av天堂一区二区| 国产乱人伦偷精品视频不卡| 91女神在线观看| 日韩国产精品久久久久久亚洲| 成年人午夜免费视频| 欧美在线首页| 女女同性女同一区二区三区按摩| 精品色999| 欧美三级华人主播| 日本妇女一区| 精品久久久久久一区二区里番| 日本伊人久久| 91深夜福利视频| 亚洲男男av| 成人www视频在线观看| 成人在线爆射| 国产精品成人播放| 成人免费看黄| 日本国产高清不卡| 老司机成人影院| 欧美又大又粗又长| 345成人影院| 欧美一区二区三区艳史| 亚洲天堂手机| 日本成人在线视频网址| 老司机成人影院| 国产成人av网| 国产成人免费9x9x人网站视频| 欧美性受xxxx黑人猛交| www.成人爱| 国产激情综合五月久久| 另类激情视频| 国产精品亚洲一区二区三区| 成人av色网站| 91九色精品视频| 2020最新国产精品| 精品中文字幕一区| 亚洲人成亚洲精品| 欧美一区二区综合| 成人3d精品动漫精品一二三| 亚洲国产一区在线| 亚洲精品极品少妇16p| 丰满人妻一区二区三区53号| 好看的av在线不卡观看| 草草久久久无码国产专区| 日韩成人伦理电影在线观看| 午夜免费看毛片| 国产福利一区在线| 国产乱了高清露脸对白| 久久精品网站免费观看| 日本激情视频一区二区三区| 一区二区三区在线免费观看 | 色婷婷综合五月| 亚洲一区二区三区网站| 日韩午夜电影在线观看| 污污视频在线免费看| 亚洲午夜小视频| 欧美成人高清在线| 国内精品久久久久久影视8| 欧美天堂视频| 91亚洲精品久久久| 欧美美女啪啪| 一区二区免费在线视频| 伊人影院久久| 国产精品视频黄色| 国产91丝袜在线观看| 18禁裸乳无遮挡啪啪无码免费| 国产精品久久久久久久久搜平片| 久久99久久98精品免观看软件| 欧美性少妇18aaaa视频| 91肉色超薄丝袜脚交一区二区| 亚洲成人久久久久| 91se在线| 1769国产精品| 国产成年精品| 茄子视频成人在线观看| 欧美视频不卡| 亚洲最大成人在线观看| 成人18精品视频| 农村老熟妇乱子伦视频| 婷婷激情综合网| 国产巨乳在线观看| 亚洲欧美在线免费| 日日夜夜天天综合入口| 国产精品中文字幕在线| 日韩母乳在线| 国产成人永久免费视频| 美腿丝袜在线亚洲一区| 成人网站免费观看| 伊人色综合久久天天| 成人黄色免费网| 国产视频在线观看一区二区| 日本精品600av| 国产综合在线观看视频| 猛男gaygay欧美视频| 日韩成人三级视频| 国内精品久久久久影院色| 在线观看日本中文字幕| 午夜精品久久久久久久蜜桃app| 国产人妖一区二区三区| 中文字幕一精品亚洲无线一区 | 亚洲国产91| 精品国产鲁一鲁一区二区三区| 国产女主播在线一区二区| 91九色丨porny丨肉丝| 精品国产一区二区三区忘忧草 | 欧美一区电影| 无码少妇一区二区三区芒果| 99久久精品国产精品久久| 玖玖爱免费视频| 日韩欧美成人午夜| 麻豆传媒在线完整视频| 国产精品99久久久久久久久久久久| 国产精品毛片av| 男的插女的下面视频| 国产高清在线观看免费不卡| 亚洲熟女www一区二区三区| 91麻豆精品国产自产在线观看一区 | av爱爱亚洲一区| 日本亚洲欧美在线| 精品国产一区二区三区久久影院| 在线heyzo| 99re在线观看| 狠狠色丁香久久综合频道| 国产精品日日摸夜夜爽| 亚洲综合一区二区精品导航| 性生交生活影碟片| 久久久免费观看视频| 国产精品流白浆在线观看| 精品视频在线观看一区| 99久久国产免费看| 五月婷婷视频在线| 亚洲欧美日韩精品久久亚洲区| 亚洲天堂资源| 午夜精品区一区二区三| 麻豆专区一区二区三区四区五区| www.xx日本| 日韩美一区二区三区| 538视频在线| 你懂的网址一区二区三区| 国产欧美短视频| 朝桐光av一区二区三区| 色综合色狠狠天天综合色| 超碰国产在线| 亚洲jizzjizz日本少妇| 亚洲视频福利| 亚洲精品视频久久久| 欧美日韩情趣电影| 中文字幕免费高清电视剧网站在线观看| 亚洲综合中文字幕68页| 国产精品日本欧美一区二区三区| 色欲av无码一区二区三区| 欧美影院精品一区| av大片在线| 好吊妞www.84com只有这里才有精品 | 性少妇videosexfreexxx片| 久久久久一本一区二区青青蜜月 | 中文字幕一区二区三区5566| 国产酒店精品激情| 欧美三日本三级少妇99| 日韩中文字在线| 伦理一区二区三区| 手机看片一级片| 亚洲高清在线精品| av在线1区2区| 成人午夜影院在线观看| 视频一区视频二区中文字幕| 五月天色婷婷丁香| 亚洲国产免费av| 激情欧美一区二区三区黑长吊| 日本中文字幕在线视频观看| 国产午夜久久久久| 超碰福利在线观看| 国产精品jizz在线观看麻豆| 欧美日韩ab| 亚洲图片第一页| 亚洲国产成人av在线| 日韩成人综合网站| 免费成人在线视频网站| 亚洲精品视频在线看| 国产日本在线观看| 国产一区二区三区奇米久涩 |