国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

利用 CRD 實現(xiàn)一個 mini-k8s-proxy

共 26133字,需瀏覽 53分鐘

 ·

2021-09-10 12:19

前言

進入正文前,需要熟悉以下幾個概念定義:

  • Custom Resources: 資源(Resource) 是 Kubernetes API 中的一個端點, 其中存儲的是某個類別的 API 對象(Objects)的一個集合。例如內置的 pods 資源包含一組 Pod 對象。定制資源(Custom Resources)是對 Kubernetes API 的擴展,可以動態(tài)的在集群內安裝刪除,對用戶而言,如同使用 pods 這種內置資源方式一樣,可以使用 kubectl 來創(chuàng)建和訪問定制資源里面的定制對象(Custom Objects)。

  • CustomResourceDefinition(CRD): CRD 定制資源定義是 Kubernetes 提供的向集群中添加定制資源(Custom Resources)的一種方式,允許用戶定義定制資源。

  • Custom Controllers: 定制資源只能存取結構化的數(shù)據(jù),而定制控制器(Custom Controllers)可以通過觀測分析將結構化的數(shù)據(jù)解釋為用戶所期望狀態(tài)的記錄,并持續(xù)地維護該狀態(tài)。它可以用于任何類別的資源,若定制資源與定制控制器相結合,定制資源就能夠提供真正的聲明式 API(Declarative API)。例如,Traefik 的 IngressRoute,apache apisix 的 apisix-ingress-controller ,以及本文接下來的示例等,都是通過編寫 CRD 創(chuàng)建定制資源 + 使用 k8s.io/code-generator 實現(xiàn)定制控制器完成的。

  • Operator: Operator 是 Kubernetes 的擴展軟件,可以理解為一種特殊的 Controller ,旨在捕獲(正在管理一個或一組服務的)運維人員的關鍵目標。原理和 Controller 一樣,都是通過編寫 CRD 創(chuàng)建定制資源然后監(jiān)聽 CRD 相關變化并作出響應。區(qū)別就在于 Operator 可能會結合原生的 Controller(Deployment/Replicas),或者 Kubernetes 的網(wǎng)絡,存儲等來控制應用程序的狀態(tài)。通俗點講就是,Operator 是一個功能更強大,封裝了對于特定應用程序的運維經(jīng)驗的 Controller 。例如,etcd operator,prometheus operator 等。

如果覺得上面的定義太枯燥了,那就由我來簡單的總結一遍吧:

  • Kubernetes 里面呢,有很多內置的資源,資源中包括對象,例如 pods 資源包含著一組 Pod 對象

  • Kubernetes 為了方便用戶,還允許用戶創(chuàng)建自定義資源,用戶創(chuàng)建出來的資源就取了個高大上的名字叫定制資源,同理,定制資源里有定制對象,例如 Traefik 里面的 ingressroutes 定制資源中包含著一組 IngressRoute 對象

  • 用戶想要創(chuàng)建定制資源,可以通過編寫 CustomResourceDefinition(CRD,定制資源定義)來實現(xiàn)

  • 用戶創(chuàng)建完定制資源后,還可以編寫代碼來監(jiān)聽資源的創(chuàng)建、刪除、更新動作,這就是一個 Controller 控制器了

  • 用戶編寫的控制器如果是專注于某個特定的應用程序,并賦予了特定的領域知識,就形成了一個 Operator

目標

實現(xiàn)一個可以通過配置 host 攔截到匹配的請求域名,將流量代理轉發(fā)到具體的 service 中(通過配置 serviceName,namespace,port,scheme)的極簡網(wǎng)絡代理工具。其中,配置通過 CRD 創(chuàng)建,代理程序可以通過控制器監(jiān)聽配置變化,動態(tài)更新,無需重啟。(PS:其實就是簡單模擬了 Traefik IngressRoute 的實現(xiàn))

創(chuàng)建 CRD

將下面的 CustomResourceDefinition 保存為 crd.yaml 文件

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # 名字必需與下面的 spec 字段匹配,并且格式為 '<名稱的復數(shù)形式>.<組名>'
  name: proxyroutes.miniproxy.togettoyou.com
spec:
  # 組名
  group: miniproxy.togettoyou.com
  names:
    # kind 通常是單數(shù)形式的駝峰編碼(CamelCased)形式。你的資源清單會使用這一形式。
    kind: ProxyRoute
    # shortNames 允許你在命令行使用較短的字符串來匹配資源
    shortNames:
      - pr
    # 名稱的復數(shù)形式,用于 URL:/apis/<組>/<版本>/<名稱的復數(shù)形式>
    plural: proxyroutes
    # 名稱的單數(shù)形式,作為命令行使用時和顯示時的別名
    singular: proxyroute
  # 可以是 Namespaced 或 Cluster
  scope: Namespaced
  # 列舉此 CustomResourceDefinition 所支持的版本
  versions:
    - name: v1alpha1
      # 每個版本都可以通過 served 標志來獨立啟用或禁止
      served: true
      # 其中一個且只有一個版本必需被標記為存儲版本
      storage: true
      # schema 是必需字段
      schema:
        # openAPIV3Schema 是用來檢查定制對象的模式定義
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                # 定義我們需要的幾個配置項
                host:
                  type: string
                serviceName:
                  type: string
                namespace:
                  type: string
                port:
                  type: integer
                scheme:
                  type: boolean

之后創(chuàng)建它:

kubectl apply -f crd.yaml

現(xiàn)在,就可以創(chuàng)建定制對象啦,將下面的 YAML 保存為 example.yaml

apiVersion: miniproxy.togettoyou.com/v1alpha1
kind: ProxyRoute
metadata:
  name: example-proxyroute
spec:
  # 監(jiān)聽域名
  host: whoami.togettoyou.com
  # 假設你有一個 whomai 的 service,位于 default 命名空間,容器內部端口為 80 ,http 協(xié)議
  serviceName: whoami
  namespace: default
  port: 80
  scheme: false

