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

使用 Jenkins 與 KubeVela 實現(xiàn)應(yīng)用的持續(xù)交付

開發(fā) 前端
KubeVela 的 Apiserver 則是進(jìn)一步為開發(fā)者提供了使用 HTTP Request 直接操縱 Application 的途徑,使得開發(fā)者即使沒有 Kubernetes 的使用經(jīng)驗與集群訪問權(quán)限也可以輕松部署自己的應(yīng)用。接下來我們就以 Jenkins 為基礎(chǔ),結(jié)合 KubeVela 來實現(xiàn)一個簡單的應(yīng)用持續(xù)交付的流程。

KubeVela 打通了應(yīng)用與基礎(chǔ)設(shè)施之間的交付管控的壁壘,相較于原生的 Kubernetes 對象,KubeVela 的 Application 更好地簡化抽象了開發(fā)者需要關(guān)心的配置,將復(fù)雜的基礎(chǔ)設(shè)施能力及編排細(xì)節(jié)留給了平臺工程師。而 KubeVela 的 apiserver 則是進(jìn)一步為開發(fā)者提供了使用 HTTP Request 直接操縱 Application 的途徑,使得開發(fā)者即使沒有 Kubernetes 的使用經(jīng)驗與集群訪問權(quán)限也可以輕松部署自己的應(yīng)用。

接下來我們就以 Jenkins 為基礎(chǔ),結(jié)合 KubeVela 來實現(xiàn)一個簡單的應(yīng)用持續(xù)交付的流程。

要實現(xiàn)一個簡單的應(yīng)用持續(xù)交付,我們需要做如下幾件事情:

  • 需要一個 git 倉庫來存放應(yīng)用程序代碼、測試代碼,以及描述 KubeVela Application 的 YAML 文件。
  • 需要一個持續(xù)集成的工具幫你自動化完成程序代碼的測試,并打包成鏡像上傳到倉庫中。
  • 需要在 Kubernetes 集群上安裝 KubeVela 并啟用 apiserver 功能。

我們這里的演示 Demo 采用 Github 作為 git 倉庫,Jenkins 作為 CI 工具,DockerHub 作為鏡像倉庫。應(yīng)用程序以一個簡單的 Golang HTTP Server 為例,整個持續(xù)交付的流程如下。

交付流程

從整個流程可以看出開發(fā)者只需要關(guān)心應(yīng)用的開發(fā)并使用 Git 進(jìn)行代碼版本的維護(hù),即可自動走完測試流程并部署應(yīng)用到 Kubernetes 集群中。

關(guān)于 Jenkins 在 Kubernetes 集群中的安裝配置前面我們已經(jīng)介紹過了,這里我們就不再贅述。

應(yīng)用配置

這里我們采用了 Github 作為代碼倉庫,倉庫地址為 https://github.com/cnych/KubeVela-demo-CICD-app,當(dāng)然也可以根據(jù)各自的需求與喜好,使用其他代碼倉庫,如 Gitlab。為了 Jenkins 能夠獲取到 GitHub 中的更新,并將流水線的運行狀態(tài)反饋回 GitHub,需要在 GitHub 中完成以下兩步操作。

配置 Personal Access Token。注意將 repo:status 勾選,以獲得向 GitHub 推送 Commit 狀態(tài)的權(quán)限,將生成的 Token 復(fù)制下來,下面會用到。

Personal Access Token

然后在 Jenkins 的 Credential 中加入 Secret Text 類型的 Credential 并將上述的 GitHub 的 Personal Access Token 填入。

jenkins-secret-text

接下來到 Jenkins 的 Dashboard > Manage Jenkins > Configure System > GitHub 中點擊 Add GitHub Server 并將剛才創(chuàng)建的 Credential 填入。完成后可以點擊 Test connection 來驗證配置是否正確。

Add GitHub Server

由于我們這里的 Jenkins 位于本地環(huán)境,要讓 GitHub 通過 Webhook 來觸發(fā) Jenkins,我們需要提供一個可訪問的地址,這里我們可以使用 ngrok 來實現(xiàn),首先前往 https://dashboard.ngrok.com 注冊一個賬號,將 Authtoken 和 APIKEY 記錄下來。

