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

GitLab 觸發 Tekton 任務構建

云計算
前面我們都是通過創建一個 TaskRun 或者一個 PipelineRun 對象來觸發任務,但是在實際的工作中更多的是開發人員提交代碼過后來觸發任務,這個時候就需要用到 Tekton 里面的 Triggers 概念了。

[[407261]]

前面我們都是通過創建一個 TaskRun 或者一個 PipelineRun 對象來觸發任務,但是在實際的工作中更多的是開發人員提交代碼過后來觸發任務,這個時候就需要用到 Tekton 里面的 Triggers 概念了。

 

Tekton Triggers Workflow

Triggers 同樣通過下面的幾個 CRD 對象對 Tekton 進行了一些擴展:

  • TriggerTemplate: 創建資源的模板,比如用來創建 PipelineResource 和 PipelineRun
  • TriggerBinding: 校驗事件并提取相關字段屬性
  • ClusterTriggerBinding: 和 TriggerBinding 類似,只是是全局的
  • Interceptor: 處理事件以進行自定義驗證或過濾
  • EventListener: 連接 TriggerBinding 和 TriggerTemplate 到事件接收器,使用從各個 TriggerBinding 中提取的參數來創建 TriggerTemplate 中指定的 resources,同樣通過 interceptor 字段來指定外部服務對事件屬性進行預處理

同樣要使用 Tekton Triggers 就需要安裝對應的控制器,可以直接通過 tektoncd/triggers 的 GitHub 倉庫說明進行安裝,如下所示的命令(需要注意 v0.14.2 版本需要安裝兩個資源清單):

  1. kubectl apply --filename https://storage.googleapis.com/tekton-releases/triggers/previous/v0.14.2/release.yaml 
  2. kubectl apply -f https://storage.googleapis.com/tekton-releases/triggers/previous/v0.14.2/interceptors.yaml 

可以使用如下命令查看 Triggers 的相關組件安裝狀態,直到都為 Running 狀態:

  1. $ kubectl get pods --namespace tekton-pipelines 
  2. NAME                                                 READY   STATUS    RESTARTS   AGE 
  3. tekton-dashboard-6fcbd956f4-vvlrz                    1/1     Running   4          15d 
  4. tekton-pipelines-controller-795dd94d96-lkbxt         1/1     Running   5          17d 
  5. tekton-pipelines-webhook-6b8964445d-mp4k6            1/1     Running   5          17d 
  6. tekton-triggers-controller-989875ff7-tlc4v           1/1     Running   0          3h16m 
  7. tekton-triggers-core-interceptors-6494c8cfc4-hb8sk   1/1     Running   0          2m10s 
  8. tekton-triggers-webhook-787849d8db-ch28w             1/1     Running   0          3h16m 

現在我們來將前面的 Jenkins Pipeline 流水線轉換成使用 Tekton 來構建,代碼我們已經推送到了私有倉庫 GitLab,地址為:http://git.k8s.local/course/devops-demo.git。

首先我們需要完成觸發器的配置,當我們提交源代碼到 GitLab 的時候,需要觸發 Tekton 的任務運行,所以首先需要完成這個觸發器。這里就可以通過 EventListener 這個資源對象來完成,創建一個名為 gitlab-listener 的 EventListener 資源對象,文件內容如下所示:

  1. # gitlab-push-listener.yaml 
  2. apiVersion: triggers.tekton.dev/v1alpha1 
  3. kind: EventListener 
  4. metadata: 
  5.   name: gitlab-listener  # 該事件監聽器會創建一個名為el-gitlab-listener的Service對象 
  6. spec: 
  7.   serviceAccountName: tekton-triggers-gitlab-sa 
  8.   triggers: 
  9.   - name: gitlab-push-events-trigger 
  10.     interceptors: 
  11.     - ref: 
  12.         name: gitlab 
  13.       params: 
  14.       - name: secretRef  # 引用 gitlab-secret 的 Secret 對象中的 secretToken 的值 
  15.         value: 
  16.           secretName: gitlab-secret 
  17.           secretKey: secretToken 
  18.       - name: eventTypes 
  19.         value: 
  20.           - Push Hook # 只接收 GitLab Push 事件 
  21.     bindings: 
  22.     - ref: devops-demo-binding 
  23.     template: 
  24.       ref: devops-demo-template 