并執(zhí)行創(chuàng)建命令:

kubectl apply -f example.yaml

結合上文的定義介紹,復習一遍,在這里 proxyroutes 就是我們通過 CRD 創(chuàng)建的定制資源,其中包含著一組 ProxyRoute 對象。

現(xiàn)在可以使用 kubectl 來查看我們剛才創(chuàng)建的定制對象:

$ kubectl get proxyroute
NAME                 AGE
example-proxyroute   49s

$ kubectl get pr
NAME                 AGE
example-proxyroute   50s

實現(xiàn)控制器

創(chuàng)建項目目錄如下:

├─pkg
│  └─apis
│      └─miniproxy
│          └─v1alpha1
│              └─doc.go
│              └─register.go
│              └─types.go
│          └─register.go
├─script
│  └─boilerplate.go.txt
│  └─code-gen.sh
│  └─codegen.Dockerfile

doc.go 代碼:

// +k8s:deepcopy-gen=package
// +groupName=miniproxy.togettoyou.com

// Package v1alpha1 is the v1alpha1 version of the API.
package v1alpha1

register.go 代碼:

package v1alpha1

import (
 "mini-k8s-proxy/pkg/apis/miniproxy"

 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 "k8s.io/apimachinery/pkg/runtime"
 "k8s.io/apimachinery/pkg/runtime/schema"
)

// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: miniproxy.GroupName, Version: "v1alpha1"}

var (
 // SchemeBuilder initializes a scheme builder
 SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
 // AddToScheme is a global function that registers this API group & version to a scheme
 AddToScheme = SchemeBuilder.AddToScheme
)

// Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) schema.GroupKind {
 return SchemeGroupVersion.WithKind(kind).GroupKind()
}

// Resource takes an unqualified resource and returns a Group qualified GroupResource
func Resource(resource string) schema.GroupResource {
 return SchemeGroupVersion.WithResource(resource).GroupResource()
}

// Adds the list of known types to Scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
 scheme.AddKnownTypes(SchemeGroupVersion,
  // 主要在這里導入我們的定制資源對象
  &ProxyRoute{},
  &ProxyRouteList{},
 )
 metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
 return nil
}

types.go 代碼:

package v1alpha1