export NGROK_AUTHTOKEN=<your-ngrok-authtoken>
export NGROK_API_KEY=<your-ngrok-apikey>

然后我們可以在本地 Kubernetes 集群中安裝 ngrok ingress controller:

helm repo add ngrok https://ngrok.github.io/kubernetes-ingress-controller
# 使用下面命令安裝 ngrok ingress controller
helm install ngrok-ingress-controller ngrok/kubernetes-ingress-controller \
--namespace ngrok-ingress-controller \
--create-namespace \
--set credentials.apiKey=$NGROK_API_KEY \
--set credentials.authtoken=$NGROK_AUTHTOKEN

安裝完成后為 Jenkins 創(chuàng)建一個 ngrok 的 ingress 路由:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: jenkins-ngrok
 namespace: kube-ops
spec:
 ingressClassName: ngrok
 rules:
   - host: prompt-adjusted-sculpin.ngrok-free.app
     http:
       paths:
         - backend:
             service:
               name: jenkins
               port:
                 name: web
           path: /
           pathType: Prefix

上面的 host 域名是 ngrok 為我們分配的,你可以在 ngrok 的控制臺中手動創(chuàng)建,應(yīng)用上面的 ingress 對象后我們就可以通過 ngrok 為我們分配的域名來訪問 Jenkins 了。

ngrok jenkins

接下來我們就可以在 GitHub 的代碼倉庫的設(shè)定里添加 Webhook,將 Jenkins 的地址對應(yīng)的 Webhook 地址填入 <ngrok domain>/github-webhook/,這樣該代碼倉庫的所有 Push 事件推送到 Jenkins 中。

github webhook

編寫應(yīng)用

我們這里采用的應(yīng)用是一個基于 Golang 語言編寫的簡單的 HTTP Server。在代碼中,聲明了一個名叫 VERSION 的常量,并在訪問該服務(wù)時打印出來。同時還附帶一個簡單的測試,用來校驗 VERSION 的格式是否符合標(biāo)準(zhǔn)。

// main.go
package main

import (
    "fmt"
    "net/http"
)

const VERSION = "0.1.0-v1alpha1"

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        _, _ = fmt.Fprintf(w, "Version: %s\n", VERSION)
    })
    if err := http.ListenAndServe(":8088", nil); err != nil {
        println(err.Error())
    }
}

測試代碼如下所示:

// main_test.go

package main

import (
    "regexp"
    "testing"
)

const verRegex string = `^v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?` +
    `(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` +
    `(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?$`

func TestVersion(t *testing.T) {
    if ok, _ := regexp.MatchString(verRegex, VERSION); !ok {
        t.Fatalf("invalid version: %s", VERSION)
    }
}

在應(yīng)用交付時需要將 Golang 服務(wù)打包成鏡像并以 KubeVela Application 的形式發(fā)布到 Kubernetes 集群中,因此在代碼倉庫中還包含 Dockerfile 文件,用來描述鏡像的打包方式。

# Dockerfile
FROM golang:1.13-rc-alpine3.10 as builder
WORKDIR /app
COPY main.go .
RUN go build -o kubevela-demo-cicd-app main.go

FROM alpine:3.10
WORKDIR /app
COPY --from=builder /app/kubevela-demo-cicd-app /app/kubevela-demo-cicd-app
ENTRYPOINT ./kubevela-demo-cicd-app
EXPOSE 8088

配置 CI 流水線

在這里我們將包含兩條流水線,一條是用來進(jìn)行測試的流水線 (對應(yīng)用代碼運行測試) ,一條是交付流水線 (將應(yīng)用代碼打包上傳鏡像倉庫,同時更新目標(biāo)環(huán)境中的應(yīng)用,實現(xiàn)自動更新) 。

測試流水線

在 Jenkins 中創(chuàng)建一條新的名為 KubeVela-demo-CICD-app-test 的流水線:

測試流水線

然后配置構(gòu)建觸發(fā)器為 GitHub hook trigger for GITScm polling:

構(gòu)建觸發(fā)器

