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

使用 Crossplane 和 VCluster 在 Kubernetes 上快速構建新集群

開發 開源
?Crossplane? 是一個開源的 Kubernetes 插件,通過擴展 Kubernetes API 來解決云資源的供應問題。使用 Crossplane 時,你可以用聲明的方式定義需要創建哪些云資源才能讓你的應用程序正常工作,不需要編寫任何代碼。

Crossplane 是一個開源的 Kubernetes 插件,通過擴展 Kubernetes API 來解決云資源的供應問題。使用 Crossplane 時,你可以用聲明的方式定義需要創建哪些云資源才能讓你的應用程序正常工作,不需要編寫任何代碼。可以直接通過創建相關的 CRD 對象來完成這些云資源的定義,可以看成是一個云原生版本的 Terraform。

圖片

VCluster 是一個通過輕量級虛擬 Kubernetes 集群提供靈活性并節省成本的工具,使用 VCluster,你可以在 Kubernetes 集群內創建一個隔離的虛擬 Kubernetes 集群。這大大降低了創建和維護 Kubernetes 集群控制平面的復雜性。

圖片

下表比較了使用命名空間、vcluster 和 Kubernetes 集群的隔離級別和管理復雜性:

圖片

那么我們將 Crossplane 和 VCluster 這兩個工具一起來結合時候會產生怎樣的效果呢?接下來我們將通過一個示例來說明這二者的結合使用。

示例

在這個示例中我們想要實現如下所示的一些功能:

  • 擁有一個集群可以接收請求來啟動一個新的集群環境
  • 這些環境將可以使用 Helm 來安裝應用程序
  • 請求新環境的團隊并不關心集群在哪里創建的,所以使用 VCluster 或在云提供商中創建一個 Kubernetes 集群應該為終端用戶提供類似的體驗。

這里我在本地環境使用 KinD 來進行演示,相關的資源清單可以在 https://github.com/salaboy/from-monolith-to-k8s/tree/main/platform/crossplane-vcluster 此處找到(需要自己提前安裝 kubectl、helm、kind)。

圖片

如上圖所示,我們只需要創建一個 KinD 集群(當然也可以是其他任何的 Kuberentes 集群),然后在集群上安裝 Crossplane 和 Crossplane Helm Provider,因為我們這里沒有創建任何云資源,所以我們不需要配置任何其他的 Crossplane Provider(比如 GCP、AWS、Azure 等)。

安裝 Crossplane

接下來我們可以先使用 KinD 創建一個 Kubernetes 集群。

$ kind create cluster
Creating cluster "kind" ...
? Ensuring node image (kindest/node:v1.23.4) ??
? Preparing nodes ??
? Writing configuration ??
? Starting control-plane ???
? Installing CNI ??
? Installing StorageClass ??
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community ??
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane,master 56s v1.23.4

集群準備好后接下來我們可以將 Crossplane 和 Crossplane Helm Provider 安裝到我們的 KinD 集群中去,如下所示:

$ kubectl create ns crossplane-system
namespace/crossplane-system created
$ helm install crossplane --namespace crossplane-system crossplane-stable/crossplane

NAME: crossplane
LAST DEPLOYED: Tue Aug 9 15:20:22 2022
NAMESPACE: crossplane-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Release: crossplane

Chart Name: crossplane
Chart Description: Crossplane is an open source Kubernetes add-on that enables platform teams to assemble infrastructure from multiple vendors, and expose higher level self-service APIs for application teams to consume.
Chart Version: 1.9.0
Chart Application Version: 1.9.0

Kube Version: v1.23.4

安裝完成后會在 crossplane-system 命名空間下面運行如下所示的兩個 Pod:

$ kubectl get pods -n crossplane-system
NAME READY STATUS RESTARTS AGE
crossplane-c9b9fc9f9-4hn47 1/1 Running 0 11m
crossplane-rbac-manager-56c8ff5b65-8lgrp 1/1 Running 0 11m

接著需要安裝 Crossplane Helm Provider,直接使用 crossplane 的 kubectl 插件即可安裝:

$ kubectl crossplane install provider crossplane/provider-helm:v0.10.0
provider.pkg.crossplane.io/crossplane-provider-helm created

