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

Dapr 入門(mén)教程

共 56554字,需瀏覽 114分鐘

 ·

2022-08-01 08:25

Dapr(Distributed Application Runtime) 是微軟于 2019 年 10 月 16 日 首次發(fā)布[1] 的分布式程序運(yùn)行時(shí),到現(xiàn)在已經(jīng)過(guò)去1年多,從最初的v0.1.0 到現(xiàn)在的 v1.0.0-rc2,加入了好多新的功能。支持的中間件越來(lái)越多,基本上主流的中間件(本地版和各云提供商的托管版)都可以被支持。Dapr 運(yùn)行時(shí)也從原來(lái)的只支持單 Instance變成了v1.0.0-rc1以后的支持多 Instance(HA mode),讓我們一起進(jìn)入精彩的 Dapr 的世界。

Dapr 是什么?

參考 Dapr 官方網(wǎng)站[2] ,"An event-driven, portable runtime for building microservices on cloud and edge",或者復(fù)雜點(diǎn)說(shuō),"Dapr is a portable, event-driven runtime that makes it easy for any developer to build resilient, stateless and stateful applications that run on the cloud and edge and embraces the diversity of languages and developer frameworks"。翻譯過(guò)來(lái)就是,Dapr 是一個(gè)在云和邊緣構(gòu)建微服務(wù)用的事件驅(qū)動(dòng)的,可移植的運(yùn)行時(shí)。更復(fù)雜的來(lái)說(shuō),"Dapr 是一個(gè)可移植的,事件驅(qū)動(dòng)的運(yùn)行時(shí),使開(kāi)發(fā)人員可以輕松創(chuàng)建在云和邊緣上運(yùn)行的有彈性,無(wú)狀態(tài)和有狀態(tài)的應(yīng)用程序,支持語(yǔ)言和開(kāi)發(fā)人員框架的多樣性"。聽(tīng)起來(lái)讓人一頭霧水,讓我解釋一下它到底是什么意思。

  • 分布式程序(Distributed Application)指的是什么?
    • 跟微服務(wù)是一個(gè)意思。大的系統(tǒng)分成彼此獨(dú)立的小的模塊,模塊和模塊之間通過(guò)API互相通信,這樣每個(gè)模塊可以用不同的語(yǔ)言開(kāi)發(fā),一個(gè)模塊升級(jí)的時(shí)候不會(huì)影響到別的模塊。
  • 云和邊緣(cloud and edge)指的是什么?
    • 這里的云和邊緣指的是 Dapr 的 App 可以跑在 AWS,Azure,GCP 等云服務(wù)器上,也可以跑在本地的服務(wù)器上。
  • 事件驅(qū)動(dòng)(event-driven)指的是什么?
    • 可以理解成 Dapr 在沒(méi)有監(jiān)聽(tīng)(Listening)到請(qǐng)求到來(lái)的時(shí)候會(huì)一直處于待機(jī)的狀態(tài),什么也不做,只有監(jiān)聽(tīng)到請(qǐng)求事件來(lái)了才開(kāi)始處理。
  • 可移植(portable)指的是什么?
    • 就是說(shuō)寫(xiě)的程序和運(yùn)行的環(huán)境,用的中間件無(wú)關(guān)。比如說(shuō)原來(lái)跑在 AWS 上,現(xiàn)在想跑在 Azure 上,Nosql 數(shù)據(jù)庫(kù)原來(lái)用 DynamoDB,現(xiàn)在想用 CosmosDB,消息中間件原來(lái)用 SNS/SQS,現(xiàn)在想用 Service Bus,沒(méi)問(wèn)題,只要在 Dapr 設(shè)定這邊做一下切換,程序無(wú)需改動(dòng)。
  • 運(yùn)行時(shí)(runtime)指的是什么?
    • 運(yùn)行時(shí)指的是 Dapr 的運(yùn)行環(huán)境。Dapr 的 Control Plane(不知道怎么翻譯,直接用英文,就是 Dapr 管理用的模塊)會(huì)單獨(dú)啟動(dòng),同時(shí)你的程序在啟動(dòng)的時(shí)候 Dapr 會(huì)在你的程序上掛一個(gè) Sidecar(所謂的邊車(chē)模式),你的程序就可以通過(guò) Sidecar 和 Dapr 的 Control Plane 聯(lián)系上。所有掛有 Dapr Sidecar 的各個(gè)微服務(wù)之間就可以互相調(diào)用了,也可以通過(guò) Dapr 調(diào)用各種中間件。
  • 有彈性(resilient)指的是什么?
    • 指的是可以從故障中自動(dòng)恢復(fù)的能力,比如說(shuō)超時(shí)、重試等。不會(huì)卡住或陷入一種死循環(huán)。
  • 無(wú)狀態(tài)和有狀態(tài)(stateless and stateful)指的是什么?
    • 無(wú)狀態(tài)指的是一個(gè)微服務(wù)經(jīng)過(guò)計(jì)算得到結(jié)果,返回給調(diào)用者以后這個(gè)值在微服務(wù)這邊是不保存的(DB,內(nèi)存等)。有狀態(tài)指的是在微服務(wù)這邊要把這個(gè)結(jié)果保存起來(lái)。
  • 支持語(yǔ)言的多樣性(the diversity of languages)指的是什么?
    • 指的是 Dapr 有各種語(yǔ)言的 SDK,比如 java,python,go,.net 等都支持。
  • 開(kāi)發(fā)人員框架(developer frameworks)指的是什么?
    • 指的是 Dapr 跟框架無(wú)關(guān),你可以把各種語(yǔ)言的各種框架(比如 java 的 spring boot 框架)和 Dapr(API 或者 SDK)混合使用。
  • 說(shuō)了這么多,Dapr 到底是個(gè)什么東西?
    • 我的理解是 Dapr 就是一個(gè)代理。什么意思呢,就是說(shuō)它把不同組件的接口隱藏了起來(lái),給你提供一個(gè)統(tǒng)一的接口讓你來(lái)通信。這樣做的好處不言而喻,不管你的組件怎么變,平臺(tái)怎么變,我 Dapr 這邊只要接口是不變的,你程序就不用變。所以它是 Makes it easy for any developer。從程序來(lái)看我只是把數(shù)據(jù)交給 Dapr 就可以了,由 Dapr 來(lái)處理,這塊的邏輯不寫(xiě)在我的程序邏輯里。所以通過(guò) Dapr 可以做到平臺(tái)無(wú)關(guān),中間件無(wú)關(guān)。打個(gè)比方,如果你不用 Dapr,而是用 springboot redis 庫(kù)來(lái)實(shí)現(xiàn)的 Message Queue,忽然有一天讓你不用 redis 而是 RebbitMQ,你怎么辦,是不是只能用 springboot rebbitmq 重寫(xiě)程序。不同于工作在網(wǎng)絡(luò)層的 Service Mesh(如 Istio 和 Linkerd),Dapr 算是一個(gè) App Mesh,工作于 APP 層,專(zhuān)注于提供構(gòu)建模塊(Building blocks),使開(kāi)發(fā)人員更容易構(gòu)建微服務(wù)。可以說(shuō) Dapr 以開(kāi)發(fā)人員為中心,而 Service Mesh 則以基礎(chǔ)架構(gòu)為中心。兩者可以共存。

Dapr 能為我做什么?

