国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Jenkins 基于 Kubernetes 的動態和靜態節點

云計算 云原生
既然要基于 Kubernetes 來做 CI/CD,我們這里最好還是將 Jenkins 安裝到 Kubernetes 集群當中,安裝的方式也很多,我們這里仍然還是使用手動的方式,這樣可以了解更多細節。

提到基于 Kubernetes 的 CI/CD,可以使用的工具有很多,比如 Jenkins、Gitlab CI、Drone 之類的,我們這里會使用大家最為熟悉的 Jenkins 來做 CI/CD 的工具。

安裝

既然要基于 Kubernetes 來做 CI/CD,我們這里最好還是將 Jenkins 安裝到 Kubernetes 集群當中,安裝的方式也很多,我們這里仍然還是使用手動的方式,這樣可以了解更多細節,對應的資源清單文件如下所示:

# jenkins.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-local
  labels:
    app: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  storageClassName: local-storage
  local:
    path: /data/k8s/jenkins
  persistentVolumeReclaimPolicy: Retain
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - node2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
  namespace: kube-ops
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: kube-ops
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jenkins
rules:
  - apiGroups: ["extensions", "apps"]
    resources: ["deployments", "ingresses"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
  - apiGroups: [""]
    resources: ["pods/log", "events"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins
  namespace: kube-ops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins
    namespace: kube-ops
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: kube-ops
spec:
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccount: jenkins
      initContainers:
        - name: fix-permissions
          image: busybox:1.35.0
          command: ["sh", "-c", "chown -R 1000:1000 /var/jenkins_home"]
          securityContext:
            privileged: true
          volumeMounts:
            - name: jenkinshome
              mountPath: /var/jenkins_home
      containers:
        - name: jenkins
          image: jenkins/jenkins:lts-jdk11
          imagePullPolicy: IfNotPresent
          env:
            - name: JAVA_OPTS
              value: -Dhudson.model.DownloadService.noSignatureCheck=true
          ports:
            - containerPort: 8080
              name: web
              protocol: TCP
            - containerPort: 50000
              name: agent
              protocol: TCP
          readinessProbe:
            httpGet:
              path: /login
              port: 8080
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 12
          volumeMounts:
            - name: jenkinshome
              mountPath: /var/jenkins_home
      volumes:
        - name: jenkinshome
          persistentVolumeClaim:
            claimName: jenkins-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: kube-ops
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  ports:
    - name: web
      port: 8080
      targetPort: web
    - name: agent
      port: 50000
      targetPort: agent
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins
  namespace: kube-ops
spec:
  ingressClassName: nginx
  rules:
    - host: jenkins.k8s.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: jenkins
                port:
                  name: web

我們這里使用 jenkins/jenkins:lts-jdk11 鏡像,這是 jenkins 官方的 Docker 鏡像,然后也有一些環境變量,當然我們也可以根據自己的需求來定制一個鏡像,比如我們可以將一些插件打包在自定義的鏡像當中,可以參考文檔:https://github.com/jenkinsci/docker,我們這里使用默認的官方鏡像就行,另外一個還需要注意的數據的持久化,將容器的 /var/jenkins_home 目錄持久化即可,我們這里使用的是 Local PV 的方式。

由于我們這里使用的鏡像內部運行的用戶 uid=1000,所以我們這里掛載出來后會出現權限問題,為解決這個問題,我們同樣還是用一個簡單的 initContainer 來修改下我們掛載的數據目錄。

另外由于 jenkens 會對 update-center.json 做簽名校驗安全檢查,這里我們需要先提前關閉,否則下面更改插件源可能會失敗,通過配置環境變量 JAVA_OPTS=-Dhudson.model.DownloadService.noSignatureCheck=true 即可。

另外我們這里還需要使用到一個擁有相關權限的 serviceAccount:jenkins,我們這里只是給 jenkins 賦予了一些必要的權限,當然如果你對 serviceAccount 的權限不是很熟悉的話,我們給這個 sa 綁定一個 cluster-admin 的集群角色權限也是可以的,當然這樣具有一定的安全風險。最后就是通過 Ingress 來暴露我們的服務,這個比較簡單。

我們直接來創建 jenkins 的資源清單即可:

$ kubectl apply -f jenkins.yaml
$ kubectl get pods -n kube-ops -l app=jenkins
NAME                       READY   STATUS    RESTARTS   AGE
jenkins-55c4676f4d-fhmw2   1/1     Running   0          3m5s
$ kubectl logs -f jenkins-55c4676f4d-fhmw2 -n kube-ops
Running from: /usr/share/jenkins/jenkins.war
webroot: /var/jenkins_home/war
# ......
2023-09-07 06:56:26.123+0000 [id=33]    INFO    jenkins.install.SetupWizard#init:

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

278e9dcdcab04d11ae671f7f81f517ba

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

2023-09-07 06:56:38.572+0000 [id=29]    INFO    jenkins.InitReactorRunner$1#onAttained: Completed initialization
2023-09-07 06:56:38.583+0000 [id=23]    INFO    hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
2023-09-07 06:57:02.555+0000 [id=49]    INFO    h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2023-09-07 06:57:02.556+0000 [id=49]    INFO    hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1

看到上面的 run: Jenkins is fully up and running 信息就證明我們的 Jenkins 應用以前啟動起來了。

然后我們可以通過 Ingress 中定義的域名 jenkins.k8s.local(需要做 DNS 解析或者在本地 /etc/hosts 中添加映射)來訪問 jenkins 服務:

jenkins unlock

然后可以執行下面的命令獲取解鎖的管理員密碼:

$ kubectl exec -it jenkins-55c4676f4d-fhmw2 -n kube-ops -- cat /var/jenkins_home/secrets/initialAdminPassword
278e9dcdcab04d11ae671f7f81f517ba   # jenkins啟動日志里面也有

然后跳過插件安裝,選擇默認安裝插件過程會非常慢(也可以選擇安裝推薦的插件),點擊右上角關閉選擇插件。

ignore plugin install

跳過后會直接進入 Jenkins 就緒頁面,直接點擊開始使用即可:

jenkins ready

然后就可以進入 Jenkins 主頁了。

Jenkins Home

首先安裝中文插件(如果想要中文界面的話),搜索 Localization: Chinese:

Localization: Chinese

安裝重啟完成后,會自動跳轉到登錄頁面:

Jenkins Login

這里還是使用 admin 和前面的初始密碼進行登錄。然后可以進入用戶管理頁面 http://jenkins.k8s.local/user/admin/configure 修改用戶密碼:

修改密碼

然后就可以使用新的密碼登錄了。

接下來我們可以安裝其他需要的插件,比如 Pipeline 插件。Pipeline 是 Jenkins 的一個核心插件,它定義了一套 DSL 語言,可以用來編寫 Pipeline 腳本,這個腳本可以實現從代碼構建到部署的整個流程。在使用 Pipeline 類型的項目時,需要提前安裝 Jenkins 的 Pipeline 插件。

pipeline plugin

安裝好插件后新建一個 Pipeline 類型的作業:

新建作業

自由風格項目和 Pipeline 類型的項目區別是,構建部分的操作都是在頁面上面完成的。Pipeline 的構建任務描述都是通過代碼的方式。

hello

保存后我們可以點擊立即構建執行這個任務,也可以查看這個任務的執行結果輸出:

執行結果

架構

Jenkins 安裝完成了,接下來我們不用急著就去使用,我們要了解下在 Kubernetes 環境下面使用 Jenkins 有什么好處。

我們知道持續構建與發布是我們日常工作中必不可少的一個步驟,目前大多公司都采用 Jenkins 集群來搭建符合需求的 CI/CD 流程,然而傳統的 Jenkins Slave 一主多從方式會存在一些痛點,比如:

  • 主 Master 發生單點故障時,整個流程都不可用了
  • 每個 Slave 的配置環境不一樣,來完成不同語言的編譯打包等操作,但是這些差異化的配置導致管理起來非常不方便,維護起來也是比較費勁
  • 資源分配不均衡,有的 Slave 要運行的 job 出現排隊等待,而有的 Slave 處于空閑狀態
  • 資源有浪費,每臺 Slave 可能是物理機或者虛擬機,當 Slave 處于空閑狀態時,也不會完全釋放掉資源。

正因為上面的這些種種痛點,我們渴望一種更高效更可靠的方式來完成這個 CI/CD 流程,而 Docker 虛擬化容器技術能很好的解決這個痛點,又特別是在 Kubernetes 集群環境下面能夠更好來解決上面的問題,下圖是基于 Kubernetes 搭建 Jenkins 集群的簡單示意圖:

k8s jenkins slave

從圖上可以看到 Jenkins Master 和 Jenkins Slave 以 Pod 形式運行在 Kubernetes 集群的 Node 上,Master 運行在其中一個節點,并且將其配置數據存儲到一個 Volume 上去,Slave 運行在各個節點上,并且它不是一直處于運行狀態,它會按照需求動態的創建并自動刪除。

這種方式的工作流程大致為:當 Jenkins Master 接受到 Build 請求時,會根據配置的 Label 動態創建一個運行在 Pod 中的 Jenkins Slave 并注冊到 Master 上,當運行完 Job 后,這個 Slave 會被注銷并且這個 Pod 也會自動刪除,恢復到最初狀態。

那么我們使用這種方式帶來了哪些好處呢?

  • 服務高可用,當 Jenkins Master 出現故障時,Kubernetes 會自動創建一個新的 Jenkins Master 容器,并且將 Volume 分配給新創建的容器,保證數據不丟失,從而達到集群服務高可用。
  • 動態伸縮,合理使用資源,每次運行 Job 時,會自動創建一個 Jenkins Slave,Job 完成后,Slave 自動注銷并刪除容器,資源自動釋放,而且 Kubernetes 會根據每個資源的使用情況,動態分配 Slave 到空閑的節點上創建,降低出現因某節點資源利用率高,還排隊等待在該節點的情況。
  • 擴展性好,當 Kubernetes 集群的資源嚴重不足而導致 Job 排隊等待時,可以很容易的添加一個 Kubernetes Node 到集群中,從而實現擴展。 是不是以前我們面臨的種種問題在 Kubernetes 集群環境下面是不是都沒有了啊?看上去非常完美。

Agent 節點

雖然我們上面提到了動態節點的好處,但是還是會有一部分人比較喜歡堅持靜態節點的方式,選擇靜態或者動態的 Jenkins Agent 節點都是可以的。接下來我們就分別來介紹下如何在 Kubernetes 集群中為 Jenkins 提供動靜態 Agent 節點。

靜態節點

首先在 Jenkins 頁面 http://jenkins.k8s.local/computer/new 新建一個節點:

新建節點

點擊創建后配置節點信息,然后點擊保存:

配置節點

保存后我們可以看到節點已經創建成功了:

節點列表

然后點擊列表中的 agent1 名稱,進入節點詳情頁面,在詳情頁面我們將獲取到運行該節點的一些密鑰信息。

密鑰信息

然后創建一個如下所示的資源清單文件:

# jenkins-agent.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-agent
  namespace: kube-ops
spec:
  selector:
    matchLabels:
      app: jenkins-agent
  template:
    metadata:
      labels:
        app: jenkins-agent
    spec:
      containers:
        - name: agent
          image: jenkins/inbound-agent
          securityContext:
            privileged: true
          imagePullPolicy: IfNotPresent
          env:
            - name: JENKINS_URL
              value: http://jenkins.k8s.local
            - name: JENKINS_SECRET
              value: 9c4c5159b111083705eed5802ceb021cfad002a18dd59c692aa59a9616e6285a
            - name: JENKINS_AGENT_NAME
              value: agent1
            - name: JENKINS_AGENT_WORKDIR
              value: /home/jenkins/workspace

上面的清單文件中的 JENKINS_URL、JENKINS_SECRET 和 JENKINS_AGENT_WORKDIR 這些環境變量的值就是上面我們在節點詳情頁面獲取到的信息,然后我們將這個文件應用到集群中:

$ kubectl apply -f jenkins-agent.yaml

創建后正常該 agent 的 Pod 會啟動報錯,錯誤日志如下所示:

INFO: Locating server among [http://jenkins.k8s.local/]
Sep 07, 2023 7:55:51 AM hudson.remoting.jnlp.Main$CuiListener error
SEVERE: Failed to connect to http://jenkins.k8s.local/tcpSlaveAgentListener/: jenkins.k8s.local
java.io.IOException: Failed to connect to http://jenkins.k8s.local/tcpSlaveAgentListener/: jenkins.k8s.local
        at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:216)
        at hudson.remoting.Engine.innerRun(Engine.java:760)
        at hudson.remoting.Engine.run(Engine.java:543)
Caused by: java.net.UnknownHostException: jenkins.k8s.local
        at java.base/java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.base/java.net.Socket.connect(Unknown Source)
        at java.base/sun.net.NetworkClient.doConnect(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.openServer(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.openServer(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.<init>(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.New(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.New(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
        at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:213)
        ... 2 more

這其實是因為我們配置的 jenkins.k8s.local 域名是一個自定義的域名,需要在 K8s 集群中解析的話,我們還需要在 CoreDNS 中去添加一條 hosts 映射:

$ kubectl edit cm coredns -n kube-system

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        hosts {
          10.206.16.10 jenkins.k8s.local
          fallthrough
        }
#  ......
kind: ConfigMap

但其實還有更簡單的方式,那就是直接將 JENKINS_URL 值替換為 Jenkins 的 Service 地址 http://jenkins.kube-ops.svc.cluster.local:8080 即可,這樣就不需要在 CoreDNS 中添加 hosts 映射了。

正常現在的 Jenkins Agent Pod 應該是正常運行的,我們可以通過下面的命令查看:

$ kubectl get pods -n kube-ops -l app=jenkins-agent
NAME                             READY   STATUS    RESTARTS   AGE
jenkins-agent-76884cd44c-dd9ds   1/1     Running   0          2m32s

再次查看節點列表,我們可以看到節點已經在線了:

agent

接下來我們再創建一個 Pipeline 類型的作業,然后在 Pipeline 腳本中添加下面的內容:

流水線

這里我們定義的流水線腳本中,我們使用到了 agent 關鍵字,這個關鍵字的作用就是指定這個流水線的運行環境,這里我們指定的是 build 這個標簽,也就是我們上面創建的 agent1 這個節點,這樣這個流水線就會在這個節點上運行。

點擊保存后,我們可以點擊立即構建來執行這個流水線,然后我們可以查看這個流水線的執行結果:

執行結果

這樣我們就可以在 Jenkins 中使用這個靜態節點來構建任務了。

動態節點

除了靜態節點之外,我們還可以使用動態節點的方式來構建任務,這樣可以更好的利用資源,我們這里使用的是 Kubernetes 的方式來創建動態節點,這樣我們就可以在 Jenkins 中使用動態節點來構建任務了。

第 1 步. 首先需要安裝 Kubernetes 插件。

kubernetes plugin

第 2 步. 安裝完畢后,進入 http://jenkins.k8s.local/manage/cloud/ 頁面:

new kubernetes plugin config

在該頁面點擊 New cloud 新建一個 Cloud 服務:

kubernetes plugin config

這里注意一定要選擇上 Kubernetes 這個 Type,然后點擊 Create 按鈕,然后我們就可以看到下面的配置頁面了:

create cloud

首先,配置連接 Kubernetes APIServer 的地址,由于我們的 Jenkins 運行在 Kubernetes 集群中,所以可以使用 Service 的 DNS 形式進行連接 https://kubernetes.default.svc.cluster.local:

jenkins k8s apiserver

命名空間這里填 kube-ops,然后點擊 連接測試,如果出現 Connected to Kubernetes v1.26.2 這樣的提示信息證明 Jenkins 已經可以和 Kubernetes 系統正常通信了。

然后下方的 Jenkins URL 地址為 http://jenkins.kube-ops.svc.cluster.local:8080,根據上面創建的 jenkins 的服務名填寫,包括下面的 Jenkins 通道,默認是 50000 端口(要注意是 TCP,所以不要填寫 http):

jenkins url

然后點擊最后的 save 按鈕保存配置。到這里我們的 Kubernetes 插件就算配置完成了。

測試

Kubernetes 插件的配置工作完成了,接下來我們就來添加一個 Job 任務,看是否能夠在 Slave Pod 中執行,任務執行完成后看 Pod 是否會被銷毀。

在 Jenkins 首頁點擊 新建任務,創建一個測試的任務,同樣還是選擇 Pipeline 類型的任務,這次我們需要使用的流水線腳本就更復雜了,如下所示:

pipeline{
    agent{
        kubernetes{
            label "test01"
            cloud 'Kubernetes'
            yaml '''
---
kind: Pod
apiVersion: v1
metadata:
  labels:
    k8s-app: jenkins-agent
  name: jenkins-agent
  namespace: kube-ops
spec:
containers:
  - name: jenkinsagent
    image: jenkins/inbound-agent
    imagePullPolicy: IfNotPresent
'''
        }
    }

    stages{
        stage("Hello"){
          steps{
            script{
              echo "Hello Slave Pod on Kubernetes!"
            }
          }
        }
    }
}

這次的腳本中定義的執行 agent 就比較復雜了,通過一個 kubernetes 屬性來指定這個流水線的運行環境,然后通過 yaml 屬性來定義這個運行 Pod 的清單文件,這里我們定義的是一個簡單的 Pod,然后我們將這個 Pod 部署到 kube-ops 這個命名空間中,這樣我們就可以在這個 Pod 中運行我們的 Jenkins Slave 了,需要注意 cloud 后面的值需要和前面我們定義的 Cloud 服務名稱一致。

最后點擊保存,同樣我們可以點擊左側的 立即構建 來執行這個任務,然后我們可以查看這個任務的執行結果:

slave pod execute command

雖然我們在這里的腳本中定義的 Pod 非常簡單,但可以看到 Jenkins 會幫我們配置一些默認的環境變量。當任務執行的過程中我們也可以觀察 Kubernetes 集群中的 Pod 變化:

$ kubectl get pods -n kube-ops -w
NAME                              READY   STATUS        RESTARTS      AGE
jenkins-55c4676f4d-fhmw2          1/1     Running       3 (12m ago)   91m
jenkins-agent-76884cd44c-dd9ds    1/1     Running       0             22m
test01-jnzmb-ht0n7                0/1     Pending       0             0s
test01-jnzmb-ht0n7                0/1     Pending       0             0s
test01-jnzmb-ht0n7                0/1     ContainerCreating   0             0s
test01-jnzmb-ht0n7                1/1     Running             0             1s
test01-jnzmb-ht0n7                1/1     Terminating         0             3s
test01-jnzmb-ht0n7                0/1     Terminating         0             4s
test01-jnzmb-ht0n7                0/1     Terminating         0             4s
test01-jnzmb-ht0n7                0/1     Terminating         0             4s

我們可以看到在我們點擊立刻構建的時候可以看到一個新的 Pod:test01-jnzmb-ht0n7 被創建了,這就是我們的 Jenkins Slave。當任務構建完抽這個 Slave Pod 也會自動刪除。

到這里,我們就完成了使用 Kubernetes 動態生成 Jenkins Slave 的方法。

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

2010-03-04 10:17:57

Linux動態庫

2021-04-22 06:15:59

Linux靜態鏈接動態庫

2017-05-27 09:58:42

BGP動態靜態

2021-02-26 08:37:47

KubernetesDocker

2009-08-28 14:09:19

C#靜態類

2021-09-13 07:53:30

安全

2020-10-29 09:56:23

Linux靜態庫動態庫

2019-10-17 21:14:08

Kubernetes節點Python

2022-10-17 10:35:34

DevOpsCICD

2023-02-10 10:54:48

DevOpsCICD

2019-10-09 09:53:10

Kubernetes服務器Linux

2022-04-15 15:56:30

云原生容器

2022-05-02 18:21:46

JenkinsKubernetesDevOps

2021-03-04 08:14:37

Java8開發接口

2015-07-17 10:25:43

kubernetesDocker集群系統

2020-04-09 15:23:19

Kubernetes發布系統集群

2021-06-05 06:52:16

Kubernetes

2015-07-07 10:00:39

2009-12-02 14:46:44

靜態路由動態路由

2015-03-03 13:28:21

實例動態網頁靜態緩存
點贊
收藏

51CTO技術棧公眾號

午夜在线视频观看日韩17c| 亚洲欧美日韩久久| 一区二区三区小说| 久久久久久午夜| 91精品在线麻豆| 99在线影院| 日本国产在线| 男人天堂v视频| 久久av资源| 亚洲1区2区3区视频| 日本电影亚洲天堂| 中文字幕校园春色| 97在线精品| 欧美日韩国产精品成人| 久久久久久欧美精品色一二三四| 最新国产在线观看| 久久国产精品99国产| 欧美不卡一区二区三区| 日韩中文字幕av在线| 第一中文字幕在线| 91美女在线观看| 久久久久国色av免费观看性色 | 国产成人亚洲综合无码| 天天综合网天天| 国产精品午夜在线| 91探花福利精品国产自产在线| 国产露出视频在线观看| 妖精视频成人观看www| 亚洲国产成人久久综合一区| 女同性恋一区二区| 老汉色老汉首页av亚洲| 狠狠色狠狠色综合日日小说| 国内外成人免费视频| 欧美成人一区在线观看| 99福利在线观看| 深夜福利一区二区三区| 成人欧美一区二区三区白人| 91精品国产99| 中文字幕免费在线视频| 亚洲午夜伦理| 日韩美一区二区三区| 欧美一区二区三区四区在线观看地址 | 国产一区二区精品久久91| 日韩中文第一页| 日本夜爽爽一二区| 亚洲欧美日本国产专区一区| 欧美激情论坛| av国产精品| 欧美性色黄大片| 中国一区二区三区| 国产剧情在线观看一区| 欧美一区二区三区婷婷月色| 国产黄色一级网站| 亚洲高清电影| 精品久久久久久久久久久久久久久| 国产美女福利在线| 欧美激情一区三区| 中文字幕乱码一区二区三区| 国产精品自在欧美一区| 国产精品一区二区三区久久久| 欧美性猛片xxxxx免费中国| 国产精品欧美久久久久无广告| 久久精彩视频| 黄网站免费久久| 国产裸体写真av一区二区| 亚洲精品123区| 国产妇女馒头高清泬20p多| 偷拍亚洲色图| 亚洲国产免费av| 日韩日韩日韩日韩| 91精品国产色综合久久不卡蜜臀| 成人性教育av免费网址| 91国产视频在线观看| 国产福利一区视频| 久久丁香综合五月国产三级网站| 国产精品香蕉国产| 日韩av成人高清| 亚洲最大av在线| 欧美女v视频| 国产日产精品1区| 欧美女优在线| 视频在线观看99| 在线中文字幕亚洲| 69av在线播放| 久久久久综合| 91久久嫩草影院一区二区| 免费av成人在线| 国产乱子伦精品| 欧美人与牛zoz0性行为| 中文字幕一区综合| 五月天精品一区二区三区| 成人免费在线观看视频网站| 免费人成在线不卡| 五月婷婷之综合激情| 8v天堂国产在线一区二区| 视频一区中文字幕精品| 欧美久久久久久| 亚洲一区二区黄色| 特黄特色特刺激视频免费播放| 日韩免费看网站| 日韩综合网站| 国产精品爱久久久久久久| 激情久久99| 亚洲剧情一区二区| 涩涩涩在线视频| 亚洲国产精品久久久| 国产影视精品一区二区三区| 国产三级中文字幕| 欧美精品第1页| 国产私拍精品| 欧美肥老妇视频| 亚洲不卡视频| 一本二本三本亚洲码| 激情欧美一区二区| 欧美91精品久久久久国产性生爱| 欧美日韩国产第一页| 电影一区二区在线观看| 欧美激情小视频| 国内精品久久久久影院一蜜桃| 可以直接在线观看的av| 久久久久久高潮国产精品视| 日产欧产美韩系列久久99| 天堂av在线资源| 欧美视频在线一区| 特黄特色欧美大片| 乱妇乱女熟妇熟女网站| 欧美日韩高清一区二区不卡| 成人短片线上看| 亚洲精品女av网站| 亚洲理论在线观看| 久久99国产精品久久99大师| 又大又硬又爽免费视频| 欧美国产成人在线| 亚洲成人精品综合在线| 69av在线视频| 成人免费毛片片v| 欧美少妇性生活视频| 亚洲精品中文在线影院| 一区视频网站| 99国产盗摄| 天天影视网天天综合色在线播放 | 综合操久久久| 亚洲黄色在线观看| 精品影视av免费| 天堂中文在线播放| 欧美老妇交乱视频| www久久精品| 999久久久久久久久6666| 国产精品免费视频久久久| 9国产精品视频| 麻豆传媒在线免费| xvideos国产精品| 久久国产综合| 久香视频在线观看| 国产乱码精品一区二区三区中文 | 精品久久久久久中文字幕一区奶水| 精品国产乱码久久久| 精品亚洲欧美日韩| 国产一区二区福利视频| sis001欧美| 无码人妻丰满熟妇区五十路百度| 欧美激情性做爰免费视频| 亚洲午夜私人影院| 亚洲女同在线| 欧美三级电影网址| 特级全黄一级毛片| 国产三区精品| 在线视频一区二区| 午夜亚洲福利| 欧美日韩亚洲一区二区三区在线观看 | 97精品国产综合久久久动漫日韩 | 欧美超级乱淫片喷水| 欧美a级在线| 婷婷在线视频| 久久999免费视频| 亚洲欧洲综合另类| 激情开心成人网| 国产精品视频内| 欧美性色欧美a在线播放| 国产精品影视在线| 久久精品论坛| 1769在线观看| 国产成人在线免费看| 成人精品久久一区二区三区| 国产99久久久精品| 国产精品四虎| 亚洲v欧美v另类v综合v日韩v| 亚洲男同1069视频| 精品91久久久久| 欧美亚洲大片| 人成在线免费视频| 日韩一级性生活片| 亚洲999一在线观看www| 一区二区成人av| 奇米精品一区二区三区四区 | 日本国产一区| 成人免费一区二区三区视频网站| 欧美在线视频免费播放| 欧美一区二区三区日韩视频| 26uuu色噜噜精品一区|