另外需要注意在安裝 Crossplane Helm Provider 的時候,我們需要為該 Provider 提供一個合適的 ServiceAccount 來創建新的 ClusterRoleBinding,以便該 Provider 可以安裝 Helm Charts。

$ SA=$(kubectl -n crossplane-system get sa -o name | grep provider-helm | sed -e 's|serviceaccount\/|crossplane-system:|g')
$ echo $SA
crossplane-system:crossplane-provider-helm-3d2f09bcd965
$ kubectl create clusterrolebinding provider-helm-admin-binding --clusterrole cluster-admin --serviceaccount="${SA}"
clusterrolebinding.rbac.authorization.k8s.io/provider-helm-admin-binding created

然后創建一個如下所示的 ProviderConfig 對象,用來聲明安裝 Helm Provider:

# helm-provider-config.yaml
apiVersion: helm.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
name: default
spec:
credentials:
source: InjectedIdentity

---
# SA=$(kubectl -n crossplane-system get sa -o name | grep provider-helm | sed -e 's|serviceaccount\/|crossplane-system:|g')
# kubectl create clusterrolebinding provider-helm-admin-binding --clusterrole cluster-admin --serviceaccount="${SA}"

直接應用上面的資源清單即可:

$ kubectl apply -f helm-provider-config.yaml
providerconfig.helm.crossplane.io/default created

到這里我們就將 Crossplane 安裝完成了。最后我們還推薦安裝 vcluster 命令行工具來連接 Kubernetes 集群,可以參考文檔 https://www.vcluster.com/docs/getting-started/setup 進行安裝。

使用 Crossplane Composition 創建 VClusters

Crossplane 和 Crossplane Helm Provider 現在已經準備好了,接下來讓我們來看看 Crossplane Composition。Crossplane 提供了組合托管資源的機制,用戶可以在其中以聲明的方式創建自己的抽象。

  • 組合資源(Composite Resource):組合資源(XR)是一種自定義資源,它由托管資源組成,允許你抽象基礎設施細節。CompositeResourceDefinition(XRD)定義了一種新型的組合資源,XRD 是集群范圍的,為了創建一個命名空間的 XR,相應的 XRD 可以提供一個組合資源聲明(XRC)。
  • 組合(Composition):一個組合指定 XR 將由哪些資源組成,也就是當你創建 XR 時會發生什么,一個 XR 可以有多個組合。例如,對于 CompositeDatabase XR,你可以使用一個組合來創建 AWS RDS 實例、一個安全組和一個 MySQL 數據庫。另一種組合可以定義 GCP CloudSQL 實例和 PostgreSQL 數據庫。
  • 配置(Configuration):配置是一個 XRD 和組合的包,然后可以使用 Crossplane CLI 將其發布到 OCI 鏡像注冊中心,并通過創建聲明性配置資源將其安裝到一個 Crossplane 集群中。

我們這里的 Crossplane Composition(XR) 定義了創建新環境資源時需要執行的相關操作,該對象會執行以下的一些操作:

  • 使用我們安裝 Helm Provider 時配置的 Helm Provider Config 來安裝 VCluster Helm Chart,當我們安裝這個 Chart 時,就可以創建一個新的 VCluster,是不是非常簡單。
  • VCluster 安裝會創建一個 Kubernetes Secret 對象,其中包含連接到 VCluster APIServer 的 tokens,我們可以使用該 Secret 來配置第二個 Helm Provider Config,它允許我們將 Helm Charts 安裝到新創建的集群中。
  • 我們可以使用第二個 Helm Provider Config 來將應用程序安裝到創建的 VCluster 中。

圖片

接下來我們來看下這是如何實現的,首先我們需要將 Crossplane Composition 和 Environment CRD 應用到我們的集群中來,這樣我們就可以創建新的 Environment 資源了。

首先定義一個 Environment 的組合資源,對應的資源清單如下所示,該對象相當于 Kubernetes 集群中的 CRD:

# environment-resource-definition.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: environments.fmtok8s.salaboy.com
spec:
group: fmtok8s.salaboy.com
names:
kind: Environment
plural: environments
claimNames:
kind: Cluster
plural: clusters
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties: {}