由于 EventListener 創建完成后會生成一個 Listener 的服務,用來對外暴露用于接收事件響應,比如上面我們創建的對象名為 gitlab-listener,創建完成后會生成一個名為 el-gitlab-listener 的 Service 對象,由于我們 GitLab 本身就在集群內部,所以我們用 Service 的 DNS 形式來訪問 EventListener 即可,如果你想暴露到集群外部則可以使用 NodePort 或者 Ingress 的形式。

另外需要注意的是在上面的 EventListener 對象中我們添加了 interceptors 屬性,其中有一個內置的 gitlab 攔截器,GitLab 攔截器包含驗證和過濾來自 GitLab 的請求邏輯, 比如我們可以配置 WebHook 的 Secret Token,可以通過 Secret 對象引入進來:

  1. interceptors: 
  2. - ref: 
  3.     name: gitlab 
  4.   params: 
  5.   - name: secretRef  # 引用 gitlab-secret 的 Secret 對象中的 secretToken 的值 
  6.     value: 
  7.       secretName: gitlab-secret 
  8.       secretKey: secretToken 
  9.   - name: eventTypes 
  10.     value: 
  11.       - Push Hook # 只接收 GitLab Push 事件 

對應的 Secret 資源對象如下所示,一個用于 WebHook 的 Secret Token,另外一個是用于 GitLab 登錄認證使用的:

  1. # gitlab-secret.yaml 
  2. apiVersion: v1 
  3. kind: Secret 
  4. metadata: 
  5.   name: gitlab-secret 
  6. type: Opaque 
  7. stringData: 
  8.   secretToken: '1234567' 
  9. --- 
  10. apiVersion: v1 
  11. kind: Secret 
  12. metadata: 
  13.   name: gitlab-auth 
  14.   annotations: 
  15.     tekton.dev/git-0: http://git.k8s.local 
  16. type: kubernetes.io/basic-auth 
  17. stringData: 
  18.   username: root 
  19.   password: admin321 