Dapr 提供如下的 Building blocks:

  1. Service-to-service invocation,服務(wù)間調(diào)用,指的是一個(gè)微服務(wù)可以通過(guò) Dapr 調(diào)用另一個(gè)微服務(wù)。
  2. State management,狀態(tài)管理,指的是一個(gè)微服務(wù)通過(guò) Dapr 把狀態(tài)數(shù)據(jù)保存到某個(gè)地方(PostgreSQL,Redis,DynamoDB 等等)。
  3. Publish and subscribe,就是所謂的消息總線(xiàn)(Message Bus),或者說(shuō)發(fā)布者/訂閱者模式。一個(gè)微服務(wù)把消息通過(guò) Dapr 發(fā)布(Publish)給某個(gè) Topic,所有訂閱(Subscribe)這個(gè) Topic 的微服務(wù)都能通過(guò) Dapr 收到這個(gè)消息。
  1. Resource bindings,就是所謂的消息隊(duì)列(Message Queue,或者叫消息代理,Message Broker),分為兩種綁定,一種是輸出綁定(Output Binding),一種是輸入綁定(Input Binding)。出和入是看數(shù)據(jù)的流向,輸出綁定就是作為 Producer 的 App 把消息通過(guò) Dapr 傳給消息隊(duì)列,輸入綁定就是作為 Consumer 的 App 通過(guò) Dapr 從消息隊(duì)列里得到消息。補(bǔ)充一點(diǎn),這里的消息隊(duì)列和 Pub/Sub 里的消息總線(xiàn)有什么區(qū)別呢?可以這樣理解:一個(gè)消息進(jìn)入消息總線(xiàn)的話(huà),所有訂閱者都能得到這個(gè)消息。而一個(gè)消息進(jìn)入消息隊(duì)列的話(huà),由 Consumer 來(lái)取,一次只有一個(gè)人能得到。此外,消息總線(xiàn)是不要求處理順序的,兩個(gè)消息進(jìn)入消息總線(xiàn),誰(shuí)先被拿到順序是不一定的,而消息隊(duì)列可以保證是先入先出的。
  1. Actors,實(shí)現(xiàn)了 Actor Model[3] 。
  2. Observability, 可觀測(cè)性,就是 Dapr 提供了模板讓你方便地進(jìn)行觀測(cè),比如說(shuō)用 Prometheus+Grafana 來(lái)看系統(tǒng)的 Metrics,用 Zipkin 來(lái)進(jìn)行分布鏈路追蹤,用 Elasticsearch+Fluentd+Kibana(俗稱(chēng) EFK)來(lái)對(duì)日志進(jìn)行檢索。
  3. Secrets,就是密鑰,指的是一個(gè)微服務(wù)通過(guò) Dapr 從 Secret Store 取得密鑰。

安裝 Dapr

安裝 CLI

在安裝 Dapr runtime 之前需要先安裝 Dapr 的 CLI。有兩個(gè)原因,第一,如果你以后不是用 Helm 來(lái)安裝 Dapr 的話(huà),需要用 Dapr CLI 來(lái)執(zhí)行 dapr init。第二,即使你不用 Dapr CLI,而是用 Helm 來(lái)安裝,以后查看 Dapr 系統(tǒng)狀態(tài)的時(shí)候還是要用到 Dapr CLI,比如查看 Runtime 的狀態(tài)(dapr status -k)、查看 Components 狀態(tài)(dapr components -k)、查看 Configurations 狀態(tài)(dapr configurations -k),甚至啟動(dòng) Dashboard 的時(shí)候還是要執(zhí)行(dapr dashboard -k)。你可以在很多 OS 上安裝 Dapr CLI,比如 Windows,Linux,Mac OS,我用的是 Windows10 系統(tǒng),可以選擇在 Windows 上直接裝,也可以在 WSL(Windows Subsystem for Linux)上裝,這里選擇在 WSL 上安裝(沒(méi)有 WSL 的話(huà)在 windows 商店里選一個(gè)免費(fèi)的 Linux 裝上。我選的是 Ubuntu)。參考官方文檔 How-To: Install Dapr CLI[4] ,在Ubuntu里執(zhí)行:

$ wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash
Your system is linux_amd64
Installing Dapr CLI...

Getting the latest Dapr CLI...
Installing v0.11.0 Dapr CLI...
Downloading https://github.com/dapr/cli/releases/download/v0.11.0/dapr_linux_amd64.tar.gz ...
[sudo] password for ubuntu:
dapr installed into /usr/local/bin successfully.
CLI version: 0.11.0
Runtime version: n/a

To get started with Dapr, please visit https://docs.dapr.io/getting-started/

安裝完成??纯窗姹咎?hào):

$ dapr --version
CLI version: 0.11.0
Runtime version: n/a

CLI 是 0.11.0 版的,Runtime 因?yàn)檫€沒(méi)裝,所以顯示 n/a。因?yàn)榻酉聛?lái)要安裝 1.0.0-rc.2 的 Runtime,1.x 相對(duì)于 0.x 版有了重大的改進(jìn)(比如多 Instance 模式),為了版本的統(tǒng)一性(低版本的 CLI 操作高版本的 Runtime 可能會(huì)出問(wèn)題),把 CLI 升級(jí)到 v1.0.0-rc.2 版的吧。

curl -LO https://github.com/dapr/cli/releases/download/v1.0.0-rc.2/dapr_linux_amd64.tar.gz
tar -xzf dapr_linux_amd64.tar.gz
sudo cp dapr /usr/local/bin/dapr

再看一下版本:

$ dapr --version
CLI version: 1.0.0-rc.2
Runtime version: n/a

CLI 安裝完畢。接下來(lái)安裝 Runtime。

安裝 Runtime

這里有兩種選擇,一個(gè)是 Standalone mode,一個(gè)是 Kubernetes mode。我們兩個(gè)都試一下。

安裝 Docker Engine

Dapr Runtime 安裝的前提條件是要先安裝 Docker。不然安裝 Dapr 的時(shí)候會(huì)報(bào)"could not connect to Docker. Docker may not be installed or running"的錯(cuò)。這里參考 Docker 的官方文檔 Install Docker Engine on Ubuntu[5] 來(lái)安裝Docker Engine。

$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

安裝完成。把 docker 的 service 啟動(dòng):

$ sudo service docker start

看看 service 是否啟動(dòng):

$ service docker status
 * Docker is running

OK,Docker Engine 安裝完成。

安裝 Standalone 版的 Runtime

用 dapr init 來(lái)安裝單機(jī)版,可以指定版本號(hào)。目前最新的是 1.0.0-rc.2。

$ dapr init --runtime-version=1.0.0-rc.2
?  Making the jump to hyperspace...
←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑↗  Downloading binaries and setting up components...
Dapr runtime installed to /root/.dapr/bin, you may run the following to add it to your path if you want to run daprd directly:
    export PATH=$PATH:/root/.dapr/bin
→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←↑→↓←?  Downloaded binaries and completed components set up.
??  daprd binary has been installed to /root/.dapr/bin.
??  dapr_placement container is running.
??  dapr_redis container is running.
??  dapr_zipkin container is running.
??  Use `docker ps` to check running containers.
?  Success! Dapr is up and running. To get started, go here: https://aka.ms/dapr-getting-started
export PATH=$PATH:/root/.dapr/bin

完成。看看都裝了什么東西。

$ docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED         STATUS                   PORTS                              NAMES
293b479ed26c   openzipkin/zipkin   "start-zipkin"           5 minutes ago   Up 4 minutes (healthy)   9410/tcp, 0.0.0.0:9411->9411/tcp   dapr_zipkin
a07696221fd2   daprio/dapr         "./placement"            5 minutes ago   Up 4 minutes             0.0.0.0:50005->50005/tcp           dapr_placement
c475c415332b   redis               "docker-entrypoint.s…"   6 minutes ago   Up 6 minutes             0.0.0.0:6379->6379/tcp             dapr_redis

跑起來(lái)三個(gè) Container。一個(gè) dapr_zipkin,一個(gè) dapr_placement,一個(gè) dapr_redis??纯窗姹咎?hào):

$ dapr --version
CLI version: 1.0.0-rc.2
Runtime version: 1.0.0-rc.2

至此單機(jī)版的 Dapr Runtime 安裝完成。dapr list 一下看看,什么也沒(méi)有。因?yàn)槲覀冞€沒(méi)有啟動(dòng) App。

安裝 Kubernetes 版的 Runtime

安裝之前需要先有 Kubernetes 環(huán)境,minikube,AWS 托管的 EKS,Azure 托管的 AKS,GCP 托管的 GKE 等等。這里選擇在本地安裝 minikube。參考 官方文檔[6]

$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube

看看版本:

$ minikube version
minikube version: v1.16.0
commit: 9f1e482427589ff8451c4723b6ba53bb9742fbb1

先執(zhí)行

$ sudo usermod -aG docker $USER && newgrp docker

不然 minikube 啟動(dòng)的時(shí)候會(huì)報(bào)錯(cuò)。然后啟動(dòng) minikube 環(huán)境:

$ minikube start
??  minikube v1.16.0 on Ubuntu 20.04
?  Automatically selected the docker driver
??  Starting control plane node minikube in cluster minikube
??  Pulling base image ...
??  Downloading Kubernetes v1.20.0 preload ...
    > preloaded-images-k8s-v8-v1....: 491.00 MiB / 491.00 MiB  100.00% 2.56 MiB

??  Creating docker container (CPUs=2, Memory=3100MB) ...
??  Preparing Kubernetes v1.20.0 on Docker 20.10.0 ...
    ? Generating certificates and keys ...
    ? Booting up control plane ...
    ? Configuring RBAC rules ...