有了 XRD 組合資源聲明過后,接下來定義一個組合對象,資源清單文件內容如下所示,在該 Composition 組合對象中定義了多個資源,其中關聯了上面的 XRD 對象聲明的 Environment 對象:

# composition.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: environment.fmtok8s.salaboy.com
spec:
writeConnectionSecretsToNamespace: crossplane-system
compositeTypeRef:
apiVersion: fmtok8s.salaboy.com/v1alpha1
kind: Environment
resources:
- name: vcluster-helm-release
base:
apiVersion: helm.crossplane.io/v1beta1
kind: Release
metadata:
annotations:
crossplane.io/external-name: # patched
spec:
rollbackLimit: 3
forProvider:
namespace: # patched
chart:
name: vcluster
repository: https://charts.loft.sh
version: "0.10.2"
values:
syncer:
extraArgs: [] # patched
# - --out-kube-config-server=https://cluster-1.cluster-1.svc
providerConfigRef:
name: default
patches:
- fromFieldPath: metadata.name
toFieldPath: spec.forProvider.namespace
policy:
fromFieldPath: Required
- fromFieldPath: metadata.name
toFieldPath: metadata.annotations[crossplane.io/external-name]
policy:
fromFieldPath: Required
- fromFieldPath: metadata.name
toFieldPath: metadata.name
transforms:
- type: string
string:
fmt: "%s-vcluster"
- type: CombineFromComposite
combine:
variables:
- fromFieldPath: metadata.name
strategy: string
string:
fmt: "--out-kube-config-secret=%s-secret"
toFieldPath: spec.forProvider.values.syncer.extraArgs[0]
- type: CombineFromComposite
combine:
variables:
- fromFieldPath: metadata.name
- fromFieldPath: metadata.name
strategy: string
string:
fmt: "--out-kube-config-server=https://%s.%s.svc"
toFieldPath: spec.forProvider.values.syncer.extraArgs[1]
- type: CombineFromComposite
combine:
variables:
- fromFieldPath: metadata.name
- fromFieldPath: metadata.name
strategy: string
string:
fmt: "--tls-san=%s.%s.svc"
toFieldPath: spec.forProvider.values.syncer.extraArgs[2]
- name: helm-providerconfig
base:
apiVersion: helm.crossplane.io/v1alpha1
kind: ProviderConfig
spec:
credentials:
source: Secret
secretRef:
name: # patched
namespace: # patched
key: config
patches:
- fromFieldPath: metadata.name
toFieldPath: spec.credentials.secretRef.name
transforms:
- type: string
string:
fmt: vc-%s
- fromFieldPath: metadata.name
toFieldPath: spec.credentials.secretRef.namespace
- fromFieldPath: metadata.uid
toFieldPath: metadata.name
- name: helm-provider-vcluster
base:
apiVersion: helm.crossplane.io/v1beta1
kind: ProviderConfig
spec:
credentials:
source: Secret
secretRef:
namespace: #patched
key: config
patches:
- fromFieldPath: metadata.name
toFieldPath: metadata.name
- fromFieldPath: metadata.name
toFieldPath: spec.credentials.secretRef.namespace
policy:
fromFieldPath: Required
# This ProviderConfig uses the above VCluster's connection secret as
# its credentials secret.
- fromFieldPath: "metadata.name"
toFieldPath: spec.credentials.secretRef.name
transforms:
- type: string
string:
fmt: "%s-secret"
readinessChecks:
- type: None
- name: conference-chart-vcluster
base:
apiVersion: helm.crossplane.io/v1beta1
kind: Release
metadata:
annotations:
crossplane.io/external-name: conference
spec:
forProvider:
chart:
name: fmtok8s-conference-chart
repository: https://salaboy.github.io/helm/
version: "v0.1.1"
namespace: conference
providerConfigRef:
name: #patched
patches:
- fromFieldPath: metadata.name
toFieldPath: spec.providerConfigRef.name