在這條流水線中,首先是采用了 golang 的鏡像作為執(zhí)行環(huán)境,方便后續(xù)運行測試。然后將分支配置為 GitHub 倉庫中的 dev 分支,代表該條流水線被 Push 事件觸發(fā)后會拉取 dev 分支上的內(nèi)容并執(zhí)行測試,測試結(jié)束后將流水線的狀態(tài)回寫至 GitHub 中。這里我們使用的是基于 Kubernetes 的動態(tài) Slave Agent,因此在流水線中需要配置 Kubernetes 的相關(guān)信息,包括 Kubernetes 的地址、Service Account 等。

void setBuildStatus(String message, String state) {
  step([
      $class: "GitHubCommitStatusSetter",
      reposSource: [$class: "ManuallyEnteredRepositorySource", url: "https://github.com/cnych/KubeVela-demo-CICD-app"],
      contextSource: [$class: "ManuallyEnteredCommitContextSource", context: "ci/jenkins/test-status"],
      errorHandlers: [[$class: "ChangingBuildStatusErrorHandler", result: "UNSTABLE"]],
      statusResultSource: [ $class: "ConditionalStatusResultSource", results: [[$class: "AnyBuildResult", message: message, state: state]] ]
  ]);
}

pipeline {
  agent {
    kubernetes {
      cloud 'Kubernetes'
      containerTemplate {
        name 'golang'
        image 'golang:1.13-rc-alpine3.10'
        command 'cat'
        ttyEnabled true
      }
      serviceAccount 'jenkins'
    }
  }

  stages {
    stage('Prepare') {
        steps {
            script {
                def checkout = git branch: 'dev', url: 'https://github.com/cnych/KubeVela-demo-CICD-app.git'
                env.GIT_COMMIT = checkout.GIT_COMMIT
                env.GIT_BRANCH = checkout.GIT_BRANCH
                echo "env.GIT_BRANCH=${env.GIT_BRANCH},env.GIT_COMMIT=${env.GIT_COMMIT}"
            }
            setBuildStatus("Test running", "PENDING");
        }
    }
    stage('Test') {
        steps {
          container('golang') {
            sh 'CGO_ENABLED=0 GOCACHE=$(pwd)/.cache go test *.go'
          }
        }
    }
  }

  post {
    success {
        setBuildStatus("Test success", "SUCCESS");
    }
    failure {
        setBuildStatus("Test failed", "FAILURE");
    }
  }
}

我們可以使用上面的代碼來執(zhí)行流水線:

測試流水線

部署流水線

類似測試流水線創(chuàng)建一個名為 KubeVela-demo-CICD-app-deploy 的部署流水線,首先將代碼倉庫中的分支拉取下來,區(qū)別是這里采用 prod 分支。然后使用 Docker 進(jìn)行鏡像構(gòu)建并推送至遠(yuǎn)端鏡像倉庫。構(gòu)建成功后,再將 Application 對應(yīng)的 YAML 文件轉(zhuǎn)換為 JSON 文件并注入 GIT_COMMIT,最后向 KubeVela apiserver 發(fā)送請求進(jìn)行創(chuàng)建或更新。

首先我們需要通過 VelaUX 來創(chuàng)建一個應(yīng)用,這里我們創(chuàng)建一個名為 kubevela-demo-app 的應(yīng)用,包含一個名為 kubevela-demo-app-web 的組件,組件類型為 webservice,并將組件的鏡像設(shè)置為 cnych/kubevela-demo-cicd-app,如下圖所示:

kubevela app

在應(yīng)用面板上,我們可以找到一個默認(rèn)的觸發(fā)器,點擊 手動觸發(fā),我們可以看到 Webhook URL 和 Curl Command,我們可以在 Jenkins 的流水線中使用任意一個。

觸發(fā)器

Webhook URL 是這個觸發(fā)器的觸發(fā)地址,在 Curl Command 里,還提供了手動 Curl 該觸發(fā)器的請求示例。我們來詳細(xì)解析一下請求體:

{
  // 必填,此次觸發(fā)的更新信息
  "upgrade": {
    // Key 為應(yīng)用的名稱
    "<application-name>": {
      // 需要更新的值,這里的內(nèi)容會被 Patch 更新到應(yīng)用上
      "image": "<image-name>"
    }
  },
  // 可選,此次觸發(fā)攜帶的代碼信息
  "codeInfo": {
    "commit": "<commit-id>",
    "branch": "<branch>",
    "user": "<user>"
  }
}