??  Verifying Kubernetes components...
??  Enabled addons: storage-provisioner, default-storageclass
??  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
??  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

看看 docker ps 的結(jié)果:

$ docker ps
CONTAINER ID   IMAGE                                           COMMAND                  CREATED          STATUS                    PORTS                                                                                                      NAMES
cc47e6e56d32   gcr.io/k8s-minikube/kicbase:v0.0.15-snapshot4   "/usr/local/bin/entr…"   4 minutes ago    Up 4 minutes              127.0.0.1:49156->22/tcp, 127.0.0.1:49155->2376/tcp, 127.0.0.1:49154->5000/tcp, 127.0.0.1:49153->8443/tcp   minikube
fedf3508c0f4   daprio/dapr:1.0.0-rc.2                          "./placement"            43 minutes ago   Up 43 minutes             0.0.0.0:50005->50005/tcp                                                                                   dapr_placement
c52f4a72abc4   redis                                           "docker-entrypoint.s…"   44 minutes ago   Up 44 minutes             0.0.0.0:6379->6379/tcp                                                                                     dapr_redis
af7b8dd7dcf3   openzipkin/zipkin                               "start-zipkin"           44 minutes ago   Up 44 minutes (healthy)   9410/tcp, 0.0.0.0:9411->9411/tcp                                                                           dapr_zipkin

多了個(gè) minikube 的 Container。接下來(lái)安裝 kubectl:

$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl

看看版本:

$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.1", GitCommit:"c4d752765b3bbac2237bf87cf0b1c2e307844666", GitTreeState:"clean", BuildDate:"2020-12-18T12:09:25Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

安裝 Dapr Runtime 可以用 Dapr CLI 也可以用 Helm。我們選擇用 Helm 來(lái)安裝:

$ curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
$ sudo apt-get install apt-transport-https --yes
$ echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
$ sudo apt-get update
$ sudo apt-get install helm

看下版本:

$ helm version
version.BuildInfo{Version:"v3.4.2"GitCommit:"23dd3af5e19a02d4f4baa5b2f242645a1a3af629"GitTreeState:"clean"GoVersion:"go1.14.13"}

終于可以安裝 Dapr 了。這里指定目前最新的版本號(hào) 1.0.0-rc.2。

$ helm repo add dapr https://dapr.github.io/helm-charts/
$ helm repo update
$ kubectl create namespace dapr-system
$ helm install dapr dapr/dapr --version 1.0.0-rc.2 --namespace dapr-system

看下版本號(hào):

$ dapr status -k
  NAME                   NAMESPACE    HEALTHY  STATUS   REPLICAS  VERSION     AGE  CREATED
  dapr-dashboard         dapr-system  True     Running  1         0.5.0       1m   2020-12-26 02:22.08
  dapr-sidecar-injector  dapr-system  True     Running  1         1.0.0-rc.2  1m   2020-12-26 02:22.08
  dapr-sentry            dapr-system  True     Running  1         1.0.0-rc.2  1m   2020-12-26 02:22.08
  dapr-operator          dapr-system  True     Running  1         1.0.0-rc.2  1m   2020-12-26 02:22.08
  dapr-placement-server  dapr-system  True     Running  1         1.0.0-rc.2  1m   2020-12-26 02:22.08

我們看看啟動(dòng)了什么 Pod:

$ kubectl get pods -n dapr-system
NAME                                     READY   STATUS    RESTARTS   AGE
dapr-dashboard-6f749469dd-z7hzx          1/1     Running   0          3m45s
dapr-operator-699cd79686-nndhd           1/1     Running   0          3m45s
dapr-placement-server-0                  1/1     Running   0          3m45s
dapr-sentry-7c4fb54fb7-xsx5q             1/1     Running   0          3m45s
dapr-sidecar-injector-6bdbc588fc-tzpm4   1/1     Running   0          3m45s

啟動(dòng)了 5 個(gè) Pod:dapr-dashboard、dapr-operatordapr-placement、dapr-sentry、dapr-sidecar-injector。

  • dapr-dashboard 負(fù)責(zé)顯示 Dapr Dashboard
  • dapr-operator 負(fù)責(zé)管理 Dapr Component 的更新和 Kubernetes Service Endpoint(State stores,pub/sub 等)
  • dapr-sidecar-injector 負(fù)責(zé)將 Dapr 的 sidecar 注入帶 Dapr 注釋的 Pod(如果 App 的 Deploy 里有 dapr.io/app-iddapr.io/app-port 之類(lèi)的 annotation,就會(huì)被注入 Dapr sidecar。這時(shí)你會(huì)發(fā)現(xiàn) Pod 里有兩個(gè) Container)。
  • dapr-placement 用于 Actor,創(chuàng)建將 Actor 實(shí)例映射到 Pod 的映射表。
  • dapr-sentry 負(fù)責(zé)管理服務(wù)之間的 mTLS 并充當(dāng)證書(shū)頒發(fā)機(jī)構(gòu)。

把 Dapr Dashboard 起來(lái)看看:

$ dapr dashboard -k

效果和 kubectl port-forward svc/dapr-dashboard 8080:8080 -n dapr-system 是一樣的。在瀏覽器里輸入 http://localhost:8080

恭喜,Dapr Runtime 終于安裝完成了!

下面我們來(lái)部署一個(gè) Dapr 的微服務(wù)的例子。

Dapr 程序的部署(Standalone 模式)

上面 Dapr 的運(yùn)行時(shí)環(huán)境已經(jīng)安裝完成。今天我們?cè)?Standalone 模式部署第一個(gè) Dapr 程序。程序來(lái)自 Dapr 官方的 quickstarts 教程里的 Hello World[7] ,我們用目前的最新版本v1.0.0-rc.2。

$ git clone -b v1.0.0-rc.2 https://github.com/dapr/quickstarts.git
$ cd quickstarts

hello-world 下面是 Standalone 版的,進(jìn)去看看。程序很簡(jiǎn)單,一個(gè) Node 的程序,提供 3 個(gè) Endpoint(在 StateStore 里保存,取得,刪除發(fā)過(guò)來(lái)的 OrderId)。還有一個(gè) Python 的程序,每秒發(fā) 1 個(gè) HTTP Request 給 Node 程序。

下面開(kāi)始部署。Standalone 模式下首先要先安裝 Node 和 Python 的運(yùn)行環(huán)境。不然 dapr run 的時(shí)候會(huì)報(bào)錯(cuò)。Node 的運(yùn)行環(huán)境:

$ sudo apt update
$ sudo apt install nodejs
$ sudo apt install npm
$ sudo npm install
$ npm list

里面有 express 和 body-parser 的話(huà)就可以用 Dapr 啟動(dòng) node 的程序了。

$ dapr run --app-id nodeapp --app-port 3000 --dapr-http-port 3500 node app.js
??  Starting Dapr with id nodeapp. HTTP Port3500. gRPC Port43509
INFO[0000] starting Dapr Runtime -- version 1.0.0-rc.2 -- commit 196483d  app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] log level set to: info                        app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] metrics server started on :37057/             app_id=nodeapp instance=PC57-064 scope=dapr.metrics type=log ver=1.0.0-rc.2
INFO[0000] standalone mode configured                    app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] app id: nodeapp                               app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] mTLS is disabled. Skipping certificate request and tls validation  app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] local service entry announced: nodeapp -> 172.17.183.23:44399  app_id=nodeapp instance=PC57-064 scope=dapr.contrib type=log ver=1.0.0-rc.2
INFO[0000Initialized name resolution to standalone     app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] component loaded. name: pubsub, type: pubsub.redis  app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] waiting for all outstanding components to be processed  app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] component loaded. name: statestore, type: state.redis  app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] all outstanding components processed          app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] enabled gRPC tracing middleware               app_id=nodeapp instance=PC57-064 scope=dapr.runtime.grpc.api type=log ver=1.0.0-rc.2
INFO[0000] enabled gRPC metrics middleware               app_id=nodeapp instance=PC57-064 scope=dapr.runtime.grpc.api type=log ver=1.0.0-rc.2
INFO[0000API gRPC server is running on port 43509      app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] enabled metrics http middleware               app_id=nodeapp instance=PC57-064 scope=dapr.runtime.http type=log ver=1.0.0-rc.2
INFO[0000] enabled tracing http middleware               app_id=nodeapp instance=PC57-064 scope=dapr.runtime.http type=log ver=1.0.0-rc.2
INFO[0000] http server is running on port 3500           app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] enabled gRPC tracing middleware               app_id=nodeapp instance=PC57-064 scope=dapr.runtime.grpc.internal type=log ver=1.0.0-rc.2
INFO[0000] enabled gRPC metrics middleware               app_id=nodeapp instance=PC57-064 scope=dapr.runtime.grpc.internal type=log ver=1.0.0-rc.2
INFO[0000] internal gRPC server is running on port 44399  app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] application host: 127.0.0.1. application protocol: http. waiting on port 3000.  This will block until the app is listening on that port.  app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
== APP == Node App listening on port 3000!