我們為 VCluster 的 Chart 包設置了 3 個參數,以便與 Crossplane 一起使用:

  • 在第 53 行配置了fmt: "--out-kube-config-secret=%s-secret"?,因為我們需要 VCluster 創建一個 Secret 對象,將kubeconfig 托管在里面,這樣我們就可以獲取它,與新創建的 APIServer 進行連接了。
  • 在第 62 行配置了fmt: "--out-kube-config-server=https://%s.%s.svc"? ,因為我們需要kubeconfig? 從集群內指向新的 APIServer URL,默認情況下,生成的kubeconfig? 指向https://localhost:8443。
  • 在第 71 行配置了fmt: "--tls-san=%s.%s.svc",表示需要將新的服務地址添加到到 APIServer 接受連接的主機列表中。

接著直接應用上面的兩個對象即可:

$ kubectl apply -f composition.yaml
composition.apiextensions.crossplane.io/environment.fmtok8s.salaboy.com created
$ kubectl apply -f environment-resource-definition.yaml
compositeresourcedefinition.apiextensions.crossplane.io/environments.fmtok8s.salaboy.com created

一旦集群內的組合和 CRD 可用后,我們就可以開始創建新的環境資源,在運行之前要檢查哪些 VClusters 目前是可用的。

$ vcluster list

NAME NAMESPACE STATUS CONNECTED CREATED AGE
No entries found

現在應該還沒有任何 VClusters,現在我們可以創建一個新的環境,比如現在我們定義一個 dev 的環境,只需要聲明一個如下所示的 Environment 對象即可:

# environment-resource.yaml
apiVersion: fmtok8s.salaboy.com/v1alpha1
kind: Environment
metadata:
name: dev-environment
spec: {}

直接應用該對象:

$ kubectl apply -f environment-resource.yaml
environment.fmtok8s.salaboy.com/dev-environment created
$ kubectl get environments
NAME READY COMPOSITION AGE
dev-environment False environment.fmtok8s.salaboy.com 57s
$ kubectl describe environments dev-environment
Name: dev-environment
Namespace:
Labels: crossplane.io/composite=dev-environment
Annotations: <none>
API Version: fmtok8s.salaboy.com/v1alpha1
Kind: Environment
......
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal PublishConnectionSecret 76s defined/compositeresourcedefinition.apiextensions.crossplane.io Successfully published connection details
Normal SelectComposition 19s (x7 over 76s) defined/compositeresourcedefinition.apiextensions.crossplane.io Successfully selected composition
Normal ComposeResources 18s (x7 over 76s) defined/compositeresourcedefinition.apiextensions.crossplane.io Successfully composed resources

現在我們可以像對待其他 Kubernetes 資源一樣對待你創建的環境資源了,你可以直接使用 kubectl get environments 列出它們,甚至可以描述它們以查看更多細節。

現在我們再去檢查 VCluster 正常就會發現一個新的資源了:

$ vcluster list

NAME NAMESPACE STATUS CONNECTED CREATED AGE
dev-environment dev-environment Running 2022-08-09 17:44:07 +0800 CST 56m38s

VCluster 將在一個新的命名空間 dev-environment 中安裝一個 APIServer(默認使用 K3s)、CoreDNS 實例和一個 Syncer,讓用戶能夠通過 kubectl 與 VCluster API Server 進行交互,就像與常規集群一樣,VCluster 將與負責調度工作負載的主機集群同步這些資源,這樣來實現了一個命名空間就是一個 Kubernetes 集群的功能。

一旦我們配置了 Crossplane 和 Crossplane Helm Provider,我們就可以通過創建一個新的 Helm Release 安裝一個 Helm Chart 來創建一個新的 VCluster,非常簡單。

圖片

一旦我們使用在 secret 中創建的正確 kubeconfig 創建了 VCluster,我們就可以配置第二個 Helm Provider 以將我們的應用程序安裝到新創建的 VCluster 中,上面 composition 對象中第 95 行定義的 helm-provider-vcluster 就是該描述。

然后在 composition 內部,我們配置使用了一個我們的會議應用的 Helm Chart 包。

圖片

配置完所有內容并創建新環境后,我們可以連接到 VCluster 并檢查應用程序是否已安裝:

$ vcluster connect dev-environment --server https://localhost:8443 -- bash

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$ kubectl get ns
NAME STATUS AGE
default Active 32m
kube-system Active 32m
kube-public Active 32m
kube-node-lease Active 32m
conference Active 23m
bash-3.2$ kubectl get pods -n conference
NAME READY STATUS RESTARTS AGE
conference-fmtok8s-frontend-7cd5db8669-pv944 1/1 Running 0 23m
conference-fmtok8s-email-service-768bc88cbb-sklrg 1/1 Running 0 23m
conference-postgresql-0 1/1 Running 0 23m
conference-fmtok8s-c4p-service-7f56d7bd9d-2vjtx 1/1 Running 2 (19m ago) 23m
conference-redis-master-0 1/1 Running 0 23m
conference-redis-replicas-0 1/1 Running 0 23m
conference-fmtok8s-agenda-service-7db66c9568-xsh5m 1/1 Running 2 (16m ago) 23m

可以看到我們的應用在該集群中已經安裝成功了,而這些應用實際上就是部署在 KinD 這個原始集群的 dev-environment 命名空間下面的:

$ kubectl get pods -n dev-environment
NAME READY STATUS RESTARTS AGE
conference-fmtok8s-agenda-service-7db66c9568-xsh5m-x-08f9332627 1/1 Running 2 (18m ago) 25m
conference-fmtok8s-c4p-service-7f56d7bd9d-2vjtx-x-co-fc2c58eaec 1/1 Running 2 (21m ago) 25m
conference-fmtok8s-email-service-768bc88cbb-sklrg-x--c5d9594434 1/1 Running 0 25m
conference-fmtok8s-frontend-7cd5db8669-pv944-x-confe-2832ac1bef 1/1 Running 0 25m
conference-postgresql-0-x-conference-x-dev-environment 1/1 Running 0 25m
conference-redis-master-0-x-conference-x-dev-environment 1/1 Running 0 25m
conference-redis-replicas-0-x-conference-x-dev-environment 1/1 Running 0 25m
coredns-76dd5485df-6cbl7-x-kube-system-x-dev-environment 1/1 Running 0 34m
dev-environment-0 2/2 Running 0 63m

只是 VCluster 將一個命名空間進行了隔離,使用起來和 Kubernetes 集群體驗基本一致。

總結

這只是一個簡單的示例,介紹了如何使用 Crossplane 與 VCluster 來結合使用快速配置一套 Kubernetes 集群環境并在其中安裝應用,以使開發人員提高工作效率。當然還有很多可以優化的地方,比如:

  • 在 VCluster 中安裝 ArgoCD 并使用作為環境參數提供的 GitHub URL 來實現 GitOps,這將避免對 VCluster 使用 kubectl。使用 composition 可以來創建 ArgoCD 資源以配置存儲庫和集群,而無需用戶干預。
  • 在 VCluster 中安裝 Knative,以便開發人員可以依靠 Knative Functions、Knative Serving 和 Eventing 功能來設計他們的應用程序。
  • 通過環境參數來決定 VCluster 使用哪個云資源,比如 GCP、AKS 和 EKS 實現等。
  • 同樣 Crossplane 也是在本地 KinD 集群中進行測試使用的,我們也可以對接真實云資源,比如 GCP、AWS、Azure 等等。
責任編輯:未麗燕 來源: k8s技術圈
相關推薦

2022-08-11 08:41:31

CrossplaneVCluster

2022-03-24 14:11:25

KubernetesCitusPostgreSQL

2023-11-03 13:20:13

Kubernetes

2023-09-18 08:00:00

Kubernetes容器集群

2021-12-03 11:06:01

VeleroKubernetesLinux

2023-11-02 09:00:00

Kubernetes集群

2020-07-16 21:00:05

樹莓派Kubernetes集Linux

2021-07-01 11:29:45

KubernetesGrafana監控

2022-11-30 09:39:44

KubeadmDebian 11Kubernetes

2014-12-24 09:35:29

Docker集群管理kubernetes

2019-07-04 13:10:53

Docker設計云計算

2022-10-19 13:11:35

2021-02-03 15:10:38

GoKubernetesLinux

2016-07-29 15:49:58

DockerKubernetesMongoDB

2023-03-30 09:17:42

KubesprayKubernetesLinux

2020-07-08 08:03:37

KubernetesLens集群

2022-12-29 14:25:22

2019-04-23 09:48:21

KubernetesPostgreSQL

2024-07-16 09:41:01

2020-03-31 12:50:34

樹莓派K3sKubernetes集
點贊
收藏

51CTO技術棧公眾號