upgrade 下是本次觸發(fā)要攜帶的更新信息,在應(yīng)用名下,是需要被 Patch 更新的值。默認(rèn)推薦的是更新鏡像 image,也可以擴(kuò)展這里的字段來更新應(yīng)用的其他屬性。codeInfo 中是代碼信息,可以選擇性地攜帶,比如 commit ID、分支、提交者等,一般這些值可以通過在 CI 系統(tǒng)中使用變量替換來指定。

然后我們可以是部署流水線中使用上面的觸發(fā)器來部署應(yīng)用,的代碼如下所示:

void setBuildStatus(String message, String state) {
  step([
      $class: "GitHubCommitStatusSetter",
      reposSource: [$class: "ManuallyEnteredRepositorySource", url: "https://github.com/cnych/KubeVela-demo-CICD-app"],
      contextSource: [$class: "ManuallyEnteredCommitContextSource", context: "ci/jenkins/deploy-status"],
      errorHandlers: [[$class: "ChangingBuildStatusErrorHandler", result: "UNSTABLE"]],
      statusResultSource: [ $class: "ConditionalStatusResultSource", results: [[$class: "AnyBuildResult", message: message, state: state]] ]
  ]);
}
pipeline {
    agent {
      kubernetes {
        cloud 'Kubernetes'
        defaultContainer 'jnlp'
        yaml '''
        spec:
          serviceAccountName: jenkins
          containers:
          - name: golang
            image: golang:1.13-rc-alpine3.10
            command:
            - cat
            tty: true
          - name: docker
            image: docker:latest
            command:
            - cat
            tty: true
            env:
            - name: DOCKER_HOST
              value: tcp://docker-dind:2375
'''
      }
    }
    stages {
        stage('Prepare') {
            steps {
                script {
                    def checkout = git branch: 'prod', url: 'https://github.com/cnych/KubeVela-demo-CICD-app.git'
                    env.GIT_COMMIT = checkout.GIT_COMMIT
                    env.GIT_BRANCH = checkout.GIT_BRANCH
                    echo "env.GIT_BRANCH=${env.GIT_BRANCH},env.GIT_COMMIT=${env.GIT_COMMIT}"
                    setBuildStatus("Deploy running", "PENDING");
                }
            }
        }
        stage('Build') {
            steps {
              withCredentials([[$class: 'UsernamePasswordMultiBinding',
                  credentialsId: 'docker-auth',
                  usernameVariable: 'DOCKER_USER',
                  passwordVariable: 'DOCKER_PASSWORD']]) {
                  container('docker') {
                      sh """
                      docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWORD}
                      docker build -t cnych/kubevela-demo-cicd-app .
                      docker push cnych/kubevela-demo-cicd-app
                      """
                  }
              }
            }
        }
        stage('Deploy') {
            steps {
                sh '''#!/bin/bash
                    set -ex
                    curl -X POST -H 'content-type: application/json' --url http://vela.k8s.local/api/v1/webhook/x0i7t8jdsz2uvime -d '{"action":"execute","upgrade":{"kubevela-demo-app":{"image":"cnych/kubevela-demo-cicd-app"}},"codeInfo":{"commit":"","branch":"","user":""}}'
                '''
            }
        }
    }
    post {
        success {
            setBuildStatus("Deploy success", "SUCCESS");
        }
        failure {
            setBuildStatus("Deploy failed", "FAILURE");
        }
    }
}

測試效果

在完成上述的配置流程后,持續(xù)交付的流程便已經(jīng)搭建完成。我們可以來檢驗一下它的效果。

狀態(tài)

我們首先將 main.go 中的 VERSION 字段修改為 Bad Version Number,即:

const VERSION = "Bad Version Number"

然后提交該修改至 dev 分支,我們可以看到 Jenkins 上的測試流水線被觸發(fā)運行,失敗后將該狀態(tài)回寫給 GitHub。

ci test status

ci test github status

