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

国产欧美一区二区精品秋霞影院| 在线观看的日韩av| 777亚洲妇女| 成年人深夜视频| 青青色在线视频| 秋霞电影网一区二区| 欧美另类在线观看| 国产国语性生话播放| **国产精品| 黄色精品一区二区| 伊人久久大香线蕉综合75| 免费观看黄色一级视频| 蜜臀91精品一区二区三区| 欧美国产精品日韩| 女人十八毛片嫩草av| 亚洲日本va午夜在线电影| 色婷婷综合中文久久一本| 可以免费看的黄色网址| 黄色av网址在线免费观看| 国产一区999| 国产精品嫩草影院久久久| 久久视频免费在线观看| 天天做天天爱天天爽综合网| 精品夜色国产国偷在线| 在线播放国产视频| 国产激情欧美| 欧美体内谢she精2性欧美| 99中文字幕在线观看| 岛国在线大片| 337p粉嫩大胆色噜噜噜噜亚洲| 91成人在线看| 在线观看国产精品入口男同| 蜜桃久久av| 久久久在线观看| 91嫩草|国产丨精品入口| 欧美精品羞羞答答| 精品一区二区三区四区| 欧美一级片在线免费观看| 日韩成人一区| 欧美图区在线视频| 国产麻花豆剧传媒精品mv在线| h片视频在线观看| 欧美激情一区二区三区蜜桃视频| 久久精品综合一区| 免费观看成年人视频| 国产电影一区二区三区| 成人乱人伦精品视频在线观看| 欧美超碰在线观看| 久久成人精品| 日本一区二区不卡| 黄色在线免费观看| 性欧美xxxx大乳国产app| 97超级碰碰人国产在线观看| 男人天堂中文字幕| 亚洲黄色成人| 8x海外华人永久免费日韩内陆视频 | 精品少妇一区二区三区免费观看| 午夜精品免费看| 96sao精品免费视频观看| 制服丝袜国产精品| 亚洲自拍第三页| 色妞ww精品视频7777| 欧美成人三级电影在线| 911亚洲精选| 成人在线视频你懂的| 亚洲а∨天堂久久精品喷水| 在线看黄色的网站| 精品国产影院| 国产丝袜精品第一页| 一级黄色片大全| 国产一区二区三区日韩精品 | 国产精品国产精品国产专区蜜臀ah| av无码精品一区二区三区宅噜噜| 国产精品一区免费视频| 91香蕉视频在线下载| 色婷婷av一区二区三区之红樱桃 | 美日韩一区二区| 成人免费在线网址| 国产夫妻性生活视频| 成人国产亚洲欧美成人综合网| 精品国产一二| 波多野结衣在线影院| 亚洲情趣在线观看| 国产黄色片免费在线观看| 亚洲日本天堂| 777奇米四色成人影色区| youjizz.com国产| 精品国产aⅴ| 中文字幕欧美精品在线| 欧美成人精品欧美一级| 久久大逼视频| 97伦理在线四区| 国产在线91| 亚洲精品第1页| 国产一区二区三区精彩视频| 欧美综合影院| 亚洲精品www久久久久久广东| 性欧美精品男男| 国产精品mm| 国产精品激情av在线播放| www.激情五月| 日本一区二区动态图| 中文字幕人妻熟女人妻洋洋| 日韩不卡视频在线观看| 精品噜噜噜噜久久久久久久久试看| 亚洲av综合一区二区| 欧美激情性爽国产精品17p| 日韩av免费在线播放| www.桃色av嫩草.com| 亚洲国产精品成人综合| 青青青青草视频| 高清一区二区中文字幕| 亚洲网站在线观看| 久久精品99久久久久久| 老色鬼精品视频在线观看播放| 国产一区二区无遮挡| av中文字幕在线观看| 欧美中文字幕一区二区三区亚洲| 国内自拍偷拍视频| 国产精品久久天天影视| 日韩免费在线看| 亚洲乱码在线观看| 专区另类欧美日韩| 欧美性猛交xxx乱久交| 欧美性生活一级片| 极品少妇xxxx偷拍精品少妇| 国产97免费视| 人妻无码中文字幕免费视频蜜桃| 国产精品久久久久aaaa樱花| 日韩毛片在线免费看| 成人在线视频中文字幕| 精品中文字幕在线2019| 91麻豆国产在线| 亚洲国产精品激情在线观看| 天天摸天天碰天天添| 精品按摩偷拍| 久久久久在线观看| 亚洲免费国产视频| 亚洲国产精品久久人人爱| 日韩视频在线观看一区二区三区| 成人激情电影在线| 日韩美女视频免费看| 亚洲AV成人无码一二三区在线| 一区二区三区日韩欧美| xxxx国产视频| 欧美视频在线观看| 岛国一区二区三区高清视频| 日本片在线观看| 日韩精品专区在线| 免费一级全黄少妇性色生活片| 国产资源在线一区| 中国一级黄色录像| 日韩欧美中文字幕一区二区三区 | 精品久久久久久乱码天堂| 激情av在线播放| 精品美女一区二区| 日本少妇bbwbbw精品| 成人午夜电影久久影院| 18禁网站免费无遮挡无码中文| 高潮久久久久久久久久久久久久 | 久久久国产精华液999999| 亚洲黑人在线| 九九久久精品一区| 日本人妻熟妇久久久久久 | 国产黄页在线观看| 国产精品自拍区| 国产热re99久久6国产精品| 欧美成人视屏| 日韩美一区二区三区| 男人天堂中文字幕| 国产人妖乱国产精品人妖| 在线观看免费的av| 欧美激情aⅴ一区二区三区| 国产伦精品一区二区三区照片91| 中文在线资源| 中文字幕亚洲欧美日韩高清| 99久久免费国产精精品| 亚洲国产日日夜夜| 毛茸茸多毛bbb毛多视频| 秋霞影院一区二区| 欧美黄色免费网址| 亚洲理论电影| 成人免费福利视频| 成人观看网址| 丝袜亚洲另类欧美重口| 精品国产乱码久久久久久蜜臀网站| 亚洲成人自拍一区| av网在线播放| 高清av一区二区| 国产天堂在线播放| 自拍欧美日韩| 日韩精品在在线一区二区中文 | 国产一区二区三区四区五区加勒比| 成人性生活视频| 久久精品国产一区二区三区| 天天综合天天综合| 欧美精品xxxxbbbb| 自拍偷拍欧美亚洲| 日韩理论片网站| 女同毛片一区二区三区| 国产精品主播直播| 欧美性猛交久久久乱大交小说| 欧美激情日韩| 亚洲精品中文字幕在线 | 亚洲精品xxxx| 国产剧情精品在线| 91极品视觉盛宴| 中文在线观看免费网站| 成人欧美一区二区三区白人| 国产福利短视频| 国产一区二区不卡| 最新中文字幕免费视频| 99riav1国产精品视频| 超碰在线免费观看97| 精品精品99| 久久久一本精品99久久精品| 免费一区二区三区在线视频| 国产精品露脸av在线| 鲁鲁在线中文| 欧美精品久久久久久久久| 麻豆传媒视频在线| 日韩成人高清在线| 丰满人妻一区二区三区免费| 欧美精品国产精品| 中文字幕第99页| 色综合一区二区三区| www.av视频在线观看| 亚洲欧美色图小说| 久久精品亚洲a| 国产精品视频线看| 国产精品国产三级国产专业不| 91视频一区二区三区| 妖精视频一区二区| 丁香亚洲综合激情啪啪综合| 91精产国品一二三产区别沈先生| 蜜臀av性久久久久蜜臀aⅴ| 国产熟女高潮视频| 午夜在线视频观看日韩17c| 日韩精品 欧美| 99精品国产福利在线观看免费| 国产欧美久久久久| 国产综合网站| 久青草视频在线播放| 国产精品www.| 给我免费播放片在线观看| 国产一在线精品一区在线观看| 久久国产精品免费观看| 一区二区三区午夜视频| 亚洲天堂第一区| 欧美精品二区| 欧美一级免费播放| 中文日韩在线| 国产成人无码一二三区视频| 久久精品人人做人人爽电影蜜月| 国产精品免费入口| 久久三级视频| 日本不卡一区二区在线观看| 久久精品国产一区二区| 亚洲天堂av一区二区| 国产美女久久久久| 国产探花一区二区三区| 成人一二三区视频| 中文字幕在线播放视频| 久久久蜜桃精品| 久久久国产一级片| 亚洲欧美日韩国产成人精品影院| 欧美片一区二区| 精品毛片网大全| 波多野结衣高清视频| 欧美日韩高清一区二区三区| 国产三区在线播放| 欧美精品一区二区三区蜜桃| 蜜桃视频在线免费| 日韩视频第一页| 6699嫩草久久久精品影院| 5566日本婷婷色中文字幕97| a成人v在线| 99精品欧美一区二区三区| 全球av集中精品导航福利| 热舞福利精品大尺度视频| 7777久久香蕉成人影院| 2018国产在线| 久草在线在线精品观看| 国产69视频在线观看| 亚洲国产精品v| 黄色小视频在线免费看| 欧美吻胸吃奶大尺度电影| 超碰在线人人干| 亚洲一区二区久久| 羞羞电影在线观看www| 日韩av电影在线网| 精品视频国内| 茄子视频成人在线观看| 欧美国内亚洲| 精品久久久久久中文字幕2017| 国产精品77777| av电影网站在线观看| 亚洲午夜电影在线| 亚洲一级片免费看| 日韩久久精品电影| 在线不卡日本v二区707| 国产精品白丝jk喷水视频一区 | 欧美日韩免费看片| 97神马电影| 日本欧美肥老太交大片| 久艹视频在线免费观看| 国内精品视频一区二区三区八戒| 波多野结衣 在线| 亚洲一区二区三区视频在线播放| 中文字幕黄色av| 亚洲乱码av中文一区二区| 日韩成人伦理| 国产原创欧美精品| 欧美人妖在线| 久久久亚洲国产精品| 精品午夜一区二区三区在线观看| 四虎永久免费在线观看| 性做久久久久久| 精品国产伦一区二区三| 日韩在线观看免费高清| 国产精品黄色片| 欧美一区二区三区在线播放| 夜夜精品视频| 国产xxxxxxxxx| 一二三四社区欧美黄| 国产欧美久久久| 久久精品电影网站| 国产激情欧美| 亚洲精品一区二区毛豆| 日本怡春院一区二区| 国产sm调教视频| 日韩欧美在线中文字幕| 性猛交xxxx| 91av视频在线| 日本国产精品| 成年人观看网站| 91麻豆精品视频| 国产免费av一区| 亚洲欧美日韩中文视频| 亚洲一级少妇| 欧美福利精品| 久久综合伊人| 高清国产在线观看| 欧洲亚洲国产日韩| av影片在线看| 91精品久久久久久久久久久| 国产精品久久久久久久| 中文字幕日韩久久| 亚洲三级在线观看| 精品久久人妻av中文字幕| 欧美激情手机在线视频 | 国产一区在线不卡| 成人在线观看高清| 欧美成人精品二区三区99精品| 色呦呦在线免费观看| 国产日韩欧美一区二区| 亚洲影院免费| 精品手机在线视频| 欧美一区二区三区不卡| 日本无删减在线| 久久久久成人精品免费播放动漫| 欧美亚洲自偷自偷| 少妇一级黄色片| 91精品一区二区三区久久久久久| av大大超碰在线| 国产一区自拍视频| 日韩和的一区二区| 污污的视频在线免费观看| 欧美xingq一区二区| 一区二区三区四区日本视频| 亚洲欧美99| 国产精品亚洲成人| 综合激情网五月| 色偷偷888欧美精品久久久 | 欧美精品一区二区高清在线观看| 瑟瑟视频在线看| 亚洲日本欧美在线| 懂色av一区二区夜夜嗨| 婷婷激情五月网| 久久精品国亚洲| 女同一区二区三区| 日韩av片网站| 亚洲成人免费在线观看| 成人h小游戏| 国产精品三区四区| 日韩高清国产一区在线| 波多野结衣亚洲一区二区| 日韩理论片久久| 国产美女精品视频免费播放软件| 日韩日韩日韩日韩日韩| 国产精品毛片大码女人| 色香蕉在线视频| 成人夜晚看av| 久久久久国产精品午夜一区| 九九在线观看视频| 中文字幕av一区中文字幕天堂 | 久久久天堂国产精品| 久久精品亚洲乱码伦伦中文| 精品人妻一区二区三区麻豆91| 国产999精品久久久|