亚洲天天在线日亚洲洲精| 中文字幕精品三区| 久久久亚洲影院你懂的| 国产麻豆xxxvideo实拍| 一级毛片久久久| 国产精品国产精品国产专区不片 | 久久艹精品视频| 美女扒开腿让男人桶爽久久动漫| 色国产综合视频| av动漫免费观看| 天天躁日日躁狠狠躁喷水| 久久国产精品色婷婷| 久久久久一本一区二区青青蜜月 | 香蕉视频一区二区三区| 欧美午夜精品理论片a级按摩| 天天干天天操天天干天天操| 五月天激情开心网| 激情小说亚洲一区| 日本国产精品视频| 久久久国产精品黄毛片| 青青草国产成人a∨下载安卓| 精品国产凹凸成av人导航| www.色偷偷.com| 精精国产xxxx视频在线野外| 中文字幕在线播放不卡一区| 欧美日韩精品不卡| 亚洲欧美激情另类| 黑人巨大精品欧美一区| 热99久久精品| 九九九国产视频| 99九九热只有国产精品| 亚洲片在线观看| 精品熟女一区二区三区| 精品成人18| 欧美日韩在线播放三区| 久久精品免费一区二区| 国产福利在线免费观看| 一区免费观看视频| 午夜精品一区二区在线观看| 四虎影院在线播放| 大尺度一区二区| 99porn视频在线| 97精品人妻一区二区三区香蕉| 久久精品国语| 欧美在线视频观看| 国产成人精品片| 尤物在线精品| 午夜精品一区二区三区在线 | 欧美日韩加勒比精品一区| 欧美狂野激情性xxxx在线观| 2024短剧网剧在线观看| 亚洲美女免费在线| 免费看污污视频| 成人免费网址| 亚洲乱码日产精品bd| 成人免费看片视频在线观看| 超碰在线免费播放| 亚洲精品国产高清久久伦理二区| 国产精品夜夜夜爽张柏芝| 日韩成人影视| 亚洲欧美日韩人成在线播放| 日本丰满少妇黄大片在线观看| 秋霞成人影院| 亚洲欧美国产77777| 在线免费观看一区二区三区| 国产淫片在线观看| 一区二区国产视频| 人妻av中文系列| 自拍视频在线看| 91成人网在线| 中国黄色片一级| 试看120秒一区二区三区| 精品国产一二三区| 搡老熟女老女人一区二区| 久久99性xxx老妇胖精品| 亚洲天堂网在线观看| 毛片视频免费播放| 欧美黄色大片网站| 91禁外国网站| 中文字幕丰满人伦在线| 国产一区二区0| 国产激情美女久久久久久吹潮| 天天综合网天天综合| 久久久亚洲精品石原莉奈| 亚洲视频电影| 好看的中文字幕在线播放| 一本色道亚洲精品aⅴ| 在线视频日韩一区 | 日韩视频免费观看高清完整版在线观看 | 国产探花在线播放| 91久久中文| 国产精品久久久久久久久免费看| 国产精品无码天天爽视频| 国产精品一卡二| 欧美日韩一区在线播放| 中文字幕在线观看播放| 色综合久久88色综合天天免费| 天天干天天色天天干| 国产美女撒尿一区二区| 一区二区在线视频| 黄色小视频在线免费看| 麻豆精品一区二区av白丝在线| 国产福利久久精品| 137大胆人体在线观看| 亚洲成人免费影院| 日韩va在线观看| 日韩深夜影院| 欧美老少配视频| 欧美日韩 一区二区三区| 国产精品亚洲人在线观看| 欧美午夜精品久久久久免费视| www视频在线看| 欧美亚洲国产一卡| 鲁大师私人影院在线观看| 五月天久久久| 国产成人亚洲综合| 少妇精品高潮欲妇又嫩中文字幕| 国产精品久久久久久久岛一牛影视| 日本福利视频在线| 一区二区三区欧洲区| 日韩一区av在线| 国产亚洲久一区二区| 99re这里只有精品首页| 黄色成人在线免费观看| 95精品视频| 在线观看国产成人av片| 中文字幕亚洲高清| 白白色亚洲国产精品| 日本精品免费视频| 久久av影院| 一区二区福利视频| 国产一区免费看| 久久九九全国免费| 狠狠97人人婷婷五月| 91嫩草精品| 欧美激情一二三| 亚洲成人第一区| 亚洲另类在线一区| 亚洲理论中文字幕| 久久视频在线| 国产精品专区一| 男人在线资源站| 欧美日韩的一区二区| 国产又粗又黄又猛| 奇米色一区二区| 亚洲欧美日韩不卡一区二区三区| 成人在线视频播放| 亚洲视频网站在线观看| 超碰超碰超碰超碰| 久久久综合视频| 熟妇人妻va精品中文字幕| 久久av综合| 国产精品久久av| 免费在线观看黄| 欧美一区二区在线免费观看| 性色av无码久久一区二区三区| 精品亚洲免费视频| 97在线免费视频观看| 一区二区三区在线免费看 | 电影天堂国产精品| 在线播放精品一区二区三区| 这里只有久久精品视频| 国产蜜臀av在线一区二区三区| 天堂中文视频在线| 日韩电影一区| 999国产在线| 91九色在线看| 亚洲欧美国产精品| 一区二区自拍偷拍| 亚洲精品老司机| 国产高潮失禁喷水爽到抽搐| 亚洲精品字幕| 五月天亚洲综合情| 国产日韩一区二区三免费高清| 欧美人交a欧美精品| 亚洲aaa在线观看| 欧美日韩国产综合视频在线观看 | 欧美一区二区三区久久精品| 国产精品一区免费观看| 欧美精品日日操| 日韩中文字幕精品| 人妻无码中文字幕| 欧美伊人久久大香线蕉综合69 | 国产日韩欧美日韩大片| 伊人影院在线视频| 亚洲精品日韩丝袜精品| 一区二区自拍偷拍| 亚洲成av人片在线| 精品人妻中文无码av在线| 国产经典欧美精品| 成人一区二区三| 欧美成人久久| 日韩欧美第二区在线观看| 日韩中文字幕| 国产精品aaa| 黄页网站在线| 中文字幕一区电影| 手机看片一区二区三区| 欧美日韩国产成人在线91| 中文字幕一区二区三区手机版| 国产日韩高清在线| 88av在线播放| 久久99精品国产麻豆不卡| 欧美日韩精品在线一区二区 | 中文字幕男人天堂| 亚洲午夜精品久久久久久久久| 日韩av片在线| www.欧美.com| 四虎国产精品免费| 久久精品久久综合| 日本免费不卡一区二区| 欧美阿v一级看视频| 亚洲国产一区二区在线| 婷婷综合成人| 99国内精品久久久久久久软件| 蜜桃视频成人m3u8| 97精品视频在线观看| 91cn在线观看| 久久天堂电影网| fc2在线中文字幕| 亚洲欧美视频在线| 神马午夜一区二区| 日韩精品一区在线| 国产农村老头老太视频| 欧美午夜精品久久久久久孕妇| 国产九色在线播放九色| 亚洲在线免费播放| 人妻久久一区二区| 中文字幕一区av| 亚洲图片第一页| 久久精品亚洲国产奇米99| 亚洲观看黄色网| aaa欧美色吧激情视频| 色诱av手机版| 粉嫩欧美一区二区三区高清影视| 182午夜视频| 国产主播一区二区| 制服丝袜中文字幕第一页| 六月丁香综合在线视频| 亚洲免费一级视频| 麻豆国产精品一区二区三区| 日本在线一二三区| 久久精品国产77777蜜臀| 日韩爱爱小视频| 久久99国产精品久久99| 超碰成人在线播放| 国产综合色产在线精品| 欧美大片久久久| 国产精品18久久久久| 少妇熟女视频一区二区三区 | 亚洲久久一区二区| 国产素人在线观看| 国产精品久久久久久久久久妞妞| 97成人在线免费视频| 国产日韩综合| 欧美 日韩精品| 免费日本视频一区| 嫩草视频免费在线观看| 国产精品一区二区久久精品爱涩| 美女流白浆视频| av在线这里只有精品| 素人fc2av清纯18岁| 国产日韩欧美麻豆| 三级影片在线观看| 亚洲一区二区三区中文字幕在线| 日本在线视频中文字幕| 日韩欧美在线字幕| 中文字幕日本人妻久久久免费| 欧美高清一级片在线| www.av日韩| 亚洲精品在线视频| 欧美三级黄网| 欧美精品久久久久久久久| 欧美黑人巨大xxxxx| 成人h片在线播放免费网站| 亚洲欧美日本国产| 欧美久久久久久一卡四| 欧美国产一级| a级黄色小视频| 久久久久国产精品午夜一区| 尤物国产在线观看| 成人av午夜影院| jizz中文字幕| 亚洲免费在线观看视频| www.国产高清| 欧美精品欧美精品系列| 老牛影视av牛牛影视av| 中日韩午夜理伦电影免费| 性欧美高清come| 日本人成精品视频在线| 国产专区精品| 欧美福利精品| 午夜日韩电影| 亚洲乱码国产一区三区| 国产精品99久久久久久似苏梦涵| 波多野结衣福利| 亚洲美女精品一区| 欧美日韩 一区二区三区| 亚洲成人aaa| 精品自拍一区| 国产精品99导航| 久久夜色电影| 青青视频免费在线| 日本视频一区二区| 日本一区二区在线免费观看| 一区在线播放视频| 国产情侣小视频| 亚洲国产97在线精品一区| 午夜看片在线免费| 日本sm极度另类视频| 大陆精大陆国产国语精品| 中文字幕日韩一区二区三区不卡| 国产日韩一区二区三区在线| 极品人妻一区二区| 18欧美乱大交hd1984| 亚洲视屏在线观看| 亚洲精品一区二三区不卡| 欧美6一10sex性hd| 成人性生交xxxxx网站| 超碰成人久久| 欧美日韩亚洲第一| 91免费国产在线| 日韩精品乱码久久久久久| 欧美一区二区福利在线| 麻豆视频在线观看免费| 国产精品久久久久久av| 国产成人精品一区二区免费看京 | 久草视频手机在线观看| 91精品国产综合久久香蕉的特点 | 国产精品密蕾丝视频下载 | 东方av正在进入| 欧美日韩午夜在线视频| 北岛玲一区二区三区| 国产成人精品久久二区二区91| 香蕉国产成人午夜av影院| 91好吊色国产欧美日韩在线| 成人久久视频在线观看| 久久久综合久久| 欧美mv和日韩mv的网站| 欧美性猛片xxxxx免费中国| 91原创国产| 国产精品成人一区二区网站软件| 日本少妇xxx| 亚洲一区二区视频| 蜜臀久久久久久999| 欧美激情欧美狂野欧美精品| 99a精品视频在线观看| 欧美午夜小视频| 99久久精品一区二区| 男女视频免费看| 亚洲免费小视频| 偷拍精品精品一区二区三区| 欧美系列一区| 免费观看一级特黄欧美大片| 97精品在线播放| 欧美一区二区三区小说| 调教一区二区| 九九九九精品| 日韩国产成人精品| 国产精品白丝喷水在线观看| 欧美一区二区日韩一区二区| 国产第一页在线| 麻豆久久久9性大片| 日韩精品91亚洲二区在线观看| 亚洲色图第四色| 欧美一区二区三区视频免费播放| 亚洲综合影视| 精品视频一区二区三区四区| 视频一区欧美精品| 黄色录像二级片| 亚洲黄色有码视频| 3d欧美精品动漫xxxx无尽| 欧美日韩视频免费在线观看| 高清不卡在线观看av| 国产一级免费视频| 日韩三级成人av网| 国产福利一区二区精品秒拍| 看欧美ab黄色大片视频免费 | 国产国产一区| 国内少妇毛片视频| 国产喷白浆一区二区三区| 99热在线只有精品| 欧洲亚洲女同hd| 91久久国产| 亚洲啪av永久无码精品放毛片 | 五月婷婷深爱五月| 亚洲激情av在线| 第一福利在线| 国产精品日韩高清| 日韩av一二三| 国产主播在线播放| 综合国产在线视频| 99a精品视频在线观看| 五月天亚洲视频| 亚洲第一福利一区| 日本在线视频观看| 久久国产精品久久精品国产| 国产真实乱对白精彩久久| 午夜影院免费在线观看| 九九视频这里只有精品|