由于 EventListener 對象需要訪問其他資源對象,所以需要聲明 RBAC,如下所示:

  1. # event-listener-rbac.yaml 
  2. apiVersion: v1 
  3. kind: ServiceAccount 
  4. metadata: 
  5.   name: tekton-triggers-gitlab-sa 
  6. secrets: 
  7.   - name: gitlab-secret 
  8.   - name: gitlab-auth 
  9.   - name: harbor-auth 
  10. --- 
  11. apiVersion: rbac.authorization.k8s.io/v1 
  12. kind: Role 
  13. metadata: 
  14.   name: tekton-triggers-gitlab-minimal 
  15. rules: 
  16.   # EventListeners need to be able to fetch all namespaced resources 
  17.   - apiGroups: ['triggers.tekton.dev'
  18.     resources: 
  19.       ['eventlisteners''triggerbindings''triggertemplates''triggers'
  20.     verbs: ['get''list''watch'
  21.   - apiGroups: [''
  22.     # configmaps is needed for updating logging config 
  23.     resources: ['configmaps'
  24.     verbs: ['get''list''watch'
  25.   # Permissions to create resources in associated TriggerTemplates 
  26.   - apiGroups: ['tekton.dev'
  27.     resources: ['pipelineruns''pipelineresources''taskruns'
  28.     verbs: ['create'
  29.   - apiGroups: [''
  30.     resources: ['serviceaccounts'
  31.     verbs: ['impersonate'
  32.   - apiGroups: ['policy'
  33.     resources: ['podsecuritypolicies'
  34.     resourceNames: ['tekton-triggers'
  35.     verbs: ['use'
  36. --- 
  37. apiVersion: rbac.authorization.k8s.io/v1 
  38. kind: RoleBinding 
  39. metadata: 
  40.   name: tekton-triggers-gitlab-binding 
  41. subjects: 
  42.   - kind: ServiceAccount 
  43.     name: tekton-triggers-gitlab-sa 
  44. roleRef: 
  45.   apiGroup: rbac.authorization.k8s.io 
  46.   kind: Role 
  47.   name: tekton-triggers-gitlab-minimal 
  48. --- 
  49. kind: ClusterRole 
  50. apiVersion: rbac.authorization.k8s.io/v1 
  51. metadata: 
  52.   name: tekton-triggers-gitlab-clusterrole 
  53. rules: 
  54.   # EventListeners need to be able to fetch any clustertriggerbindings 
  55.   - apiGroups: ['triggers.tekton.dev'
  56.     resources: ['clustertriggerbindings''clusterinterceptors'
  57.     verbs: ['get''list''watch'
  58. --- 
  59. apiVersion: rbac.authorization.k8s.io/v1 
  60. kind: ClusterRoleBinding 
  61. metadata: 
  62.   name: tekton-triggers-gitlab-clusterbinding 
  63. subjects: 
  64.   - kind: ServiceAccount 
  65.     name: tekton-triggers-gitlab-sa 
  66.     namespace: default 
  67. roleRef: 
  68.   apiGroup: rbac.authorization.k8s.io 
  69.   kind: ClusterRole 
  70.   name: tekton-triggers-gitlab-clusterrole 

然后接下來就是最重要的 TriggerBinding 和 TriggerTemplate 對象了,我們在上面的 EventListener 對象中將兩個對象組合在一起:

  1. bindings: 
  2.   - ref: gitlab-push-binding # TriggerBinding 對象 
  3. template: 
  4.   ref: gitlab-echo-template # TriggerTemplate 對象 

這樣就可以將 TriggerBinding 中的參數傳遞到 TriggerTemplate 對象中進行模板化。比如這里我們定義一個如下所示的 TriggerBinding 對象:

  1. apiVersion: triggers.tekton.dev/v1alpha1 
  2. kind: TriggerBinding 
  3. metadata: 
  4.   name: devops-demo-binding 
  5. spec: 
  6.   params: 
  7.     - name: gitrevision 
  8.       value: $(body.checkout_sha) 
  9.     - name: gitrepositoryurl 
  10.       value: $(body.repository.git_http_url) 

這里需要注意的是參數的值我們是通過讀取 GitLab WebHook 發送過來的數據值,通過 $() 包裹的 JSONPath 表達式來提取的,關于表達式的更多用法可以查看官方文檔說明,至于能夠提取哪些參數值,則可以查看 WebHook 的說明,比如這里我們是 GitLab Webhook 的 Push Hook,對應的請求體數據如下所示:

  1.   "object_kind""push"
  2.   "before""95790bf891e76fee5e1747ab589903a6a1f80f22"
  3.   "after""da1560886d4f094c3e6c9ef40349f7d38b5d27d7"
  4.   "ref""refs/heads/master"
  5.   "checkout_sha""da1560886d4f094c3e6c9ef40349f7d38b5d27d7"
  6.   "user_id": 4, 
  7.   "user_name""John Smith"
  8.   "user_username""jsmith"
  9.   "user_email""john@example.com"
  10.   "user_avatar""https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80"
  11.   "project_id": 15, 
  12.   "project":{ 
  13.     "id": 15, 
  14.     "name":"Diaspora"
  15.     "description":""
  16.     "web_url":"http://example.com/mike/diaspora"
  17.     "avatar_url":null
  18.     "git_ssh_url":"git@example.com:mike/diaspora.git"
  19.     "git_http_url":"http://example.com/mike/diaspora.git"
  20.     "namespace":"Mike"
  21.     "visibility_level":0, 
  22.     "path_with_namespace":"mike/diaspora"
  23.     "default_branch":"master"
  24.     "homepage":"http://example.com/mike/diaspora"
  25.     "url":"git@example.com:mike/diaspora.git"
  26.     "ssh_url":"git@example.com:mike/diaspora.git"
  27.     "http_url":"http://example.com/mike/diaspora.git" 
  28.   }, 
  29.   "repository":{ 
  30.     "name""Diaspora"
  31.     "url""git@example.com:mike/diaspora.git"
  32.     "description"""
  33.     "homepage""http://example.com/mike/diaspora"
  34.     "git_http_url":"http://example.com/mike/diaspora.git"
  35.     "git_ssh_url":"git@example.com:mike/diaspora.git"
  36.     "visibility_level":0 
  37.   }, 
  38.   "commits": [ 
  39.     { 
  40.       "id""b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327"
  41.       "message""Update Catalan translation to e38cb41.\n\nSee https://gitlab.com/gitlab-org/gitlab for more information"
  42.       "title""Update Catalan translation to e38cb41."
  43.       "timestamp""2011-12-12T14:27:31+02:00"
  44.       "url""http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327"
  45.       "author": { 
  46.         "name""Jordi Mallach"
  47.         "email""jordi@softcatala.org" 
  48.       }, 
  49.       "added": ["CHANGELOG"], 
  50.       "modified": ["app/controller/application.rb"], 
  51.       "removed": [] 
  52.     }, 
  53.     { 
  54.       "id""da1560886d4f094c3e6c9ef40349f7d38b5d27d7"
  55.       "message""fixed readme"
  56.       "title""fixed readme"
  57.       "timestamp""2012-01-03T23:36:29+02:00"
  58.       "url""http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7"
  59.       "author": { 
  60.         "name""GitLab dev user"
  61.         "email""gitlabdev@dv6700.(none)" 
  62.       }, 
  63.       "added": ["CHANGELOG"], 
  64.       "modified": ["app/controller/application.rb"], 
  65.       "removed": [] 
  66.     } 
  67.   ], 
  68.   "total_commits_count": 4 

請求體中的任何屬性都可以提取出來,作為 TriggerBinding 的參數,如果是其他的 Hook 事件,對應的請求體結構可以查看 GitLab 文檔說明。

這樣我們就可以在 TriggerTemplate 對象中通過參數來讀取上面 TriggerBinding 中定義的參數值了,定義一個如下所示的 TriggerTemplate 對象,聲明一個 TaskRun 的模板,定義的 Task 任務也非常簡單,只需要在容器中打印出代碼的目錄結構即可:

  1. apiVersion: triggers.tekton.dev/v1alpha1 
  2. kind: TriggerTemplate 
  3. metadata: 
  4.   name: devops-demo-template 
  5. spec: 
  6.   params: # 定義參數,和 TriggerBinding 中的保持一致 
  7.     - name: gitrevision 
  8.     - name: gitrepositoryurl 
  9.   resourcetemplates: # 定義資源模板 
  10.     - apiVersion: tekton.dev/v1beta1 
  11.       kind: TaskRun # 定義 TaskRun 模板 
  12.       metadata: 
  13.         generateName: gitlab-run- # TaskRun 名稱前綴 
  14.       spec: 
  15.         serviceAccountName: tekton-triggers-gitlab-sa 
  16.         taskSpec: # Task 任務聲明 
  17.           resources: 
  18.             inputs: # 定義一個名為 source 的 git 輸入資源 
  19.               - name: source 
  20.                 type: git 
  21.           steps: 
  22.             - name: show-path 
  23.               image: ubuntu # 定義一個執行步驟,列出代碼目錄結構 
  24.               script: | 
  25.                 #! /bin/bash 
  26.                 ls -la $(resources.inputs.source.path) 
  27.         resources: # 聲明具體的輸入資源參數 
  28.           inputs: 
  29.             - name: source # 和 Task 中的資源名保持一直 
  30.               resourceSpec: # 資源聲明 
  31.                 type: git 
  32.                 params: 
  33.                   - name: revision 
  34.                     value: $(tt.params.gitrevision) # 讀取參數值 
  35.                   - name: url 
  36.                     value: $(tt.params.gitrepositoryurl) 

需要注意在最后的 pipelineresource 中引用參數值的時候使用了一個 tt 的前綴。定義完過后,直接創建上面的資源對象,創建完成后會自動生成 EventListener 的 Pod 和 Service 對象:

  1. $ kubectl get svc -l eventlistener=gitlab-listener 
  2. NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE 
  3. el-gitlab-listener   ClusterIP   10.108.146.82   <none>        8080/TCP   7m56s 
  4. $ kubectl get pod -l eventlistener=gitlab-listener 
  5. NAME                                  READY   STATUS    RESTARTS   AGE 
  6. el-gitlab-listener-6b84cc6d8f-ppfhp   1/1     Running   0          7m9s 
  7. $ kubectl get eventlistener 
  8. NAME              ADDRESS                                                    AVAILABLE   REASON                       READY   REASON 
  9. gitlab-listener   http://el-gitlab-listener.default.svc.cluster.local:8080   False       MinimumReplicasUnavailable   False 

接下來我們就可以到 GitLab 的項目中配置 WebHook,注意需要配置 Secret Token,我們在上面的 Secret 對象中聲明過:

 

Secret Token

創建完成后,我們可以測試下該 WebHook 的 Push events 事件,直接點擊測試即可(如果使用自定義的域名則需要在 coredns 中添加映射),正常會返回 Hook executed successfully: HTTP 202 的提示信息,這個時候在 Kubernetes 集群中就會出現如下所示的任務 Pod:

  1. $ kubectl get pods -l triggers.tekton.dev/eventlistener=gitlab-listener 
  2. NAME                         READY   STATUS      RESTARTS   AGE 
  3. gitlab-run-lnqzv-pod-lp8lw   0/2     Completed   0          3m18s 
  4. $ kubectl get taskrun -l triggers.tekton.dev/eventlistener=gitlab-listener 
  5. NAME               SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME 
  6. gitlab-run-lnqzv   True        Succeeded   3m11s       2m48s 
  7. $ tkn taskrun logs gitlab-run-lnqzv 
  8. [git-source-source-hfrw6] {"level":"info","ts":1624446684.0399015,"caller":"git/git.go:169","msg":"Successfully cloned http://git.k8s.local/course/devops-demo.git @ 581b1986b6c038ca98a362e6a0b8e9acb55893e8 (grafted, HEAD) in path /workspace/source"
  9. [git-source-source-hfrw6] {"level":"info","ts":1624446684.0660462,"caller":"git/git.go:207","msg":"Successfully initialized and updated submodules in path /workspace/source"
  10.  
  11. [show-path] total 36 
  12. [show-path] drwxr-xr-x 4 root root  163 Jun 23 11:11 . 
  13. [show-path] drwxrwxrwx 3 root root   20 Jun 23 11:11 .. 
  14. [show-path] -rw-r--r-- 1 root root 1804 Jun 23 11:11 .drone.yml 
  15. [show-path] drwxr-xr-x 8 root root  177 Jun 23 11:11 .git 
  16. [show-path] -rw-r--r-- 1 root root  192 Jun 23 11:11 .gitignore 
  17. [show-path] -rw-r--r-- 1 root root  375 Jun 23 11:11 Dockerfile 
  18. [show-path] -rw-r--r-- 1 root root 5101 Jun 23 11:11 Jenkinsfile 
  19. [show-path] -rw-r--r-- 1 root root  174 Jun 23 11:11 README.md 
  20. [show-path] -rw-r--r-- 1 root root   97 Jun 23 11:11 go.mod 
  21. [show-path] -rw-r--r-- 1 root root 3370 Jun 23 11:11 go.sum 
  22. [show-path] drwxr-xr-x 3 root root  101 Jun 23 11:11 helm 
  23. [show-path] -rw-r--r-- 1 root root  471 Jun 23 11:11 main.go 

到這里我們就完成了通過 GitLab 的 Push 事件來觸發 Tekton 的一個任務。

gitlab push events

接下來我們再來實現將我們的應用通過 Tekton 來自動部署到 Kubernetes 集群中。

 

責任編輯:姜華 來源: k8s技術圈
相關推薦

2021-04-27 22:32:01

TektonKubernetesCI

2022-04-14 07:51:39

TektonTaskRun

2022-04-25 08:07:45

TektonArgocdCI和CD

2022-03-21 09:40:48

TektonJenkinsPipeline

2022-08-11 16:29:32

Tekton流水線遷移工作流

2022-04-08 09:53:56

TektonJenkinsKubesphere

2022-06-02 10:18:24

函數計算異步

2023-01-03 10:38:04

函數計算技術

2023-04-18 08:17:11

GitLab持續集成

2021-06-28 14:13:35

Jenkins服務器程序

2023-08-18 10:24:52

GitLabCI 流水線

2022-07-27 07:39:45

Kubernetes云原生

2021-06-26 14:22:34

Tekton流水線Kubernetes

2011-02-25 10:02:04

ibmdwWebsphere

2021-06-28 06:32:46

Tekton Kubernetes Clone

2021-05-13 18:23:53

Tekton云原生Kubernetes

2021-07-09 06:40:59

TektonArgo CD GitOps

2022-04-01 10:51:33

TektonArgoCDGitOps

2025-06-03 08:15:00

微服務架構異步任務隊列

2017-03-13 09:12:00

TCP數據結構請求包
點贊
收藏

51CTO技術棧公眾號

欧美少妇xxxx| 自拍在线观看| 成人aa视频在线观看| 欧美在线视频a| 农村老熟妇乱子伦视频| 日韩一区二区三区色| 欧美日韩免费看| 在线精品日韩| 无码国产精品96久久久久| 日韩激情中文字幕| 久久久亚洲福利精品午夜| 久久久久亚洲av成人无码电影| 欧美成人免费全部网站| 亚洲成av人片在www色猫咪| 日韩女优中文字幕| 超碰福利在线观看| 免费视频最近日韩| 性色av一区二区三区红粉影视| 手机毛片在线观看| 丁香婷婷成人| 在线播放日韩导航| 熟女少妇精品一区二区| 成人福利电影| 中文字幕色av一区二区三区| 久久精品国产99精品国产亚洲性色| 97免费观看视频| 日韩成人伦理电影在线观看| 久久久久久一区二区三区| www.4hu95.com四虎| 欧美福利在线播放网址导航| 欧美一区二区三区四区视频| 狠狠躁狠狠躁视频专区| 在线免费三级电影网站| 亚洲一区电影777| 香蕉视频在线网址| 高清av在线| 久久色在线视频| 国内外成人免费视频| www久久久com| 国产一区二区三区综合| 国产精品入口日韩视频大尺度| 欧美精品二区三区| 激情国产一区| 欧美高清电影在线看| 欧美成人777| 国产精品精品国产一区二区| 在线精品高清中文字幕| 黄色片网站免费| 国产欧美久久一区二区三区| 亚洲女人被黑人巨大进入| 久久久久成人精品无码中文字幕| av不卡一区二区| 日韩精品一区二区三区视频播放| 亚洲精品乱码久久久久久动漫| 国产精品原创视频| 欧美日韩亚洲国产综合| 一起操在线视频| 亚洲伊人伊成久久人综合网| 69av一区二区三区| 性生活在线视频| 日韩欧美一级| 欧美精品一区二区三区蜜臀| 性囗交免费视频观看| 国产成人一二片| 亚洲国产欧美在线成人app | 日韩中文字幕亚洲精品欧美| huan性巨大欧美| 亚洲一区在线观看视频| 黄页网站大全在线观看| 漫画在线观看av| 日本精品一级二级| 99国产精品久久久久久| 欧美影院精品| 亚洲激情自拍图| 丰满少妇在线观看资源站| 精品理论电影| 欧美成人免费在线观看| 日本三级午夜理伦三级三| 国产模特精品视频久久久久| 国产精品mp4| 6—12呦国产精品| 丁香婷婷综合色啪| 欧美裸体网站| 成人在线播放| 性感美女极品91精品| 成人性做爰aaa片免费看不忠| 国产黄色精品| 日韩精品一区二区三区四区| 中文字幕一二三四区| 欧美疯狂party性派对| 色综合久久精品亚洲国产| 亚洲精品男人的天堂| 麻豆成人91精品二区三区| 97中文在线| 青梅竹马是消防员在线| 亚洲摸摸操操av| 久久久免费视频网站| 伊人久久一区| 日韩精品亚洲元码| 国产一二三四区| 亚洲制服av| 91色在线视频| 国产原创av在线| 亚洲一区在线观看视频| 在线观看国产中文字幕| 成人h动漫精品一区二区器材| 国产一区二区黑人欧美xxxx| 特级片在线观看| 日本欧美在线看| 国产一区二区中文字幕免费看| yjizz视频网站在线播放| 亚洲一区中文日韩| 国产又大又黄又粗又爽| 日韩欧美黄色| 美女av一区二区三区| 日韩精品一区二区亚洲av| 国产精品一区二区久激情瑜伽| 欧美一区观看| 91高清视频在线观看| 91精品国产入口在线| 五月天综合视频| 亚洲激情综合| 亚洲综合av影视| 老司机99精品99| 欧洲另类一二三四区| 第四色在线视频| 欧美精品网站| 亚洲va久久久噜噜噜| xxxxx日韩| 一本色道综合亚洲| 国产精品无码在线| 亚洲高清网站| 成人黄动漫网站免费| 欧美日韩视频在线播放| 欧美在线看片a免费观看| 自拍视频一区二区| 亚洲麻豆av| 国产尤物99| а√天堂中文在线资源8| 欧美一卡2卡三卡4卡5免费| 蜜桃av.com| 精品一二三四区| 亚洲午夜精品久久久久久浪潮| 26uuu亚洲电影| 亚洲欧美日韩中文在线| 五月天婷婷导航| 91热门视频在线观看| 看av免费毛片手机播放| 日韩超碰人人爽人人做人人添| 91国在线精品国内播放| 五月婷婷丁香六月| 日韩欧美在线视频观看| 美女脱光内衣内裤| 日韩av中文字幕一区二区| 日韩国产精品一区二区三区| 午夜欧美巨大性欧美巨大| 亚洲系列中文字幕| 亚洲一区精品在线观看| 亚洲同性同志一二三专区| 免费黄频在线观看| 悠悠资源网久久精品| 国产精品yjizz| 77thz桃花论族在线观看| 精品无人区太爽高潮在线播放 | 91精品国产综合久久精品app| 青青操在线视频观看| 国产剧情一区在线| 欧美成人三级在线视频| 亚洲69av| 国产日韩欧美在线看| 91精品久久久久久粉嫩| 精品sm捆绑视频| 亚洲黄网在线观看| 国产精品久久免费看| 国产成人精品一区二区三区在线观看 | 天堂在线免费观看视频| 国产丝袜欧美中文另类| 国产亚洲视频一区| 极品av少妇一区二区| 久久免费99精品久久久久久| 国外成人福利视频| 久热在线中文字幕色999舞| 免费av网站在线播放| 日本高清成人免费播放| 欧美老熟妇一区二区三区| 99久久伊人精品| 在线观看免费视频高清游戏推荐| 亚洲欧美综合| 欧美日韩三区四区| 精品中文字幕一区二区三区四区| 97成人超碰免| 成人在线观看亚洲| 亚洲色图欧美制服丝袜另类第一页| 国产女人18毛片18精品| 精品女同一区二区三区在线播放| 成年人在线免费看片| 国产成人99久久亚洲综合精品| 女人扒开屁股爽桶30分钟| 99久久久久| 免费在线国产精品| 日韩激情精品| 国产成人av网址| 免费看电影在线| 久久精品99久久香蕉国产色戒| 天天干,夜夜操| 欧美一区二区精品在线| 蜜臀99久久精品久久久久小说 | 国产免费区一区二区三视频免费| 55夜色66夜色国产精品视频| 麻豆av在线导航| 亚洲男人的天堂在线播放| 国产精品自拍电影| 一本久久综合亚洲鲁鲁五月天 | 91麻豆精品成人一区二区| 91丨九色丨蝌蚪丨老版| 男人的天堂免费| 久久99精品久久只有精品| 91视频最新入口| 国产一区亚洲| 最新av在线免费观看| 蜜桃a∨噜噜一区二区三区| 成人欧美一区二区三区视频| 亚洲国产aⅴ精品一区二区三区| 欧美一级视频免费在线观看| 欧美寡妇性猛交xxx免费| 久久精品夜夜夜夜夜久久| av在线电影网| 伊人久久五月天| 国产三级在线观看| 亚洲欧美中文在线视频| 无套内谢的新婚少妇国语播放| 欧美大片在线观看一区二区| av天堂一区二区三区| 欧美日产在线观看| 在线观看国产小视频| 在线免费不卡电影| 免费看污视频的网站| 欧美日韩中文字幕在线| 久久国产视频播放| 精品福利樱桃av导航| 一级aaa毛片| 亚洲观看高清完整版在线观看 | 色94色欧美sute亚洲线路一ni | 视频一区二区欧美| 国产午夜福利视频在线观看| 国产一区二区三区的电影| 女人天堂av手机在线| 亚洲免费激情| 欧美s码亚洲码精品m码| 国产亚洲高清视频| 逼特逼视频在线| 日日噜噜夜夜狠狠视频欧美人| av免费中文字幕| 日韩精品一级二级| 99视频在线视频| 九九精品视频在线看| 在线看免费毛片| 国产精品538一区二区在线| 色哟哟在线观看视频| 成人激情av网| 中文字幕免费视频| 国产精品高潮呻吟| 久热这里有精品| 性做久久久久久免费观看欧美| 久久国产视频播放| 欧美三区在线观看| 99久久一区二区| 亚洲精品久久久久久久久久久久久 | 人妖一区二区三区| 日韩久久久久久久久久久久久| 成人久久久久| 欧美一级爱爱视频| 一本色道久久综合亚洲精品不卡| 50路60路老熟妇啪啪| 久草这里只有精品视频| 欧美69精品久久久久久不卡| 99久久综合精品| 一二三四在线观看视频| 一区二区三区在线视频观看58| 日韩成人av毛片| 精品视频一区二区不卡| 精品人妻久久久久一区二区三区| 亚洲福利视频网| h视频在线免费| 欧美黑人国产人伦爽爽爽| 日韩pacopacomama| 亚洲影影院av| 国产免费av一区二区三区| 国内外成人激情免费视频| 9国产精品视频| 91视频这里只有精品| 99在线精品观看| 老司机深夜福利网站| 精品国产福利视频| 国产精品综合在线| 亚洲人在线观看| 图片区小说区亚洲| 国产精品一区二区久久久久| 福利欧美精品在线| 亚洲欧美日韩精品久久久| 亚洲美女啪啪| 女人扒开双腿让男人捅| 久久精品水蜜桃av综合天堂| 久草国产在线观看| 欧美性猛交xxxx乱大交退制版| 亚洲av无码乱码国产麻豆| 国产亚洲精品久久| av在线最新| 亚洲自拍偷拍一区| 水蜜桃久久夜色精品一区| av免费在线播放网站| 成人免费视频播放| 国产精品白丝喷水在线观看| 色婷婷久久99综合精品jk白丝| 粉嫩av一区二区夜夜嗨| 久久精品视频99| 九色成人搞黄网站| 久久久久天天天天| 亚洲国产免费看| 亚洲精品乱码久久久久久9色| 国产精品无人区| 波多野结衣午夜| 亚洲人在线视频| av日韩亚洲| 国内精品久久国产| 亚洲黄色一区| 国产艳妇疯狂做爰视频| 伊人婷婷欧美激情| 国产伦子伦对白视频| 中文字幕日韩电影| 亚洲va中文在线播放免费| 久久er99热精品一区二区三区 | 欧美一区亚洲一区| 97久久综合精品久久久综合| 先锋影音男人资源| 狠狠色综合播放一区二区| 婷婷丁香综合网| 欧美日韩在线播放三区四区| 国产二区在线播放| 国产精品久久久久av| 国产剧情一区| 欧美三级理论片| 欧美国产精品一区二区三区| 午夜精品免费观看| 在线观看久久久久久| 午夜无码国产理论在线| 日韩精品一区二区三区丰满| 日韩影院免费视频| 中国1级黄色片| 这里只有精品99re| 18网站在线观看| 国产精品久久波多野结衣| 日韩网站在线| 好吊日免费视频| 欧美性色欧美a在线播放| 3p在线观看| 亚洲xxx视频| 999久久久国产| 中文字幕欧美一| 国产成人精品av在线观| 欧美高清在线视频观看不卡| 爱高潮www亚洲精品| 久久久999免费视频| 久久视频一区二区| 中文字幕网址在线| 另类少妇人与禽zozz0性伦| heyzo欧美激情| www.av片| 国产欧美一区二区三区鸳鸯浴 | 免费成人av在线播放| 久久久久久久麻豆| 欧美va在线播放| 欧美xxx性| 免费观看中文字幕| a在线播放不卡| 国内av在线播放| 欧美理论电影在线观看| 午夜精品福利影院| 九色porny自拍| 亚洲1区2区3区4区| 成人三级黄色免费网站| 亚洲精品免费一区二区三区| 激情综合中文娱乐网| 亚洲av无码国产精品麻豆天美| 欧美精品在线观看播放| av资源中文在线| 亚洲精品一卡二卡三卡四卡| 成人网页在线观看| 亚洲精品国产精品国自产网站按摩| 精品自在线视频| 国产亚洲一区二区三区啪| 国偷自产av一区二区三区麻豆| 欧美日韩一区二区三区| 麻豆视频在线观看免费网站| 国产在线精品一区二区中文| 久草在线在线精品观看| 中文字幕av影院| 欧美人与性动交| 欧美一区三区| 五月开心播播网|