我們重新將 VERSION 修改為 0.1.1,然后再次提交。可以看到這一次測試流水線成功完成執(zhí)行,并在 GitHub 對應(yīng)的 Commit 上看到了成功的標(biāo)志。

ci test status

ci test github status

接下來我們在 GitHub 上提交 Pull Request 嘗試將 dev 分支上的更新合并至 prod 分支上。

PR

可以看到在 Jenkins 的部署流水線成功運行結(jié)束后,GitHub 上 prod 分支最新的 Commit 也顯示了成功的標(biāo)志。

ci test status

ci test github status

我們的應(yīng)用已經(jīng)成功部署了,當(dāng)前 Deployment 的副本數(shù)是 3,并且還有一個 Ingress 對象,這時我們可以訪問 Ingress 所配置的域名,成功顯示了當(dāng)前的版本號。

$ vela ls
APP                     COMPONENT               TYPE            TRAITS          PHASE   HEALTHY STATUS          CREATED-TIME
kubevela-demo-app       kubevela-demo-app       webservice      scaler,gateway  running healthy Ready:3/3       2023-10-14 19:11:59 +0800 CST
$ kubectl get pods
NAME                                     READY   STATUS    RESTARTS       AGE
kubevela-demo-app-675896596f-87kxl       1/1     Running   0              9m39s
kubevela-demo-app-675896596f-q5pvz       1/1     Running   0              9m39s
kubevela-demo-app-675896596f-v895m       1/1     Running   0              44m
$ kubectl get ingress
NAME                CLASS   HOSTS                              ADDRESS   PORTS   AGE
kubevela-demo-app   nginx   kubevela-demo-cicd-app.k8s.local             80      10m
$ curl -H "Host: kubevela-demo-cicd-app.k8s.local" http://<ingress controller address>
Version: 0.1.1

如果想實現(xiàn)金絲雀發(fā)布,則可以使用上節(jié)的 kruise rollout 來實現(xiàn),至此,我們便已經(jīng)成功實現(xiàn)了一整套持續(xù)交付流程。在這個流程中,應(yīng)用的開發(fā)者借助 KubeVela + Jenkins 的能力,可以輕松完成應(yīng)用的迭代更新、集成測試、自動發(fā)布與滾動升級,而整個流程在各個環(huán)節(jié)也可以按照開發(fā)者的喜好和條件選擇不同的工具,比如使用 Gitlab 替代 GitHub,或是使用 TravisCI 替代 Jenkins。

參考文檔:https://kubevela.io/docs/tutorials/jenkins/。

責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2025-01-07 00:00:15

Jenkins集成服務(wù)器

2023-10-27 07:36:36

2015-07-22 14:59:30

OpenStac持續(xù)集成持續(xù)交付

2017-08-18 08:27:27

Azure應(yīng)用服務(wù)

2021-07-14 13:46:28

KubeVela阿里云容器

2017-02-27 18:50:42

運維持續(xù)交付

2016-02-15 09:37:14

Docker持續(xù)交付應(yīng)用程序

2021-09-03 11:33:38

Jenkins 微服務(wù)集成

2017-02-27 18:28:45

持續(xù)交付部署

2018-10-23 16:35:19

華為云

2016-01-07 10:29:36

MesosDocker持續(xù)交付

2017-12-24 21:29:18

OpenShift持續(xù)交付集群

2020-09-21 08:57:25

持續(xù)交付

2023-03-14 16:35:52

2021-04-23 08:00:00

Kubernetes容器工具

2016-08-05 17:19:37

持續(xù)集成持續(xù)交付系統(tǒng)運維

2018-04-24 09:00:00

開發(fā)自動化軟件架構(gòu)

2017-02-27 18:35:23

集成交付部署

2021-01-18 14:51:34

JenkinsNginx前端

2017-10-19 09:47:55

容器化微服務(wù)集成
點贊
收藏

51CTO技術(shù)棧公眾號