INFO[0000] application discovered on port 3000           app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] application configuration loaded              app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] actor runtime started. actor idle timeout: 1h0m0s. actor scan interval: 30s  app_id=nodeapp instance=PC57-064 scope=dapr.runtime.actor type=log ver=1.0.0-rc.2
INFO[0000] dapr initialized. StatusRunningInit Elapsed 418.37829999999997ms  app_id=nodeapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] placement tables updated, version: 0          app_id=nodeapp instance=PC57-064 scope=dapr.runtime.actor.internal.placement type=log ver=1.0.0-rc.2
??  Updating metadata for app command: node app.js
?  You're up and running! Both Dapr and your app logs will appear here.

log 顯示 Node 程序已經(jīng)跑起來(lái)了。APP 自己的 HTTP Endpoint 端口是 3000,Dapr(Sidecar)的 HTTP 端口是 3500?,F(xiàn)在再開(kāi)另一個(gè)窗口,用 Dapr CLI 執(zhí)行:

$ dapr invoke --app-id nodeapp --method neworder --data '{"data": { "orderId": "42" } }'
? App invoked successfully

成功了。再看看原來(lái)的窗口,多了下面兩條:

== APP == Got a new order! Order ID: 42

== APP == Successfully persisted state.

顯示持久化成功。用 Node 程序的 GET API 確認(rèn)一下:

$ curl http://localhost:3000/order
{"orderId":42}

用 Dapr 的 API 確認(rèn)一下:

$ curl http://localhost:3500/v1.0/invoke/nodeapp/method/order
{"orderId":"42"}

我們看看數(shù)據(jù)存在了哪里。用 docker ps 看看 redis 跑在哪個(gè) Container 里:

$ docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS                    PORTS                              NAMES
a51c086c8bbe   daprio/dapr         "./placement"            31 minutes ago   Up 31 minutes             0.0.0.0:50005->50005/tcp           dapr_placement
fdca40421094   redis               "docker-entrypoint.s…"   31 minutes ago   Up 31 minutes             0.0.0.0:6379->6379/tcp             dapr_redis
9dc60b00db4d   openzipkin/zipkin   "start-zipkin"           31 minutes ago   Up 31 minutes (healthy)   9410/tcp, 0.0.0.0:9411->9411/tcp   dapr_zipkin

Container 名是 dapr_redis。進(jìn)去看看:

$ docker exec -it dapr_redis redis-cli
127.0.0.1:6379>

看看有什么 Key:

127.0.0.1:6379> keys *
1"nodeapp||order"
127.0.0.1:6379> type nodeapp||order
hash
127.0.0.1:6379> hgetall nodeapp||order
1"data"
2"{\"orderId\":\"42\"}"
3"version"
4"3"

OK,剛才的 orderId(42)找到了。除了用 Dapr CLI 保存 OrderId,我們還可以用 Dapr 的 API。

$ curl -XPOST -d @sample.json -H "Content-Type:application/json" http://localhost:3500/v1.0/invoke/nodeapp/method/neworder

其中 sample.json 的內(nèi)容如下。調(diào)用 Dapr 的 invoke API 可以起到 Dapr CLI(dapr invoke)一樣的效果。

{"data":{"orderId":"42"}}

當(dāng)然我們也可以用 Node 程序自己的 Endpoint,這樣不通過(guò) Dapr Sidecar。

$ curl -XPOST -d @sample.json -H "Content-Type:application/json" http://localhost:3000/neworder

你也許會(huì)問(wèn),為什么 Redis 直接就能用了呢?答案就是 Dapr Runtime 安裝的時(shí)候,自動(dòng)就跑起來(lái)了 Redis 的服務(wù)用的 Docker Container(配置文件在~/.dapr/components/下面的 statestore.yaml 和 pubsub.yaml),所以基于 Redis 的 statestore 和 pubsub 是開(kāi)箱即用的。

OK。接下來(lái)部署 Python 的程序。Python 也得先裝運(yùn)行環(huán)境:

$ sudo apt install python3-pip

用 Dapr CLI 啟動(dòng) Python 程序:

$ dapr run --app-id pythonapp --dapr-http-port 3501 python3 app.py
??  Starting Dapr with id pythonapp. HTTP Port3501. gRPC Port34093
??  Checking if Dapr sidecar is listening on HTTP port 3501
INFO[0000] starting Dapr Runtime -- version 1.0.0-rc.2 -- commit 196483d  app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] log level set to: info                        app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] metrics server started on :37435/             app_id=pythonapp instance=PC57-064 scope=dapr.metrics type=log ver=1.0.0-rc.2
INFO[0000] standalone mode configured                    app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] app id: pythonapp                             app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] mTLS is disabled. Skipping certificate request and tls validation  app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] local service entry announced: pythonapp -> 172.17.183.23:44129  app_id=pythonapp instance=PC57-064 scope=dapr.contrib type=log ver=1.0.0-rc.2
INFO[0000Initialized name resolution to standalone     app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] component loaded. name: pubsub, type: pubsub.redis  app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] waiting for all outstanding components to be processed  app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] component loaded. name: statestore, type: state.redis  app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] all outstanding components processed          app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] enabled gRPC tracing middleware               app_id=pythonapp instance=PC57-064 scope=dapr.runtime.grpc.api type=log ver=1.0.0-rc.2
INFO[0000] enabled gRPC metrics middleware               app_id=pythonapp instance=PC57-064 scope=dapr.runtime.grpc.api type=log ver=1.0.0-rc.2
INFO[0000API gRPC server is running on port 34093      app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] enabled metrics http middleware               app_id=pythonapp instance=PC57-064 scope=dapr.runtime.http type=log ver=1.0.0-rc.2
INFO[0000] enabled tracing http middleware               app_id=pythonapp instance=PC57-064 scope=dapr.runtime.http type=log ver=1.0.0-rc.2
INFO[0000] http server is running on port 3501           app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] enabled gRPC tracing middleware               app_id=pythonapp instance=PC57-064 scope=dapr.runtime.grpc.internal type=log ver=1.0.0-rc.2
INFO[0000] enabled gRPC metrics middleware               app_id=pythonapp instance=PC57-064 scope=dapr.runtime.grpc.internal type=log ver=1.0.0-rc.2
INFO[0000] internal gRPC server is running on port 44129  app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] actor runtime started. actor idle timeout: 1h0m0s. actor scan interval: 30s  app_id=pythonapp instance=PC57-064 scope=dapr.runtime.actor type=log ver=1.0.0-rc.2
WARN[0000] failed to read from bindings: app channel not initialized   app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] dapr initialized. StatusRunningInit Elapsed 4.716900000000001ms  app_id=pythonapp instance=PC57-064 scope=dapr.runtime type=log ver=1.0.0-rc.2
INFO[0000] placement tables updated, version: 0          app_id=pythonapp instance=PC57-064 scope=dapr.runtime.actor.internal.placement type=log ver=1.0.0-rc.2
??  Checking if Dapr sidecar is listening on GRPC port 34093
??  Dapr sidecar is up and running.
??  Updating metadata for app command: python3 app.py
?  You're up and running! Both Dapr and your app logs will appear here.

啟動(dòng)成功了。因?yàn)?Python 自己不提供服務(wù),所以--app-port 不用指定。--dapr-http-port 是 3501,這是自己的 Sidecar 用的端口,不能跟別人的重了。再看看剛才 Node 的窗口,不停的有新的 Request 過(guò)來(lái),就是 Python 程序來(lái)的每隔一秒的 Request。最后看一下 dapr list 的結(jié)果:

$ dapr list
  APP ID     HTTP PORT  GRPC PORT  APP PORT  COMMAND         AGE  CREATED              PID
  nodeapp    3500       35485      3000      node app.js     41m  2020-12-27 00:54.54  18395
  pythonapp  40175      33349      0         python3 app.py  1m   2020-12-27 01:36.27  31185