import (
 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// ProxyRoute is a specification for a ProxyRoute resource
type ProxyRoute struct {
 metav1.TypeMeta   `json:",inline"`
 metav1.ObjectMeta `json:"metadata,omitempty"`

 Spec ProxyRouteSpec `json:"spec"`
}

// ProxyRouteSpec is the spec for a ProxyRoute resource
type ProxyRouteSpec struct {
 Host        string `json:"host"`
 ServiceName string `json:"serviceName"`
 Namespace   string `json:"namespace,omitempty"`
 Port        int32  `json:"port,omitempty"`
 Scheme      bool   `json:"scheme,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// ProxyRouteList is a list of ProxyRoute resources
type ProxyRouteList struct {
 metav1.TypeMeta `json:",inline"`
 metav1.ListMeta `json:"metadata"`

 Items []ProxyRoute `json:"items"`
}

register.go 代碼:

package miniproxy

// GroupName is the group name used in this package
const (
 GroupName = "miniproxy.togettoyou.com"
)

代碼編寫完成后,就可以使用 k8s.io/code-generator 來生成控制器相關代碼了,腳本定義在 script 文件夾下,其中 boilerplate.go.txt 為生成的代碼頭部協(xié)議注釋,codegen.Dockerfile 內容為:

FROM golang:1.16

ARG KUBE_VERSION

ENV GO111MODULE=on
ENV GOPROXY https://goproxy.cn,direct

RUN go get k8s.io/code-generator@$KUBE_VERSIONexit 0
RUN go get k8s.io/apimachinery@$KUBE_VERSIONexit 0

RUN mkdir -p $GOPATH/src/k8s.io/{code-generator,apimachinery}
RUN cp -R $GOPATH/pkg/mod/k8s.io/code-generator@$KUBE_VERSION $GOPATH/src/k8s.io/code-generator
RUN cp -R $GOPATH/pkg/mod/k8s.io/apimachinery@$KUBE_VERSION $GOPATH/src/k8s.io/apimachinery
RUN chmod +x $GOPATH/src/k8s.io/code-generator/generate-groups.sh

WORKDIR $GOPATH/src/k8s.io/code-generator

code-gen.sh 腳本內容如下:

#!/bin/bash -e

set -e -o pipefail

PROJECT_MODULE="mini-k8s-proxy"
IMAGE_NAME="kubernetes-codegen:latest"

echo "Building codegen Docker image..."
docker build --build-arg KUBE_VERSION=v0.20.2 -f "./script/codegen.Dockerfile" \
            -t "${IMAGE_NAME}" \
            "."

cmd="/go/src/k8s.io/code-generator/generate-groups.sh all \
    ${PROJECT_MODULE}/pkg/generated \
    ${PROJECT_MODULE}/pkg/apis \
    miniproxy:v1alpha1 \
    --go-header-file=/go/src/${PROJECT_MODULE}/script/boilerplate.go.txt"


echo "Generating clientSet code ..."
docker run --rm \
           -v "$(pwd):/go/src/${PROJECT_MODULE}" \
           -w "/go/src/${PROJECT_MODULE}" \
           "${IMAGE_NAME}" $cmd

執(zhí)行腳本生成相關代碼:

$ ./script/code-gen.sh

......
Generating clientSet code ...
Generating deepcopy funcs
Generating clientset for miniproxy:v1alpha1 at mini-k8s-proxy/pkg/generated/clientset
Generating listers for miniproxy:v1alpha1 at mini-k8s-proxy/pkg/generated/listers
Generating informers for miniproxy:v1alpha1 at mini-k8s-proxy/pkg/generated/informers

實現(xiàn)業(yè)務邏輯

由于業(yè)務較簡單,我們直接在 main.go 完成業(yè)務邏輯,貼上代碼:

type ProxyRouteSpec struct {
 V map[string]v1alpha1.ProxyRouteSpec
 sync.RWMutex
}

var prs = &ProxyRouteSpec{
 V: make(map[string]v1alpha1.ProxyRouteSpec, 0),
}

type resourceEventHandler struct {
 Ev chan<- interface{}
}

func (reh *resourceEventHandler) OnAdd(obj interface{}) {
 eventHandlerFunc(reh.Ev, obj)
}

func (reh *resourceEventHandler) OnUpdate(oldObj, newObj interface{}) {
 eventHandlerFunc(reh.Ev, newObj)
}

func (reh *resourceEventHandler) OnDelete(obj interface{}) {
 eventHandlerFunc(reh.Ev, obj)
}

func eventHandlerFunc(events chan<- interface{}, obj interface{}) {
 select {
 case events <- obj:
 default:
 }
}

func main() {
 ctx := context.Background()

 eventCh := make(chan interface{}, 1)
 // 采用緩沖大小為 1 的通道方式來處理 CRD 事件
 eventHandler := &resourceEventHandler{Ev: eventCh}

 // 作為測試,可以直接使用 kubeconfig 連接 k8s,實際部署使用 InClusterConfig 模式
 //cfg, err := clientcmd.BuildConfigFromFlags("", "tmp/config")
 cfg, err := rest.InClusterConfig()
 if err != nil {
  panic(err)
 }
 client, err := clientset.NewForConfig(cfg)
 if err != nil {
  panic(err)
 }
 // 構建 k8s Crd Informer 實例
 factoryCrd := externalversions.NewSharedInformerFactoryWithOptions(
  client,
  10*time.Minute,
 )
 // 注冊 Informer 事件處理
 factoryCrd.Miniproxy().V1alpha1().ProxyRoutes().Informer().AddEventHandler(eventHandler)
 // 啟動 Informer
 factoryCrd.Start(ctx.Done())
 // 等待首次緩存同步
 for t, ok := range factoryCrd.WaitForCacheSync(ctx.Done()) {
  if !ok {
   panic(fmt.Errorf("timed out waiting for controller caches to sync %s", t.String()))
  }
 }
 go startServer()

 for {
  select {
  case _, ok := <-eventCh:
   if !ok {
    continue
   }
   // 從 Lister 緩存獲取 CRD 資源對象
   proxyRoutes, err := factoryCrd.Miniproxy().V1alpha1().ProxyRoutes().Lister().List(labels.Everything())
   if err != nil {
    log.Println(err.Error())
    continue
   }
   // 清空本地緩存并重新放入
   prs.Lock()
   prs.V = make(map[string]v1alpha1.ProxyRouteSpec, 0)
   for _, proxyRoute := range proxyRoutes {
    fmt.Printf("%+v\n", proxyRoute)
    prs.V[proxyRoute.Spec.Host] = proxyRoute.Spec
   }
   prs.Unlock()
  }
 }
}

原理比較粗暴,通過 Informer — Lister 機制監(jiān)聽 CRD 資源的變化,并將資源對象存入本地 map 緩存中。

繼續(xù)添加代理轉發(fā)邏輯:

func startServer() {
 gin.SetMode(gin.ReleaseMode)
 r := gin.Default()
 r.Any("/*any", handler)
 log.Fatalln(r.Run(":80"))
}

func handler(c *gin.Context) {
 prs.RLock()
 defer prs.RUnlock()
 if proxyRouteSpec, ok := prs.V[c.Request.Host]; ok {
  u := ""
  if proxyRouteSpec.Scheme {
   u += "https://"
  } else {
   u += "http://"
  }
  if proxyRouteSpec.Namespace != "" {
   u += proxyRouteSpec.ServiceName + "." + proxyRouteSpec.Namespace
  } else {
   u += proxyRouteSpec.ServiceName
  }
  if proxyRouteSpec.Port != 0 {
   u += fmt.Sprintf(":%d", proxyRouteSpec.Port)
  }
  log.Println("代理地址: ", u)
  proxyUrl, err := url.Parse(u)
  if err != nil {
   c.AbortWithStatus(http.StatusInternalServerError)
  }
  proxyServer(c, proxyUrl)
 } else {
  c.String(http.StatusNotFound, "404")
 }
}

// 代理轉發(fā)
func proxyServer(c *gin.Context, proxyUrl *url.URL) {
 proxy := &httputil.ReverseProxy{
  Director: func(outReq *http.Request) {
   u := outReq.URL
   outReq.URL = proxyUrl
   if outReq.RequestURI != "" {
    parsedURL, err := url.ParseRequestURI(outReq.RequestURI)
    if err == nil {
     u = parsedURL
    }
   }

   outReq.URL.Path = u.Path
   outReq.URL.RawPath = u.RawPath
   outReq.URL.RawQuery = u.RawQuery
   outReq.RequestURI = "" // Outgoing request should not have RequestURI

   outReq.Proto = "HTTP/1.1"
   outReq.ProtoMajor = 1
   outReq.ProtoMinor = 1

   if _, ok := outReq.Header["User-Agent"]; !ok {
    outReq.Header.Set("User-Agent""")
   }

   // Even if the websocket RFC says that headers should be case-insensitive,
   // some servers need Sec-WebSocket-Key, Sec-WebSocket-Extensions, Sec-WebSocket-Accept,
   // Sec-WebSocket-Protocol and Sec-WebSocket-Version to be case-sensitive.
   // https://tools.ietf.org/html/rfc6455#page-20
   outReq.Header["Sec-WebSocket-Key"] = outReq.Header["Sec-Websocket-Key"]
   outReq.Header["Sec-WebSocket-Extensions"] = outReq.Header["Sec-Websocket-Extensions"]
   outReq.Header["Sec-WebSocket-Accept"] = outReq.Header["Sec-Websocket-Accept"]
   outReq.Header["Sec-WebSocket-Protocol"] = outReq.Header["Sec-Websocket-Protocol"]
   outReq.Header["Sec-WebSocket-Version"] = outReq.Header["Sec-Websocket-Version"]
   delete(outReq.Header, "Sec-Websocket-Key")
   delete(outReq.Header, "Sec-Websocket-Extensions")
   delete(outReq.Header, "Sec-Websocket-Accept")
   delete(outReq.Header, "Sec-Websocket-Protocol")
   delete(outReq.Header, "Sec-Websocket-Version")
  },
  Transport: &http.Transport{
   TLSClientConfig: &tls.Config{
    InsecureSkipVerify: true,
   },
  },
  ErrorHandler: func(w http.ResponseWriter, request *http.Request, err error) {
   statusCode := http.StatusInternalServerError
   w.WriteHeader(statusCode)
   w.Write([]byte(http.StatusText(statusCode)))
  },
 }
 proxy.ServeHTTP(c.Writer, c.Request)
}

每次請求連接會從本地緩存讀取配置,判斷是否匹配,若匹配則轉發(fā)代理到配置的服務中去。

部署

為了方便測試,我已經(jīng)編譯好鏡像上傳到 Docker Hub 上,所以大家可以直接使用下面的 yaml 部署:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: proxyroutes.miniproxy.togettoyou.com
spec:
  group: miniproxy.togettoyou.com
  names:
    kind: ProxyRoute
    shortNames:
      - pr
    plural: proxyroutes
    singular: proxyroute
  scope: Namespaced
  versions:
    - name: v1alpha1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                host:
                  type: string
                serviceName:
                  type: string
                namespace:
                  type: string
                port:
                  type: integer
                scheme:
                  type: boolean
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mini-k8s-proxy
spec:
  selector:
    matchLabels:
      app: mini-k8s-proxy
  replicas: 1
  template:
    metadata:
      labels:
        app: mini-k8s-proxy
    spec:
      containers:
        - name: mini-k8s-proxy
          image: togettoyou/mini-k8s-proxy:latest
          ports:
            - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: mini-k8s-proxy-service
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: mini-k8s-proxy
  type: NodePort

部署:

$ kubectl apply -f mini-k8s-proxy.yaml
customresourcedefinition.apiextensions.k8s.io/proxyroutes.miniproxy.togettoyou.com created
deployment.apps/mini-k8s-proxy created
service/mini-k8s-proxy-service created

$ kubectl get svc
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
mini-k8s-proxy-service   NodePort    10.111.139.14   <none>        80:32112/TCP   32s

訪問集群域名:32112 ,看到 404 的話,恭喜部署成功。

驗證使用 ProxyRoute

現(xiàn)在我有一個名稱為 test-service 的 service 處于 testns 命名空間下,容器內部端口為 80(是一個 nginx 服務)

$ kubectl get svc -n testns
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
test-service   ClusterIP   10.97.89.250   <none>        80/TCP    2s

我想要當請求 host 為 test.togettoyou.com:32112 的流量請求過來時,可以代理轉發(fā)到 test-service 上,怎么做呢

按照心里預期,創(chuàng)建一個 ProxyRoute 資源對象:

apiVersion: miniproxy.togettoyou.com/v1alpha1
kind: ProxyRoute
metadata:
  name: test-proxyroute
spec:
  host: test.togettoyou.com:32112
  serviceName: test-service
  namespace: testns
  port: 80
  scheme: false

瀏覽器訪問 test.togettoyou.com:32112 ,神奇的事情就會發(fā)生了


總結

本文通過 CRD + Controller 實現(xiàn)了一個簡易的 K8S 代理轉發(fā)工具,相關代碼均上傳到了 Github(https://github.com/togettoyou/mini-k8s-proxy)

實現(xiàn)思路來自 Traefik,強烈推薦

最后,感謝您的閱讀!


瀏覽 60
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美777| 欧美视频在线播放| 69国产成人精品二区| 欧美丰满老熟妇XXXXX性| 手机看片久草| 18禁av在线| 国产福利在线| 日B视频在线观看| 国产精品免费在线| 国产美女福利| 免费在线观看黄色视频网站| 大香蕉做爱视频| 日韩无码激情| 老妇槡BBBB| 无码一区二区三区在线| 欧美午夜电影| 骚逼AV| 欧美日韩一级二级三级| 精精品人妻一区二区三区| 无码国产精品一区二区性色AV| 日韩一级大片| 中文字幕第一页亚洲| 亚洲无码一级片| 亚洲AV片一区二区三区| 伊人福利导航| 国产成人V在线精品一区| 国产精品成人无码| 国产91高跟丝袜| 黄色国产av| 欧美一级高清片免费一级a| 国产—a毛—a毛A免费| 啊啊啊在线| 久久国产av| 91av一区二区三区| 99综合| 国产日本在线观看| 91精品国产成人观看| 日本精品黄色视频| 黑人vs亚洲人在线播放| 91人妻人人澡人人爽人人精品乱| 成人网站视频| 国产永久免费| 欧美久久一区| 高清无码免费在线观看| 国产视频1区| 一本久久A精品一合区久久久| 国产免费AV网站| 久久精品国产AV| 色伊人| 真人一级毛毛片| 久久免费视频精品| 中文激情网| 超碰97免费| 午夜成人精品| 毛片学生妹| 军人妓女院BD高清片在线播放| 免费国产黄色视频网站| www.欧美日韩| 微熟女导航| 69日逼| 69视频网站| 婷婷国产精品视频| 亚洲视频456| 五月丁香婷婷色| 日批网站在线| 亚洲性爱网站| 国产日韩一区| 操b视频免费看| 青青操B| 四虎福利| 北条麻妃在线观看香蕉| 久久久亚洲熟妇熟女| 欧美麻豆| 人妻少妇偷人精品无码免费| www.色悠悠| 日韩在线国产| 懂色AV| www.久久久久| 亚洲无码中| 在线免费观看黄色电影| 波多野结衣在线精品| 日皮视频免费在线观看| 五月天丁香花| 美女久草| 欧美一页| 99免费热视频| 亚洲精品456| 91无码人妻精品一区二区三区四| 伊人网址| 撸一撸AV| 欧美一级AAA大片免费观看| 欧美大香蕉在线视频| 亚洲色啪| 久久高清免费视频| 国产9熟妇视频网站| 高清无码中文字| 免费无码一区二区三区| 国产高清无码一区| 国内自拍激情视频| 黄色美女网站| 91久久久青青青青草| 日韩欧美一区二区三区不卡| 97三级| 手机看片欧美+日韩+国产| 无码不卡视频| 在线观看无码av| 操逼视频91| 日韩一级一级| 国产婷婷色一区二区在线观看| 亚洲一级a| 91麻豆精品91久久久久同性| 国产精品无码怀孕软件| 久久精品国产精品| 91精品久久久久久久久久久久| 日韩免费Av| 亚洲AV无码专区一级婬片毛片| 久久XX| 青青色综合| 手机在线一区| 撸一撸成人在线做爱视频。| 69成人精品国产| 黄片无码免费观看| 亚洲精品伦理| 国产精品一区一区三区| 永久免费看片视频5355| 日韩欧美国产高清91| 黄片午夜| 亚洲少妇无码| 欧美性猛交ⅩXXX乱大交| 色图插插插| 无码免费观看| 亚洲91在线| 国产成人精品123区免费视频| 午夜日逼网站| 婷婷五月综合激情| 欧美A一| 熟女视频国产| 91精品久久人妻一区二区夜夜夜| 国产妞干网| 高清无码三级片在线观看| 欧美黄片一区二区| 热久久最新地址| 超碰在线进入| 亚洲无码人妻| 好叼操| 免费AV片| 小黄片在线看| 撒尿BBw搡BBwBBw| 成人黄A片免费| 大香蕉大香蕉免费网| 韩国午夜福利视频| 国产探花视频在线免费观看 | 91人妻人人澡人人爽人人精品乱| 久草视频免费看| 91看片看婬黄大片Videos | 日韩一级性爱| 天堂素人| 日日夜夜精品| 日韩无码人妻| 高清无码在线观看视频| 好色综合| A免费视频| 成人免费毛片蓝莓| 午夜福利大香蕉| 久操av在线| 久久精品波多野结衣| 嫩BBB槡BBBB槡BBBB二一| 亚洲av综合在线| 波多野结衣无码NET,AV| 国产AV无遮挡| 中文字幕乱伦日本| 麻豆传媒嫂子| 亚洲精品综合| 免费黄色在线观看| 日韩在线视频免费观看| 久久久久成人电影| 看毛片的网站| 国产第一页在线观看| 欧美后门菊门交| 亚洲成人性爱网| 精品少妇人妻| 思思热99| 国产理论片| 成人肏逼视频| 911国产精品| 99久久99久久精品免费看小说。 | www.91madou| 你懂得视频| 高清无码一级片| 天天操夜夜操狠狠| 亚洲无码免费网站| 一级黄色电影免费在线观看 | 亚洲无码另类| 欧美日韩成人网| 亚洲精品少妇| 豆花成人网站在线看| 91丨精品丨国产丨丝袜| 中文一区在线观看| 天天干天天日天天干天天日| 日韩不卡一区二区三区| 日韩视频91| 蜜桃传媒一区二区亚洲A| 亚洲一区久久| 亚洲在线成人视频| 婷婷激情av| 天天爱天天爽| 亚洲V国产v欧美v久久久久久| 色汉综合| 国产精品人妻AⅤ在线看| 日韩免费在线观看视频| 中文字幕欧美在线| 国产AV天堂| 免费在线黄片| 国产手机AV在线| 这里视频很精彩免费观看电视剧最新| 国产一级AA大片毛片| 大BBBw大BBBW另类| 日韩亚洲在线视频| 午夜成人福利在线观看| 久久这里有精品视频| 色图插插插| 欧美男女操逼视频| 婷婷五月天激情电影| 中文字幕精品视频在线观看| AV自拍偷拍| 欧美偷拍精品| 在线免费A片| 国产精品福利视频| 四虎网站| av不卡免费观看| 日韩在线小电影| 亚洲婷婷在线观看| 日韩欧美人妻| 中文字幕永久在线观看| 人人妻人人色| 久草福利在线| b逼一区| 免费看黄色电影| 亚洲无码中文字幕视频| 手机看片亚洲| 一区二区三区四区在线播放| 日本免费高清视频| 伊人一区| 伊人久久在线| 青青无码视频| 各种BBwBBwBBwBBw| 91在线免费视频观看| av电影在线观看| 日韩一级片在线观看| 国产A片免费视频| 99视频在线免费播放| 996re| 熟妇人妻丰满久久久久久久无码| а√最新版天堂中文在线| 黄色欧美视频| 这里视频很精彩免费观看电视剧最新 | 最新毛片网站〖网:.〗| 久久波多野结衣一区二区| 国产人妻在线| ww国产| A片在线免费观看| 欧美一级黄片免费看| 91色| 黄片无码免费观看| 黄片免费观看视频| 日本高清版色视频| 黄色免费视频网站| 日韩香蕉视频| 北条麻妃高清无码| 91香蕉视频在线| 久久午夜成人电影| 国产精品一区二区在线观看| 超碰99热| 日韩婷婷| 91视频黄| 国产欧美黄片| 荫蒂添出高潮A片视频| 丝袜人妻被操视频| 极品久久久久| 国产AA片| 午夜国产在线| 91精品国产人妻| 婷婷综合一区| 一本色道久久综合无码人妻| 免费AV网站| 无码国产精品一区二区性色AV | 成人无码精品| 无码人妻精品一区二区三区温州 | 国产精品秘ThePorn| 欧美日韩第一页| 黄色伊人| 免费A片在线| 91高清在线| 一起操在线观看| 波多野结衣中文字幕久久| 黄色毛片在线| 精品人妻一区二区免费蜜桃视频| 亚洲影院中文字幕| 一插菊花网| 天天操免费视频| gogogo视频在线观看黑人| 五月激情婷婷网| 九九色九九| 欧美中文字幕| 一本一道波多野结衣潮喷视频| 国产三级在线观看视频| 国产99re| 91在线免费视频观看| 高清无码久久| 成人免费精品| 国产欧美精品| 91香蕉视频在线播放| 中国无码| 99国产热| 中文字幕A片无码免费看| 一级乱伦网站| 激情五月在线| 91麻豆大奶巨乳一区白虎| 日本中文字幕在线观看视频| 成人在线超碰| 精品福利一区二区三区| 熟妇槡BBBB槡BBBB图| 无码高清一区二区| 拍拍拍免费视频| 国产精品免费一区二区三区都可以| 成人视频网站在线观看| 51妺妺嘿嘿午夜成人| 欧美成人三级在线观看| 99精品视频北条麻妃国产版 | av影音先锋在线| 日韩高清无码不卡| 婷婷视频网站| 日韩伊人网| 亚洲福利| 大香蕉在线啪啪| 成人黄片网站| 青春草在线视频免费观看| 欧美成人黄色| 大香蕉视频国产| 亚洲无码1区| 天天爱天天操| 黄色A片免费观看| 一级免费视频| 国产小黄片在线| 国产在线观看国产精品产拍| 黃色毛片A片AAAA级20| 狼友精品| 久操精品视频| 亚洲成人大香蕉| 日韩无码人妻久久一区二区三区| 少妇4p| 欧美色小说| 欧美国产第一页| 综合天堂AV久久久久久久| 亚洲色图15| 国产免费AV在线| 91AV一区二区三区| 亚洲成人免费网站| aV无码av天天aV天天爽第一| 亚洲va国产天堂va久久en| 久久精品99国产国产精| 中文字幕第二页| 星空AV| 中文字幕一区二区6页| 亚洲一区无码在线观看| 人人骚| 大香蕉大香蕉免费网| 免费无码成人片在线播放| 中国熟睡妇BBwBBw| 成人国产在线观看| 丰满人妻-区二区三区| 日本一区二区三区免费视频| 精品国精品自拍自在线| 影音av| 国产aaaaaa| 成人视频网| 一级a一级a爰片免费| 亚洲污网| 久久草大香蕉| 操B视频在线| 亚洲精品无码久久| 超碰97人人爱| 欧美日皮视频| 免费69视频看片| 日本高清视频网站网wwwwww| 色婷婷一区二区三区久久午夜 | 久久丁香五月婷婷五月天激情视频| 婷婷综合素质二区| 北条麻纪视频| 亚洲免费观看高清完整版在va线观| 亚洲婷婷视频| 特级黄色毛片| 国产欧美黄片| 久久双飞| 久草美女| 100国产精品人妻无码| 欧美福利视频| 乱子伦国产精品一区二区| 国产老女人操逼视频| 日本无码专区| 欧美久久久久久久| 欧美不卡在线播放| 日韩成人A片| 成人精品一区日本无码网站suv/| 午夜性爱福利| 亚洲一区二区在线视频| 欧美三区四区| 苍井空一区| 亚洲成人视频免费在线观看| 人妻在线无码| 久久国产AV| 国产无码黄片| 成人黄网站免费观看| 性爱视频网站| 91丨九色丨国产在线| 91丨人妻丨国产| 中文字幕人妻无码| 国产又爽又黄免费| 五月丁香在线播放| 91免费网站| 成人免费激情视频| 无码高清18| 国产福利视频在线观看| 999一区二区三区| 青春草在线视频免费观看| 青娱乐亚洲| 亚欧洲精品在线视频免费观看| 无码免费毛片| 最近中文字幕高清2019中文字幕 | 人人操人人干人人操| 国产精品A片守望| 综合激情网站| 手机看片1024久久| 精品三级片| 日韩中文字幕在线观看视频| 蝌蚪窝在线视频免费观看| 四虎影院人妻| 亚州无码视频| 亚州天堂网| 国产内射久久| 2025av中文字幕| 天天肏屄| 精品蜜桃秘一区二区三区在线播放| 大鸡巴操小逼视频| 五月天黄色视频| 在线观看无码高清| 嫩草久久99www亚洲红桃| 老熟女--91XX| 中文字幕免费视频在线播放| 东北女人操逼| 色婷网| 草草影院第一页YYCCC| 无码伦理电影| 婷婷日韩| 天天操天天插| 天堂a在线| 538在线观看| 青草午夜| 人人精品| 一级黄色电影免费看| 大香蕉综合视频| 走光无码一区二区三区| JlZZJLZZJlZZ亚洲女人17| 日本操B| 中文在线字幕高清电视剧| 91丨PORNY丨对白| 北岛玲丝袜办公室高跟| 人妻公日日澡久久久| 97超碰碰| BBW老熟女BBw| 自拍偷拍精品| 久久综合操| 水多多成人视频| 色色色999| 操逼视频免费观看| 西西人体WW大胆无码| 亚洲成人三级| 精品五月天| 亚洲免费成人电影| 三级日韩视频| 久久黄色A片| 人人摸人人摸| 日本精品视频在线观看| 丰满人妻一区二区三区不卡二| 欧美日本中文字幕| 无码人妻一区二区三区在线视频不卡| 精品久久无码中文字幕| 很色很黄的A片一| 空姐白洁| 婷婷在线播放| 午夜性爱网| 亚洲国产成人综合| 最新三级网站| 日韩欧美一级视频| 国产九九九九九九| 成人777777免费视频色| 国产男女无套免费| 777偷窥盗摄00000| 天天玩夜夜玩天天玩国产99| 日本无码在线观看| 老熟女视频| 日韩一级无码视频| 免费视频91蜜桃| 二区在线观看| 亚洲秘一区二区三区-精品亚洲二区- | 天堂网av2014| 一本色道久久综合无码人妻四虎| 免费一级A| 日本少妇性爱视频| 亚洲欧美婷婷五月色综合| 水果派成人播放无码| 激情五月天婷婷| 久操影视| 水蜜桃视频网站| 四川BBBB擦BBBB| 韩国成人啪啪无码高潮| 精品国产91| 国产精品国产成人国产三级| 中国国产乱子伦| 大香蕉大香蕉视频网| 青青色在线视频| 国产午夜精品一区二区三区牛牛| 97超碰资源站| 一级黄色免费视频| 精品无码一区二区三区在线| 丁香婷婷五月基地| 久草网视频| 国产免费AV在线观看| 精品视频免费在线观看| 国产成人精品a视频一区| 久久久久久久久黄色| 欧美AAAAAAAA| 99在线观看免费| www.97cao| 天天日天天干美女| 欧美69p| 国产成人精品免费看视频| 狠狠狠狠狠狠狠狠| 免费无码一级A片大黄在线观看| 久久中文字幕视频| 91毛片在线观看| 亚洲天堂AV网| 少妇白洁在线观看| 久久这里只有精品99| 天天舔天天日| 精品视频| 国精产品一区二区三区黑人和中国 | 在线观看免费无码| 国产足交| 久久93| 日韩无码激情| 爱搞搞就要搞| 白白操白白干| 天天搞天天色| 看免费黄色录像| 国产黄色Av| 91欧美性爱| 天天日天天操天天摸天天干天日射天天插 | 在线免费观看黄色视频| 亚洲精品性爱| 成年人视频在线观看免费| 国产剧情一区二区| 中文在线A∨在线| 爱爱爱爱视频| 成人黄色视频免费| 亚洲视频免费在线| 亚洲女人被黑人巨大进入| www.日韩精品| 欧美黄色大香蕉| 日韩和的一区二区| 中日韩黄色视频| 一级AA视频| 狠狠躁日日躁夜夜躁A片小说免费| 探花视频在线观看| 黄色成人视频在线免费观看| 国产女人在线| 日本一节片在线播放| 国产久久视频在线观看| 精品一区二区三区四区五区六区七区八区九区 | 暖暖爱视频免费| av拍拍| 成人国产AV网站| 曰曰干| 91香蕉网| 国产无遮挡A片又黄又爽小直播| 91在线导航| 嫩草在线观看| 亚洲久久色| 亚洲国产成人久久| 国产乱伦中文字幕| 手机看片1204| 国产高清在线观看| 日韩美毛片| 中文字幕五月天| 99精品视频16在线免费观看| 91人人爱| 日韩欧美国产高清91| 日韩亚洲中文在线| 999在线视频| 国产欧美黄片| 欧美熟妇精品黑人巨大一二三区| 嫩BBB槡BBBB槡BBB3i| 久久久电影| 精品一区二区三区四区五区六区七区八区九区 | 一区无码| 日本一区二区三区四区在线观看| 黄片无码视频| 天天骑夜夜操| 五月天激情视频| A一级黄片| 婷婷伊人中文字幕| 黄色a视频| 国产精品电影| 草逼免费看| 欧美日韩小电影| 国产精品一线| 爱福利视频| 大地资源第5页在线| 亚洲无码在线视频观看| 四虎AV| 亚洲成人免费福利| 日本人妻在线观看| www.狠狠干| 激情无码视频| 91网站在线免费观看| 天堂va欧美ⅴa亚洲va一夜| 成人三级片免费| 欧美无人区码suv| 日韩高清中文字幕| 日韩三级| 日韩无码人妻一区| 操屄视频在线| 国产在线小视频| 国产午夜三级| 天堂AV网站| 亚洲成人观看| 欧美激情一区二区| 亚洲免费无码| 97男人的天堂| 日本免费版网站nba| 青娱乐国产视频| 欧美性爱自拍| 91精品国产人妻| 国产操逼小视频| 国产精品片| 国产欧美日韩综合| 53岁露大奶熟女偷情贴吧| 亚洲无码不卡视频| 91在线无码精品秘国产三年 | 色高清无码免费视频| 午夜视频成人| 日逼视频免费| 欧美日韩在线观看视频| 久久99视频免费观看| 青草视频在线免费观看| 日本黄色视频在线观看| 五月天国产视频| 成人福利午夜A片公司| 国产三级片网址| 97精品人人A片免费看| 日韩高清无码毛片| 韩国AV在线| 爱爱日韩| 久久久久久高清毛片一级| 亚洲欧洲久久电影| 男人插女人网站| 成人av一区| 国产6区| 99re6热在线精品视频| 国产性爱AV| 一级aa视频| 国产jk在线| 大香蕉综合| 伊人黄色视频| 日本黄色小视频| 人人色人人色| 黄色毛片在线| 日韩一区二区视频| 国产综合久久久777777色胡同 | 日韩无码高清免费| 亚洲免费网| 一级a爱视频| 亚洲无码精品一区二区| 91丨九色丨熟女老版| 五月天AV在线| 懂色中国闺密偷情懂色AV| 欧美一级A片在线观看| 国产a级毛片| 毛片网站视频| 99精品久久| 免费国产成人看片在线| 欧美成人无码片免费看A片秀色| 99热激情在线| 国产人妖在线| 国产精品999999| 操b视频网站| 国产熟女在线| 影音先锋自拍| 欧美色色视频| 91无码人妻| 99精品免费观看| 在线免费黄片| 午夜精品人妻无码| 熊猫AⅤ| 狠狠色色| 天天干夜夜操熟女| 国产精品乱子伦视频一区二区 | 撸撸操在线视频观看只有精品| 亚洲区在线| 亚洲第一香蕉视频| 国产AV黄片| 国产精品探花熟女| 精品无码电影| 色情综合| 污视频在线免费观看| 韩国成人精品三级| 黄色在线网站| 蜜桃av秘无码一区三| 国产主播精品在线| 中文乱伦视频| 婷婷五月六月| 爽好紧别夹喷水网站| 黄色成人在线观看视频| 超碰人人操| 欧美艹逼视频| 天天爽夜夜爽AA片免费| 欧美a级视频| 中文字幕无码免费| 国内操逼| 亚洲视频,中文字幕| 日韩av中文在线| 国产精品无码7777777| 亚洲无码久久网| 亚洲专区免费| 上海熟妇搡BBBB搡BBBB| 黄色片基地| 亚洲丁香五月| 日韩精品在线视频观看| 无码精品一区二区三区同学聚会| a片在线观看视频| 正在播放李彩斐被洋老外| 黄色一及片| 日韩在线观看免| 国产超碰在线| 色九九九九| 国产又粗又大又黄视频| 99热伊人| 人人操超碰在线| 亚洲色情在线播放| 国产成人精品一区二区三区在线| 亚洲香蕉视频网站| 77Q视频| 男人午夜天堂| 天天射日| 国产三级自拍| 中国操逼| 中文字幕精品1| 看一级黄色毛片| 免费毛片网| 一级香蕉视频| 国产精品久久久91| 久久天堂网| 狠狠操免费视频| 国产精品尤物| 91人妻人人澡人人爽| 91久久久久国产一区二区| www日本在线| 91大长腿美女花外围在线观看 | 黄片免费播放| 91亚洲国产成人精品一区二区三| 丁月婷婷五香天日五月天| 国产高清无码一区二区三区| 天天色粽合合合合合合合| 高潮喷水AⅤ| 伊人无码视频| 亚洲射| 国产福利电影在线| 天天干天天撸影视| 亚洲免费性爱视频| 2025av在线| 天堂视频在线观看亚洲美女| 久草社区在线| 亚洲天堂免费| 中文字幕亚洲高清| 欧美大鸡巴在线观看| 午夜黄色操逼视频| 国产成人网| 国产一二区| 国产做爰XXXⅩ久久久骚妇| 亚洲成人在线视频观看| 丁香五月网| 91网站免费| 性中国熟妇| 久久伊人亚洲| 四川少妇搡bbbb搡bbbb| 特级西西444WWW大精品视频 | 亚洲天堂AV网| 亚洲69v久久久无码精品| 女公务员人妻呻吟求饶| 久久777| 亚洲一级在线观看| 国产三级片精品| 色人天堂| 日本一区二区视频在线观看| 久久久久久精品国产三级| 操逼一区二区| A片黄色电影| 午夜在线免费视频| 成人手机在线视频| 18成人毛片| 日韩中文字幕在线视频| 操少妇| 中文字幕无码日韩| 色婷婷久综合久久一本国产AV| 亚洲91无码精品一区在线播放| 乱码中文字幕日韩欧美在线| 五月天中文字幕| 久久国产综合| 中文无码第一页| 亚洲天堂网在线观看视频| 中日韩黄色视频| 澳门簧片| 欧美毛视频| 日本免费爱爱视频| www.超碰在线| 欧美性爱视频在线观看| 国产口爆在线观看| 国产v欧美| 国产在线观看你懂的| 久久久久久久久成人| 免费无码| 短发半推半就AV| 国产一级内射| 97久久精品国产熟妇高清网| 五十路AV| 亚洲AV无码成人| 十八禁黄网站| 无码人妻一区二区三区免水牛视频| www.91madou| 欧美成人A片AAA片在线播放| 色情片在线播放| 国产精品探花熟女AV| 免费成人AV| 超碰AA| 国产精品123| 国产免费A片| 国产AV毛片| 欧美精品秘一区二区三区蜜臀| 国产逼| 在线免费观看黄色片| 三根一起进菊眼| 操屄视频在线| 婷婷夜色福利网| 久久国产高清| 国产豆花视频| 天天操天天射天天日| 久草视频播放| 欧美日韩亚洲综合| 亚洲视频无码在线| 精品国内自产拍在线观看视频| 三级毛片视频| 日本色情视频网站| 日本不卡在线观看| 亚洲avwww| 91做爱| 五月天久久久| 一道本AV| 亚洲精品国产精品国自产在线| 性久久久久久| 久久伊人影院| 影音先锋天堂| 久久99免费视频| 日韩精品人妻一区二区| 亚洲www啪成人一区二区麻豆| 婷婷精品| 一区免费视频| 青草福利视频| 高清无码免费视频| 色色色色色色色色欧美| 极品美女援交在线| 偷拍92| 日韩一级乱伦| 男女做爱无码| 久久免费成人电影| 黄色视频免费观看国产| 亚洲中文第一页| 777三级| 无码颜射| 蜜臀久久99精品久久久兰草影视 | 内射欧美| 中文字幕无码视频在线观看| 妻子互换被高潮了三次| 午夜免费视频1000| 久久久精品国产| 免费在线成人网| 极品小仙女69| 天天色天天干天天| 久久99视频免费观看| 无码人妻一区二区三区蜜桃视频| 国产精品毛片视频|