免费在线观看av| 欧美黄色免费观看| 久久久久伊人| 亚洲日本乱码在线观看| 国产精品久久一区二区三区| 国产三级av片| 天天射天天综合网| 亚洲精品国精品久久99热一| 蜜臀视频一区二区三区| 永久免费网站在线| 欧美国产日韩亚洲一区| 亚洲专区中文字幕| 欧美一级黄视频| 狠狠干成人综合网| www国产精品视频| 成年人网站免费在线观看| 亚洲aⅴ网站| 岛国av一区二区三区| 国产成年人在线观看| 亚洲区小说区图片区| 国产美女一区二区| 国产精品igao视频| 国产亚洲精品久久久久久打不开| 日韩黄色大片| 亚洲精选在线观看| 国产51自产区| 久久在线观看| 欧美蜜桃一区二区三区| 男人舔女人下面高潮视频| 丰乳肥臀在线| 一区二区三区在线高清| 亚洲精品国产一区| 国产精品久久久久久久龚玥菲 | 午夜电影久久久| 99re99热| 免费日本一区二区三区视频| 国产亚洲污的网站| 国内一区在线| 国产小视频一区| 国产精品99精品久久免费| 国产精品免费视频久久久| 久久久国产精品成人免费| 国内精品久久久久国产盗摄免费观看完整版| 一区二区三区美女xx视频| 人妻少妇一区二区| 秋霞在线一区| 日韩电影中文 亚洲精品乱码| 日本人dh亚洲人ⅹxx| 青草综合视频| 欧美精品v日韩精品v韩国精品v| 日本美女高潮视频| 国产成+人+综合+亚洲欧美| 91九色02白丝porn| 婷婷六月天在线| 91福利精品在线观看| 欧美日韩激情一区二区三区| 天堂在线资源视频| 美女视频一区| 88在线观看91蜜桃国自产| 污污网站在线观看视频| 伊人久久一区| 欧美一级一区二区| 日本黄色三级网站| 国产精品115| 亚洲精品日韩久久久| 人妻少妇无码精品视频区| japanese国产精品| 久久视频在线免费观看| 免费在线观看av网址| 亚洲日本欧美| 国产成人av在线播放| 中文字幕av久久爽| 国产一区二区视频在线播放| av色综合网| 五月天福利视频| 国产欧美精品一区二区色综合朱莉| 日韩福利影院| 综合久久2019| 精品成人久久av| 男女视频在线看| 日韩欧美中文在线观看| 亚洲黄色有码视频| 欧美亚洲色综久久精品国产| 午夜欧美精品| 欧美亚洲视频一区二区| 中国精品一区二区| 国产大片一区二区| 欧美另类一区| 成人高清免费在线| 欧美性猛交xxxx黑人| www.日本一区| 国产96在线亚洲| 伊人一区二区三区久久精品| 免费一级肉体全黄毛片| 日日噜噜夜夜狠狠视频欧美人| 91精品中文在线| 头脑特工队2在线播放| 国产日产欧美一区| 久久香蕉视频网站| 国产成人精品一区二三区在线观看 | 成人免费看片'免费看| 亚洲妇女成熟| 日韩欧美一区二区不卡| 免费黄色片网站| 国产综合自拍| 91精品中国老女人| 黄色在线播放| 午夜精品久久久久久久久久久| 国产视频一区二区视频| 99a精品视频在线观看| 国产亚洲欧美aaaa| 亚欧视频在线观看| 国产精品99精品久久免费| 亚洲免费视频一区| 亚洲欧洲自拍| 亚洲第五色综合网| 午夜国产福利一区二区| 男男视频亚洲欧美| 麻豆亚洲一区| 国产精品午夜视频| 四虎影院在线播放| 亚洲在线视频免费观看| 色婷婷.com| 欧美综合视频| 777777777亚洲妇女| www.精品久久| 亚洲视频一区在线| 国产主播在线看| 国产精品调教| 久久91亚洲精品中文字幕| 在线观看中文字幕码| 久久久精品国产99久久精品芒果| 蜜臀精品一区二区| 亚洲精品在线a| 久久99国产精品自在自在app| 97精品久久人人爽人人爽| 99国产精品一区| 免费看黄在线看| 大香伊人久久精品一区二区| 欧美裸体男粗大视频在线观看| 亚洲天堂中文在线| 中文字幕一区二区三| the porn av| 欧美a级成人淫片免费看| 国产成人精品一区二区三区| 国产永久免费高清在线观看视频| 欧美视频一二三| 中文字幕成人动漫| 日本欧美久久久久免费播放网| 欧美日韩精品久久久免费观看| 欧美男人天堂| 亚洲欧美福利视频| 无码人妻熟妇av又粗又大| 国产偷国产偷精品高清尤物| 欧美激情国产精品日韩| 国产一区二区区别| 国产精品视频网| 国产激情视频在线| 日韩女优制服丝袜电影| 国产午夜精品无码| 99r国产精品| 国产视频在线视频| 日本在线电影一区二区三区| 国产欧美精品在线播放| av网站免费在线观看| 日韩一区二区在线观看视频播放| caoporn91| 波波电影院一区二区三区| 国产男女免费视频| 欧美日韩123| 国产精品视频不卡| 51xtv成人影院| 日韩电影免费在线观看中文字幕| 男人天堂2024| 亚洲欧洲日韩综合一区二区| 男人女人拔萝卜视频| 在线一区欧美| 亚洲欧洲日韩精品| xxxx日韩| 国产精品劲爆视频| 肉体视频在线| 亚洲欧美日韩久久久久久| 91av久久久| 香蕉久久一区二区不卡无毒影院 | 热久久天天拍国产| 亚洲一区久久久| 中文字幕人成乱码在线观看| 日韩有码在线电影| 天堂在线视频免费观看| 欧美日韩精品欧美日韩精品一| 久久久久久久久97| 中文天堂在线一区| 制服丝袜在线第一页| 日本中文字幕一区| 黄页网站大全在线观看| 日本道不卡免费一区| 国偷自产av一区二区三区小尤奈| 国产福利亚洲| 欧美在线视频网| 色呦呦呦在线观看| 中文字幕亚洲第一| 香蕉视频黄色片| 日韩三级av在线播放| 日韩精品在线一区二区三区| 亚洲午夜激情网页| 国产免费一区二区三区四区| 91农村精品一区二区在线| √天堂资源在线| 免费的成人av| 国内外成人免费激情视频| 午夜久久黄色| 亚洲第一综合网站| 欧美成人milf| 日本黑人久久| 亚洲警察之高压线| 国产一区二区三区四区hd| 日韩在线观看一区二区三区| 国产精品专区第二| 精品国产欧美日韩一区二区三区| 97视频在线观看亚洲| www免费视频观看在线| 中文字幕亚洲欧美日韩在线不卡| 日本不卡视频一区二区| 亚洲的天堂在线中文字幕| 精品人妻一区二区三区浪潮在线| 欧美日韩激情一区二区三区| 日韩国产成人在线| 欧美性xxxxx| 日韩 欧美 中文| 亚洲国产欧美一区二区三区丁香婷| 色欲人妻综合网| 中文字幕综合网| 天天操天天摸天天舔| 国产精品无圣光一区二区| 亚洲色成人网站www永久四虎| 99re6这里只有精品视频在线观看| 亚洲v在线观看| 成人性生交大片| 超级砰砰砰97免费观看最新一期| 卡一卡二国产精品| 亚洲va在线va天堂va偷拍| 美女视频免费一区| 91亚洲免费视频| 久久精品国产77777蜜臀| 特级丰满少妇一级| 另类调教123区| 天天综合网久久| 国产专区欧美精品| 一级黄色大片儿| 国产激情精品久久久第一区二区| 亚洲av毛片在线观看| 国产传媒日韩欧美成人| 黄色激情在线观看| 99久久99久久久精品齐齐| 成人网站免费观看| 久久女同精品一区二区| 女人十八毛片嫩草av| 国产精品第五页| 在线看的片片片免费| 一区二区三区在线不卡| 欧美日韩精品区| 色网综合在线观看| 中文字幕有码视频| 91精品免费在线观看| 丰满熟妇人妻中文字幕| 日韩精品视频在线免费观看| 人人九九精品| 自拍偷拍亚洲在线| 性欧美1819sex性高清大胸| 性色av一区二区三区| 日韩免费小视频| 91老司机精品视频| 牛牛影视一区二区三区免费看| 蜜桃传媒视频麻豆一区 | 大荫蒂性生交片| 亚洲在线播放| 亚洲午夜激情影院| 不卡一区在线观看| 日本乱子伦xxxx| 亚洲男人的天堂一区二区| 国产成人无码一区二区三区在线| 日韩欧美999| 国产精品免费无遮挡| 日韩av在线高清| 午夜视频在线观看网站| 国产+人+亚洲| 国产精品无码久久久久| 国产精品视频一区二区三区经| 国产精品片aa在线观看| 日本精品福利视频| 久久久久久亚洲精品杨幂换脸| 国产亚洲视频一区| 2020国产精品| 全网免费在线播放视频入口 | 最新国产の精品合集bt伙计| 国产第一页第二页| 精品婷婷伊人一区三区三| 亚洲欧美激情另类| 中文字幕日韩av综合精品| 91美女主播在线视频| 国产精品手机播放| 欧美亚洲大陆| 国产一二三四五| 日韩精品一级中文字幕精品视频免费观看| 搡的我好爽在线观看免费视频| xf在线a精品一区二区视频网站| 久久国产高清视频| 日本道免费精品一区二区三区| 亚洲精品久久久蜜桃动漫| 色悠悠久久88| 色婷婷综合久久久中字幕精品久久 | 国产精品333| 国产精品一区二区久久精品爱涩 | 五月婷婷久久久| 久久伊人精品一区二区三区| 欧美va在线| 欧洲精品一区色| 一区二区精品| 无码成人精品区在线观看| 亚洲青青青在线视频| 最近中文字幕免费在线观看| 日韩精品视频中文在线观看 | 午夜精品一区二区三区免费视频| 亚洲综合精品国产一区二区三区| 亚洲欧美在线一区| 色综合桃花网| 国产一区二区在线观看免费播放| 综合一区av| 制服丝袜中文字幕第一页| 亚洲国产精品精华液2区45| 国产成人在线视频观看| 亚洲国产精品久久久久秋霞蜜臀 | 国产精品久久久久久久av| 黑人巨大精品欧美一区免费视频| 黄色美女一级片| 欧美黑人狂野猛交老妇| 精品一区二区三区中文字幕在线 | 国产乱码精品一区二区三区av| 亚洲av毛片基地| 欧美亚州韩日在线看免费版国语版| 爽爽视频在线观看| 欧美有码在线观看| 欧美日韩123| 一区二区在线播放视频| 国产亚洲一区字幕| 性色av一区二区三区四区| 亚洲夜晚福利在线观看| 日韩精品麻豆| 一区二区三区欧美在线| 国内成人精品2018免费看| 国产va在线播放| 亚洲第一区第二区| 女厕盗摄一区二区三区| 久久综合福利| 秋霞国产午夜精品免费视频| 在线观看天堂av| 91精品国产综合久久久蜜臀图片| 成人免费视屏| 国产呦系列欧美呦日韩呦| 亚洲一区亚洲| 日韩女同一区二区三区| 欧美男男青年gay1069videost| а√天堂官网中文在线| 国产精品一区二区免费看| 一区二区动漫| 黄色国产在线播放| 日韩丝袜美女视频| 看黄在线观看| 亚洲电影网站| 国产精品亚洲视频| 成人免费视频毛片| 最近中文字幕2019免费| 欧美一区在线观看视频| 北条麻妃69av| 国产精品夫妻自拍| 国产成人手机在线| 国产精品成人国产乱一区| 亚洲欧洲日韩| 特级西西人体4444xxxx| 欧美性一区二区| 国产桃色电影在线播放| 欧美日韩电影一区二区| 激情综合网激情| 亚洲综合一二三| 日韩最新在线视频| 亚洲国产合集| 青娱乐国产精品视频| 色综合咪咪久久| 亚洲电影视频在线| 日韩电影天堂视频一区二区| 国产成人在线网站| 日韩不卡高清视频| 国内精品一区二区三区| 日韩亚洲一区在线| 久久人人爽人人人人片| 欧美一区二区视频在线观看 | 久久国产柳州莫菁门| 欧美一级理论片| 日韩制服诱惑| 欧美 日韩 亚洲 一区|