要結(jié)束這兩個(gè) APP,在各自窗口里 Ctrl+c 就可以。如果在別的窗口,可以用 Dapr CLI 的命令:

$ dapr stop --app-id nodeapp
$ dapr stop --app-id pythonapp

至此在 Standalone 模式下的第一個(gè) Dapr 程序部署成功!下一篇講講在 Kubernetes 模式下部署的方法。

Dapr 程序的部署(Kubernetes 模式)

上一篇我們?cè)?Standalone 模式部署了第一個(gè) Dapr 程序。這一次我們換成在 Kubernetes 模式下部署同樣的程序。程序來(lái)自 Dapr 官方的 quickstarts 教程里的 Hello Kubernetes[8] ,我們用目前的最新版本v1.0.0-rc.2。

$ git clone -b v1.0.0-rc.2 https://github.com/dapr/quickstarts.git
$ cd quickstarts/hello-kubernetes

里面包括一個(gè) Python 的程序,每秒發(fā) 1 個(gè) HTTP Request 給 Node 程序。一個(gè) Node 程序,用來(lái)在 StateStore 里保存發(fā)過(guò)來(lái)的 OrderId。

首先要先部署 Redis。跟 Standalone 模式不同,Kubernetes 模式的 Dapr Runtime 安裝的時(shí)候不會(huì)自動(dòng)安裝 Redis,需要手動(dòng)安裝。

$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm repo update
$ helm install redis bitnami/redis

NAME: redis
LAST DEPLOYED: Sun Jan  3 12:42:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
Redis can be accessed via port 6379 on the following DNS names from within your cluster:

redis-master.default.svc.cluster.local for read/write operations
redis-slave.default.svc.cluster.local for read-only operations

To get your password run:

    export REDIS_PASSWORD=$(kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" | base64 --decode)

To connect to your Redis server:

1. Run a Redis pod that you can use as a client:
   kubectl run --namespace default redis-client --rm --tty -i --restart='Never' \
    --env REDIS_PASSWORD=$REDIS_PASSWORD \
   --image docker.io/bitnami/redis:6.0.9-debian-10-r38 -- bash

2. Connect using the Redis CLI:
   redis-cli -h redis-master -a $REDIS_PASSWORD
   redis-cli -h redis-slave -a $REDIS_PASSWORD

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace default svc/redis-master 6379:6379 &
    redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD

安裝完成??匆幌?Pod 里多了什么:

$ kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
redis-master-0   1/1     Running   0          2m5s
redis-slave-0    1/1     Running   0          2m5s
redis-slave-1    1/1     Running   0          1m7s

接下來(lái)部署 Statestore。

$ cd quickstarts/hello-kubernetes/deploy
$ kubectl apply -f redis.yaml
component.dapr.io/statestore created

redis.yaml 的內(nèi)容如下:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
spec:
  type: state.redis
  metadata:
  # These settings will work out of the box if you use `helm install
  # bitnami/redis`.  If you have your own setup, replace
  # `redis-master:6379` with your own Redis master address, and the
  # Redis password with your own Secret's name. For more information,
  # see https://docs.dapr.io/operations/components/component-secrets .
  - name: redisHost
    value: redis-master:6379
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
auth:
  secretStore: kubernetes

意思是部署一個(gè)名字叫 statestore 的 Component,類(lèi)型為 state.redis。

用 dapr cli 看一下 components:

$ dapr components -k
NAME TYPE VERSION SCOPES CREATED AGE
statestore state.redis 2021-01-03 12:50.41 58s

接下來(lái)部署 Node 的 APP。

$ kubectl apply -f node.yaml
service/nodeapp created
deployment.apps/nodeapp created

其中 node.yaml 的內(nèi)容如下:

kind: Service
apiVersion: v1
metadata:
  name: nodeapp
  labels:
    app: node
spec:
  selector:
    app: node
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodeapp
  labels:
    app: node
spec:
  replicas: 1
  selector:
    matchLabels:
      app: node
  template:
    metadata:
      labels:
        app: node
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "nodeapp"
        dapr.io/app-port: "3000"
    spec:
      containers:
      - name: node
        image: dapriosamples/hello-k8s-node:latest
        ports:
        - containerPort: 3000
        imagePullPolicy: Always

看一下 service:

$ kubectl get svc
NAME             TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                               AGE
kubernetes       ClusterIP      10.96.0.1        <none>        443/TCP                               83m
nodeapp          LoadBalancer   10.96.83.185     <pending>     80:31324/TCP                          49m
nodeapp-dapr     ClusterIP      None             <none>        80/TCP,50001/TCP,50002/TCP,9090/TCP   49m
redis-headless   ClusterIP      None             <none>        6379/TCP                              60m
redis-master     ClusterIP      10.109.27.202    <none>        6379/TCP                              60m
redis-slave      ClusterIP      10.103.201.158   <none>        6379/TCP                              60m

啟動(dòng)了一個(gè) nodeap 的 service 和一個(gè) nodeapp-dapr(就是 sidecar)的 service。

因?yàn)槭沁\(yùn)行在 minikube 上,所以 nodeapp 的 service 沒(méi)有 EXTERNAL IP(顯示為 pending)。看一下 pod:

$ kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
nodeapp-5d5dc88584-kqr2v   2/2     Running   0          13m
redis-master-0             1/1     Running   0          142m
redis-slave-0              1/1     Running   0          142m
redis-slave-1              1/1     Running   0          141m

看一下 nodeapp 的 log:

$ kubectl logs nodeapp-5d5dc88584-kqr2v -c node
Node App listening on port 3000!
DAPR_HTTP_PORT: 3500
DAPR_GRPC_PORT: 50001

下面部署 python 的 APP:

$ kubectl apply -f python.yaml
deployment.apps/pythonapp created

python.yaml 的內(nèi)容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pythonapp
  labels:
    app: python
spec:
  replicas: 1
  selector:
    matchLabels:
      app: python
  template:
    metadata:
      labels:
        app: python
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "pythonapp"
    spec:
      containers:
      - name: python
        image: dapriosamples/hello-k8s-python:latest

看一下 pod 里多了什么:

$ kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
nodeapp-5d5dc88584-kqr2v   2/2     Running   0          16m
pythonapp-fcb4f49b-n6ltf   2/2     Running   0          49s
redis-master-0             1/1     Running   0          145m
redis-slave-0              1/1     Running   0          145m
redis-slave-1              1/1     Running   0          144m

看一下 nodeapp 的 log:

$ kubectl logs nodeapp-5d5dc88584-kqr2v -c node
Node App listening on port 3000!
DAPR_HTTP_PORT: 3500
DAPR_GRPC_PORT: 50001
Got a new order! Order ID: 5
Successfully persisted state.
Got a new order! Order ID: 6
Successfully persisted state.
Got a new order! Order ID: 7
Successfully persisted state.
Got a new order! Order ID: 8
Successfully persisted state.

用 kubernetes 的端口映射查看最新的 orderid:

$ kubectl port-forward nodeapp-5d5dc88584-kqr2v 8080:3000

把 pod 里的 nodeapp 的 http 端口 3000 映射到 localhost 的 8080。另開(kāi)一個(gè)窗口,執(zhí)行:

$ curl http://localhost:8080/order

或者

$ kubectl port-forward nodeapp-5d5dc88584-kqr2v 8080:3500

把 pod 里的 dapr sidecar 的 http 端口 3500 映射到 localhost 的 8080。另開(kāi)一個(gè)窗口,執(zhí)行:

$ curl http://127.0.0.1:8080/v1.0/invoke/nodeapp/method/order/

如果想在 redis 里查看最新的 orderid,執(zhí)行下面的命令:

export REDIS_PASSWORD=$(kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" | base64 --decode)
$ kubectl run --namespace default redis-client --rm --tty -i --restart='Never' \
     --env REDIS_PASSWORD=$REDIS_PASSWORD \
    --image docker.io/bitnami/redis:6.0.9-debian-10-r38 -- bash
If you don't see a command prompt, try pressing enter.
I have no name!@redis-client:/$ redis-cli -h redis-master -a $REDIS_PASSWORD
Warning: Using a password with '
-a' or '-u' option on the command line interface may not be safe.
redis-master:6379> hgetall nodeapp||order

原文鏈接:https://www.cnblogs.com/thrillcattle/category/1906168.html

參考資料

[1]

Dapr首次發(fā)布: https://cloudblogs.microsoft.com/opensource/2019/10/16/announcing-dapr-open-source-project-build-microservice-applications/

[2]

Dapr 官方網(wǎng)站: https://dapr.io/

[3]

Actor Model: https://zh.wikipedia.org/wiki/演員模型

[4]

How-To: Install Dapr CLI: https://docs.dapr.io/getting-started/install-dapr-cli/

[5]

Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/

[6]

minikube官方文檔: https://minikube.sigs.k8s.io/docs/start/

[7]

Hello World: https://github.com/dapr/quickstarts/tree/v1.0.0-rc.2/hello-world

[8]

Hello Kubernetes: https://github.com/dapr/quickstarts/tree/v1.0.0-rc.2/hello-kubernetes

瀏覽 75
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 黄色成人网站在线| 国产精品视频你懂的| 久操视频在线| 日批视频网站| 麻豆人妻换人妻好紧| 在线播放一区| 视色网站| 黄色视频导航| 成人免费A片在线观看直播96| 亚洲AV一级| 国产AVwww| 欧美色一级| 国产欧美一区二区三区视频| 久久成人免费视频| 91在线资源| 伊人成色| 91久久国产性奴调教| 国产无码免费在线观看| 巨爆乳肉感一区二区三区| 久久精品无码视频| 99reav| 国产又黄又| 亚洲中字幕| 欧美最猛黑A片黑人猛交蜜桃视频| 成人黄片网| 日韩不卡高清在线观看视频 | 91福利网| 翔田千里无码| 男女日皮视频| 人人操人人| 777av| 狠狠狠狠狠| 乱伦91| 在线观看亚洲视频| 强伦轩一区二区三区四区播放方式| 婷婷精品| 操逼网页| 99久久99| 国产在线一区二区| 日韩精品三区| 日韩AV一区二区三区| 97色综合| 亚洲AV在线观看| 黄片视频大全| 人妻一区二区三区| 欧美猛男的大鷄巴| 日韩国产欧美精品一区| 国产色天使| 日韩午夜欧美精品一二三区| 老鸭窝av免费入口在线观看| 无码av观看| 二区AV| 国产成人女人在线观看| 欧美大香蕉伊人网| 亚洲欧美激情视频| 亚洲1234区| 国产精品3| 久草精品在线| 91官网在线观看| 欧美色图自拍| 欧美操逼操| 99精品自拍| 乱伦内射视频| 久热激情| 蜜桃视频在线观看视频| 大鸡巴久久久久| 人人操人人干人人| 北条麻妃被躁57分钟视频在线| 久久骚| 无码小黄片| 深爱五月天| 日韩免费高清无码| 亚洲a片在线观看| 亚洲视频欧美视频| 欧美日韩中文在线| 翔田千里在线播放| 99在线看| 欧美性BBB槡BBB槡BBB| 伊人精品A片一区二区三区| 91视频在| 免费欧美性爱| 中文区中文字幕免费看| 人人爽久久涩噜噜噜网站| 国产TS变态重口人妖| 91精品在线观看视频| 熟女AV888| 日本中文在线观看| 亚洲黄色免费电影| www一级片| 99热这里有精品| 超碰99热| 五月丁香婷婷色| 九九乱伦| 婷婷精品国产a久久综合| 欧美日韩国产一区二区| 欧美日韩国产一区二区三区| 美女做爱网站| 欧美一区二区三区四区视频| 91视频一区| 强开小嫩苞一区二区三区视频| 日本黄色片| 无码22p| 九九亚洲| 波多野结衣无码一区二区| 欧美a片在线观看| 69国产在线| www.大香蕉伊人| 激情开心站| 一级a一级a爰片免费免免中国A片| 人人操人人爱人人妻| 久草网视频| 久久四区| 久久学生妹| www.俺去| 91精品大屁股白浆自慰久久久| 精品码一区二在线观看| 午夜影音| 亚洲色诱| 人人色人人操| 国产操穴| 欧美成人乱码一区二区三区| 久久久精品一区| 操老女人逼视频| 人人妻天天干| 国产久久在线观看| 青草福利在线| 日本欧美视频| 中日韩一级片| 日韩在线免费观看视频| 海滩AV黑人| 免费看欧美成人A片| 苍井空中文字幕在线观看| 在线看污| 大香蕉久久伊人| 无码人妻熟妇| 69pao| 青青草伊人网| 日逼图| 天堂资源在线| 亚洲国产一区二区三区四区| 国产精品99久久免费黑人人妻| 伊人五月丁香| 韩日av| 久久艹久久| 一级黄片免费观看| 亚洲无码视频免费在线观看| 色五月激情五月| 国产黄色视频在线观看| 俺来了俺去也| 青青操天天干| 成人一区视频| 天天免费视频| 欧美一级aa| 国产做受91一片二片老头| 天天日天天干天天操| 午夜亚洲AV永久无码精品蜜芽 | 国产成人精品毛片| 青青草原免费在线视频| 一级性爽AV毛片| 中文无码一区二区三区| 国产三级自拍视频| 99这里都是精品| 俺来了俺去也| 午夜老司机福利一二三区| 麻豆视频免费观看| 超碰人人爽| 五月婷婷色色| 亚洲v| 18禁裸体美女| 久久六六| 国产1区2区3区中文字幕| 亚洲成人影片在线观看| 国产精品A片守望| 亚洲va在线va天堂va偷拍| 久久精彩| 手机看片1024你懂的| 国产又大又粗又黄| 亚洲日韩激情| 中文人妻第9页| 先锋影音一区二区三区| 色婷婷综合视频| 12——13女人毛片毛片| 成人做爰100部免费网站| 影音先锋男人站| 97人妻精品黄网站| 午夜福利日本| 成人美女视频| 少妇bbw搡bbbb搡bbbb| 全国最大成人网站| av不卡免费观看| yjizz国产| 性爱一级| 高清无码一区二区三区四区| 蜜桃91精品秘入口| 大香蕉伊人导航| 怡春院院成人免费视频| 99热在线观看精品免费| 操逼导航| 日屄视频免费看| 国产精品久久久久久久久久久久久久久久 | 青青草在线播放| 一级a片免费看| 香蕉av在线播放| 国产精品一区二区在线播放| 影音先锋女人av噜噜色| 丁香av| 欧洲天堂在线视频网站| 西西人体444www| 夜夜操夜夜骑| 伊人久久大香线蕉av一区| 国产一级片免费看| 黄色在线免费| 天堂成人在线视频| 一本久道视频一本久道| 免费看一级片| 欧美又大又粗| 欧美精品成人| 中文字幕在线观看a| 四川BBB操BBB| wwwAV在线观看| 爱爱爱免费视频| 波多野结衣无码视频在线观看| 日本久久高清| 伊人影院在线看| 国产理论片在线观看| 亚洲视频免费完整版在线播放| 91操操| 丁香婷婷五月综合影院| 伊人久久五月| 成人高清无码视频| 黄片久久| 国内成人自拍| 翔田千里在线观看| 豆花视频成人版www满18| 97在线超碰| av免费在线播放| 婷婷开心色四房播播在线| 国产精品宾馆| 丁香婷婷五月色成人网站| 久草黄色| 国产精品国产| 欧美日韩视频一区二区三区| 久久久国产AV| 精品久久久国产| 丁香久久| 性爱无码AV| 在线亚洲AV| 暖暖无码| 日韩在线观看| 久久成人影音先锋| 天天操电影| 欧美在线一区二区三区| 你懂的久久| 精品人妻一区二区免费蜜桃| 亚洲欧美日韩一区| 亚洲色图在线观看| 欧美日韩一级黄片| 初尝人妻滑进去了莹莹视频| 国产AV无码成人精品毛片| 免费在线性爱视频| 色悠悠久久综合| 尤物网在线| 成人性生活A级毛片网站| 国产精品宾馆| 久久国产黄色视频| 成人无码视频| 91麻豆视频| 亚洲一本大道| 久久草大香蕉| 日韩精品一区二区三区免费观看高清| 美女性爱3P视频| 日韩极品在线观看| 久久77777| 插菊花综合网1| 日本色中文字幕| 国产豆花视频| 黄色片免费在线观看| AV电影天堂网| 国产口爆在线观看| 大香蕉福利导航| 亚洲视频在线免费| 蜜桃精品视频在线观看| 91精品国产综合久久久不打电影 | 久久97人妻AⅤ无码一区| 亚洲无码成人在线观看| 成人国产精品秘在线看| 亚洲阿v天堂| 91成人电影在线| 木下凛凛子AV888AV在线观看 | 色屁屁草草影院ccyycom| 成人无码一区| 久久依人大香蕉| 国产在线观看免费| 日本在线播放| 国产乱子伦一区二区三| 97欧美| 亚洲美女喷水视频| 日本不卡一区二区三区四区| 一级免费黄色视频| 国产无码激情视频| 唐嫣一级婬片A片AAA| 成人无码人妻| 欧美性爱在线视频| 国产成人精品视频免费看| 亚洲三级毛片| 无码视频一区二区| 日韩资源站| 婷婷爱五月| 俺去也| 色猫咪av| 日韩午夜精品| 国产无遮挡又黄又爽又| 婷婷亚洲天堂| 在线观看无码| 免费日韩一级| 青青草成人网| 欧美十区| 中文乱伦视频| 亚洲国产97| 综合偷拍| 色久综合| 国产免费性爱| 黄色录像一级片| 超碰人人干人人操| 高清无码波多野结衣| 激情AV在线观看| 一级a性色毛片| 久久精品福利视频| 色色色色AV| 夜夜嗨av| 吴梦梦一区二区在线观看| 亚洲日韩免费视频| 日本少妇午夜福利| 日本不卡在线观看| ww久久| 中文字幕88页| 亚洲国产毛片| 国产欧美视频在线| 超碰女人| 国产真人一级a爱做片| 日韩性爱区| 北条麻妃无码一区三区| 亚洲av无码乱码| 伊人在线成人视频| 丁香五月天社区| 91爱爱| 国产香蕉av| 色婷婷黄色| 澳门四虎影院| 北条麻妃一区二区三区在线观看| 日韩成人精品在线| 99成人乱码一区二区三区在线| 成人高清无码在线观看| 日韩无码人妻一区二区三区| 日韩AV小电影| 成人免费内射视频| 亚洲1区2区| 你懂的在线视频观看| 张柏芝BBw搡BBBB槡BBBBHDfree| 国产激情内射| 久久久久亚洲AV成人网人人软件| 黄页免费无码| 婷婷狠狠| 亚洲中字幕| 欧美成人精品AAA| 91无码人妻精品1国产四虎| 99热综合| 国产麻豆精品ThePorn| 天天干天| 国产美女一级特黄大片| 久草视频在线免费播放| 色色五月天婷婷| 高潮无码在线观看| 成人网站视频在线观看| 久久99精品国产.久久久久久| 欧美亚洲三级| 国产45页| 成人高清在线| 亚洲成人性爱网| 97人妻精品一区二区三区软件| 国产精品久久久久野外| 男人V天堂| 欧美,日韩,日| 69福利视频| 亚洲aV影院| 亚洲欧美v| 欧美成综合| 欧美精品秘一区二区三区蜜臀| 一级A片黄色| 日韩无码免费视频| 天天肏天天肏| 做aAAAAA免费视频| 中文字幕乱码亚州无线码日韩理论电 | 性欧美成人播放77777| 在线成人av| 国产噜噜噜噜噜久久久久久久久 | 欧美视频综合网| AV不卡在线| 超碰97成人| 18XXX亚洲HD护士JD| 操逼视频网站免费观看| 一区二区三区四区视频在线| 91九色精品女同系列| 亚洲综合国产| 欧美中文字幕| 欧美成人三级精品| 婷婷玖玖| www.黄色在线观看| 日本国产视频| 国产精品色8| 8050午| 操逼网站免费看| 午夜成人福利在线观看| 日韩欧美二区| 日本99视频| 日韩国产在线观看| 玖玖资源站中文字幕| 在线免费高清无码| 亚洲高清在线观看视频| 青青草原成人视频| aaa在线免费视频| 亚洲国产激情| 蜜桃Av噜噜| 色墦五月丁香| 亚洲国产无码在线| 国产欧美在线| 91黄色视频在线播放| 成人做爰100片免费-百度| 国产娇小13videos糟蹋| 91色色影院| 成人毛片在线观看| 国产黄色视频免费看| 吴梦梦md0069| 日本精品无码a62v在线| 人妻中文字幕av| 免费无码成人片在线观看在线 | 古装一级无遮挡A片| 色婷婷香蕉| 韩国无码精品| 91.www91成人影视在线观看91成人网址9| 亚洲A网站| 97操逼| 水蜜桃成人网| 中文字幕福利电影| 日韩中文字码无砖| 亚洲福利视频电影精| 波多野结衣无码一区二区| 久久久久久久极品内射| 午夜精品秘一区二区三区| 日韩精品一二区| 久久久久久无码精品亚洲日韩麻豆 | 大香蕉一区| 婷婷亚洲天堂| 午夜福利视频无码| 一道本无码一区| 三级毛片网站| 亚洲另类视频| 三级网站免费观看| 男女性爱视频网站| 伊人网站| 麻豆国产精品一区| 亚洲成人电影一区| 国产综合亚洲精品一区二| 精品人无码一区二区三区下载| 日韩无码高清一区| 热久久在线| 波多野结衣AV无码| 亚洲三级黄色视频| 男人的天堂久久| 欧美footjob| 超碰操逼| 12一15女人A片毛| 五月天色婷婷丁香| 尤物免费视频| 午夜乱伦福利| 91中文| 狠狠操综合网| 中文在线a∨在线| 国产美女在线观看| 免费中文资源在线观看| 欧美亚洲天堂网| 2012天天夜夜| 综合成人| 欧洲亚洲在线| 一级A片久久久免费直播间| 日韩欧美网站| 国产女主播在线观看| 日韩精品观看| 91国黄色毛片在线观看| 免费亚洲无码| 亚洲少妇免费| 77777免费观看电视剧推荐爱的教育| 午夜男人天堂| 天干天干天夜夜操| 国产香蕉在线观看| 日韩一区二| 国产综合色婷婷精品久久| 人人香蕉| 91亚洲日韩| xiuxiuav| 亚洲无码影音先锋| 91福利视频网站| 国产免费性爱| 裸体黄色一极大片| 大香蕉伊人久久| 黄色三级毛片| 久久黄色的| 69成人国产| 欧美国产日韩另类| 日韩精品成人电影| 久青草资源福利视频| 91无码影院| 天天操天天操天天操天天| 国产无码一区| 97操逼| 亚洲.欧美.丝袜.中文.综合 | 一区二区无码高清| 五月婷婷综合激情| 日韩一级片视频| 柠檬AV导航| 少妇高潮一区二区三区99| 天美果冻麻豆国产一区| 99re热| 国产在线免费视频| 日韩激情一区二区| 极品少妇视频| 91精品久久久久久| 97视频在线观看免费| 丁香五月中文| 91偷拍与自偷拍精品无码| 中国熟女网站| 日本一级黃色大片看免费| 波多野结衣无码AV专区| 婷婷深爱五月丁香网| 波多野结衣AV无码| a网站在线观看| 免费啪啪视频| 在线播放中文字幕| 亚洲日韩中文无码| 99xav| 久久大香蕉精品| 成人无码日本动漫电影| 一区二区三区免费| 国产女人在线观看| 高清无码中文字幕在线观看| 操B久久| 福利视频中文字幕| 日韩人妻无码一区二区三区中文 | 欧美麻豆| 亚洲国产精品18久久久久久 | 国产嫩草影院| 四川少妇BBB凸凸凸BBB安慰我 | 老司机AV91| 少妇无码视频| 日产无码久久久久久| 欧美日韩亚洲综合| 国产中文字幕在线免费观看| 少妇在线视频| 91小电影| 久久99热这里只频精品6学生| 91人妻人人澡人人澡人人精品| 五月天一区二区三区| 国产suv精品一区二区6精华液 | 精品熟妇| 三级中文无码| 国产女人与禽zOz0性| 无码视屏| 伊人久久福利视频| 日批视频网站| 久操视频在线免费观看| 91成人大片| 另类老妇奶性BBWBBwBBw| 欧美精品三区| 性毛片| 亚洲欧美成人| 高清无码人妻| 一区二区免费看| 九九国产| 色五月婷婷久久| 国产精品秘国产精品88| 欧美色图网址| 国产精品欧美综合在线| 国产黄色免费看| 亚州无码视频| 91精品国产麻豆国产自产在线| 亚洲视频欧美| 最新免费一区二区三区| 一级一级a免一级a做免费线看内裤| 看欧美黄片| 一级A片免费黄色视频| 久久性| а√最新版天堂中文在线| 欧美在线免费观看| 911香蕉视频| 99精品免费观看| 无码av高清| 日本精品三级| 亚洲色777| 夜夜骚精品人妻av一区| 91视频一区二区三区| 青青超碰| 无码不卡在线| 丁香五月婷婷久久| 鸡巴操骚逼视频| 琪琪久久| www.插逼| 成人无码高清在线观看| www.爆操| 高清无码一区二区三区| 色天堂影院| 中文av字幕| 国产一级片免费观看| 亚欧洲精品在线视频免费观看| 在线观看亚洲专区| 欧洲一区在线观看| 国产乱论视频| 手机av网站| 久久免费9| 欧美黄片在线免费看| 激情另类| 亚洲精品一区二区三区蜜桃| 亚洲五月婷婷| 国产在线一区二区| 一级a片免费看| 亚洲永久免费| 伊人天天干| 香蕉操逼视频| 国产精品一区二区性色AV| 亚洲精品色| 亚洲色偷精品一区二区三区| 久久99国产乱子伦...| 欧美激情区| 国产嘿嘿| 亚洲三级av| 国产一级a免一级a免费| 可以看的黄色视频| 欧美日韩一级二级三级| 91精彩视频| 91精品国际| 成人久久AV| 影音先锋无码一区| 人妻无码91| 欧美在线成人网| 亚洲s在线| 久久亚洲日韩天天做日日做综合亚洲| 91丝袜一区二区| 国产精品自拍视频| 日韩A级片| 中文字幕在线观看一区| 日韩无码精品视频| 无码视频免费在线观看| 天天操网| 天堂中文字幕在线观看| 特级西西西西4444级酉西88wwww特| 91av成人| 先锋影音资源av| 你懂的在线播放| 丁香五月激情网| 国产偷拍网站| 成人av无码| 黄页网站免费观看| 人善交精品一区二区三区| 啊啊啊国产| AV在线精品| 亚洲综合一区二区| 丁香五月AV| 日皮视频免费| 婷婷五月av| 无码人妻一区二区一牛影视| 嫩BBB搡BBB搡BBB搡| 狠狠操综合网| 特级西西444WWW大精品视频 | 99re2| 亚洲wwwwww| 国产成人精品亚洲男人的天堂| 国产高清无码免费视频| 久久久久久一区| 一牛影视精品av| 亚洲性爱大全| 亚州在线播放| 国产一区在线观看视频| 91免费成人视频| 亚洲AV女人18毛片水真多| 鲁一鲁在线视频| 欧美日韩中文字幕视频| 久久婷婷在线| 天天日天天操天天摸天天干天日射天天插| 国产农村妇女精品一二区| 色婷婷国产精品综合在线观看| 天堂AV在线免费观看| 哪里能看毛片| 黄色视频网站在线免费观看| 久草免费电影| 日韩无码一区二区三区四区| av电影在线观看| 黄色免费片| 春色激情| 无码高清视频| 亚洲国产精品自在自线| 人人操人人干人人操| 3D精品啪啪一区二区免费| 免费观看黄色一级片| 欧美最猛黑A片黑人猛交蜜桃视频| 久久国产热| 仓井空一区| 亚洲免费视频网| 欧美人人| 在线成人av| 欧美老熟妇乱大交XXXXX| 国产黃色AAA片| 一道本在线观看| 91在线无码精品秘国产三年 | 欧美色国| 欧美亚洲日韩中文字幕| 人人摸人人射| 免费无码高清视频| 尤物视频在线播放| 久久午夜无码鲁片午夜精品男男| 久久无码影院| 大香蕉伊人网视频| 2016超碰| 天啪| 色综合中文字幕| 人妻熟女一区二区| 91人妻精| 国产激情视频在线观看| 无码一级| 天天摸天天添| 午夜精品久久久久久久99热精东| 天天日av| 好吊顶亚洲AV大香蕉色色| 日韩精品一区二区三区黄冈站长| AV片在线免费观看| 暗呦网一区二区三区| 大香蕉操逼| 大香蕉现在视频中心一| 肏逼在线观看| 欧美日韩色视频| 偷拍无码| 狠狠操免费视频| 2025国产成人精品一区| 欧美丰满少妇人妻精品| 97超碰免费| 久久亚洲日韩天天做日日做综合亚洲| 一道本视频在线| 高潮无码在线观看| 视频你懂的| 欧美一级黄色大片| 国产熟妇婬乱A片免费看牛牛| 天天操中文字幕| 日韩成人无码一区二区视频| 三级片在线观看网站| 丁香视频在线观看| 亚洲日韩黄色| 黄片无码免费| 一级片免费视频| 亚洲性爱在线观看| 欧美18禁黄免费网站| 午夜精品18视频国产| 国产日韩二区| 亚洲无码精品一区二区三区| 欧美成人三级在线| 99啪啪| 欧洲黑种人日P视频| 日本少妇bbw| 欧美AⅤ视频| 熟女人妻ThePorn| 成人国产AV精| 懂色aV| 国产顶级理伦| YOUjiZZ欧美大全| 欧美综合婷婷| 午夜成人在线视频| 日韩国产中文字幕| 欧美亚洲视频| 亚欧成人在线视频| 欧美一级特黄真人做受| 日本成人A片| 最新av| 久久久九九九| 三级片日本在线| xxxx日韩| 成人理伦A级A片在线论坛| 自拍三级片| 国产乱国产乱老熟300部视频| 男女精品一区| 成人做爰100片免费着| 蜜桃成人无码区免费视频网站 | av在线免费播放| 久久Av电影| 人人操人人上| 黄网在线播放| 欧美拍拍视频| 精品秘无码一区二区三区老师 | 好逼天天有| 无码av一区| 欧美综合国产| 中文字幕午夜福利| 国产白嫩精品久久久久久| 国产主播中文字幕| 日韩伊人| 南京搡BBBB搡BBBB| 人人操人人透| 91久久婷婷亚洲精品成人| 亚洲成人无码av| 福利视频网站| 国产熟女一区二区三区五月婷 | 亚洲综合在线观看视频| 亚洲福利视频网| 精品无码产区一区二| 亚洲中文无码在线观看| 嫩小槡BBBB槡BBBB槡免费-百度 | 亚洲精品视频免费看| 久久伊人影院| 无码日韩AV| 欧美极品少妇| 亚洲秘一区二区三区-精品亚洲二区-| 国产91无码精品秘入口新欢| 91麻豆福利在线观看| 毛片大香蕉| 体内射精视频| 亚洲欧美人妻| 肏逼网站在线观看| 中文字幕精品1| 亚洲欧美日本在线观看| 精品免费国产一区二区三区四区的使用方法 | 操逼地址| 乱子伦日B视频| jizz在线免费观看| 美女网站黄a| 真人一级毛毛片| 狠狠干天天干| 无码精品ThePorn| 噜噜噜网| 欧美一级A片在线观看| 一级日逼| 成人av黄色三级片在线观看| 麻豆熟妇乱妇熟色A片在线看 | 日逼天堂| 午夜视频在线| 亚洲一区高清| 91免费在线看| 一级av| 蜜臀久久99精品久久久久久宅男 | 色色色99| 国产一级婬片A片免费妖精视频 | 精品色| 很很撸| 黄片毛片| 日韩久久网站| 日本精品二区| 无码AV高清| 中文字幕第23页| 中文字幕精品亚洲熟女| 欧美日韩狠狠操在线观看视频| 99久久亚洲精品日本无码| 激情丁香婷婷| 无码一区二区三区四区五区| 日本一区二区三区视频在线观看| av777777| 久久逼逼| 久草中文在线视频| 中文字幕在线不卡视频| 西西人体WW大胆无码| 这里视频很精彩免费观看电视剧最新| 九九九欧美| 91爽爽| 欧美自拍视频| 热久久在线观看| 韩国精品一区二区| 国外亚洲成AV人片在线观看 | 呦小BBBB小小BBBB| 水蜜桃网站| 日本成人一区二区三区| 亚洲第一毛片| 色哥网在线一区| 亚洲综人网| 国产成人无码免费看片| 无码中文字幕高清| 国产av播放| 波多野结衣成人在线| 黄网在线观看视频| 欧洲一区在线观看| 精品久久久久久久久久| 亚洲天堂视频网| 一区二区三区四区五区无码| 中文字幕日本| 伊人网视频在线播放| 国产黄色片视频| 亚洲成人自拍| 欧美性爱A片| 人妻熟女一区二区| 激情AV在线观看| www.久热| 日本AV在线播放| 国产理论视频在线观看| 伊人影院视频| 欧美日韩黄片| 欧美AAAAAAAAAA特级| 日韩久久免费视频|