成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Ingres 訪問 Dapr 應用

云計算 云原生
文中使用的兩種入口方案各有優缺點,方案 1 架構簡單,也是我們常用的方案;方案 2 中相當于將入口控制器聲明為 Dapr 應用,實際上暴露的是 Dapr 的 API,在實現上更像是一個全局的應用運行時。

在 ??上一篇?? 文章中分享了分布式運行時 Dapr 的使用,在示例中將狀態存儲能力分離到 Dapr 運行時中,應用通過 Dapr API 來使用該能力。這篇文章將介紹如何通過 Ingress Controller(入口控制器)來訪問 Dapr 應用。

方案

如何公開 Dapr 應用的訪問,方案有兩種:

  1. 像傳統用法一樣,配置應用的 Service 作為后端,由入口控制器直接將流量轉發到應用容器,簡單說就是支持自動配置的 L7 負載均衡器。
  2. 不直接訪問應用容器,而是通過 Daprd 運行時來訪問。這時,我們就需要將入口控制器也聲明為 Dapr 應用,為其注入 Daprd 運行時容器。此時創建入口規則指向的后端,則是 Ingress 的 Dapr Service。

兩種方案各有優劣,前者架構簡單;后者雖然引入 Daprd 容器,架構復雜,消耗了更多的資源,但也因此可以使用 Dapr 的服務治理能力,如超時、重試、訪問控制等等。

接下來我們將通過示例來分別驗證兩種方案。

圖片

演示

前置條件

  • helm
  • dapr cli
export INSTALL_K3S_VERSION=v1.23.8+k3s2
curl -sfL https://get.k3s.io | sh -s - --disable traefik --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config

安裝 Dapr

dapr init --kubernetes --wait

安裝入口控制器

這里使用 Flomesh 的入口控制器。通過 valus.yaml? 為入口控制器添加 dapr 相關的注解。這里需要注意由于默認情況下 Daprd 運行時監聽的端口是綁定在回環地址上的,而 Ingress 向后端轉發請求時使用的是 Pod IP,因此需要注解 dapr.io/sidecar-listen-addresses: "[::],0.0.0.0" 讓 Daprd 運行時可以接收來自 Pod IP 的請求。

# values.yaml
fsm:
ingress:
podAnnotations:
dapr.io/sidecar-listen-addresses: "[::],0.0.0.0"
dapr.io/enabled: "true"
dapr.io/app-id: "ingress"
dapr.io/app-port: "8000"
dapr.io/enable-api-logging: "true"
dapr.io/config: "ingressconfig"
helm repo add fsm https://charts.flomesh.io
helm repo update

helm install \
--namespace flomesh \
--create-namespace \
--versinotallow=0.2.1-alpha.3 \
-f values.yaml \
fsm fsm/fsm

部署示例應用

示例應用我們使用 kennethreitz/httpbin,為其添加 dapr 相關的注解。

kubectl create ns httpbin

kubectl apply -n httpbin -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: httpbin
name: httpbin
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
strategy: {}
template:
metadata:
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "httpbin"
dapr.io/app-port: "80"
dapr.io/enable-api-logging: "true"
dapr.io/config: "httpbinconfig"
labels:
app: httpbin
spec:
containers:
- image: kennethreitz/httpbin
name: httpbin
resources: {}
---
apiVersion: v1
kind: Service
metadata:
labels:
app: httpbin
name: httpbin
namespace: httpbin
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: httpbin
EOF

方案 1

參考 Flomesh Ingress 的 文檔[1],創建入口規則使用 Service httpbin 作為后端。

kubectl apply -n httpbin -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpbin
annotations:
pipy.ingress.kubernetes.io/rewrite-target-from: ^/httpbin/?
pipy.ingress.kubernetes.io/rewrite-target-to: /
spec:
ingressClassName: pipy
rules:
- http:
paths:
- backend:
service:
name: httpbin
port:
number: 80
path: /httpbin
pathType: Prefix
EOF

使用主機 IP 地址和入口控制器的 80? 端口來訪問 /httpbin/get?,由于上面配置了路徑重寫,最終請求 /get 將會被發送到目標 Pod。

curl HOST_IP:80/httpbin/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Connection": "keep-alive",
"Content-Length": "0",
"Host": "20.239.95.81:80",
"User-Agent": "curl/7.86.0"
},
"origin": "10.42.0.18",
"url": "http://20.239.95.81:80/get"
}

方案 2

方案 2 也同樣需要配置入口規則,只是這次后端服務配置的入口控制器的 Dapr Service?,通過 kubectl get svc -n flomesh? 就可以找到名字帶有 -dapr? 后綴的 Service。

kubectl apply -n flomesh -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dapr
annotations:
pipy.ingress.kubernetes.io/rewrite-target-from: ^/dapr/?
pipy.ingress.kubernetes.io/rewrite-target-to: /
spec:
ingressClassName: pipy
rules:
- http:
paths:
- backend:
service:
name: ingress-dapr
port:
number: 80
path: /dapr
pathType: Prefix
EOF

仍然是訪問 httpbin? 的路徑 /get?,但是訪問方式要遵循 Dapr 服務調用的 API[2]:通過請求頭指定 dapr-app-id? 為 httpbin.httpbin。由于入口控制器和目標應用不在同一命名空間下,在應用 id 需要帶上其命名空間。

同樣是成功返回,但是可以看到最終應用收到請求頭部會多了一些信息,這些信息都是來自 Daprd 運行時,比如 Dapr-Caller-App-Id、"Dapr-Callee-App-Id? 標識表示請求的發起方和接收方;Forwarded 標識了發起請求的主機名。如果開啟了 tracing,還會有鏈路相關的信息(本示例中并未開啟)。

curl HOST_IP:80/dapr/get -H 'dapr-app-id:httpbin.httpbin'
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip",
"Connection": "keep-alive",
"Dapr-App-Id": "httpbin.httpbin",
"Dapr-Callee-App-Id": "httpbin",
"Dapr-Caller-App-Id": "ingress",
"Forwarded": "for=10.42.0.18;by=10.42.0.18;host=fsm-ingress-pipy-864d8d9c76-4kb7r",
"Host": "127.0.0.1:80",
"Proto": "HTTP/1.1",
"Protomajor": "1",
"Protominor": "1",
"Referer": "",
"Traceparent": "00-00000000000000000000000000000000-0000000000000000-00",
"User-Agent": "curl/7.86.0",
"X-Forwarded-Host": "fsm-ingress-pipy-864d8d9c76-4kb7r"
},
"origin": "10.42.0.18",
"url": "http://fsm-ingress-pipy-864d8d9c76-4kb7r/get"
}

訪問控制

文章開頭提到使用 方案 2 雖然帶來了延遲增加了復雜度,但是可以使用 Dapr 的服務治理能力。這里以 Dapr 的訪問控制功能[3] 為例。

不知道大家注意到沒,在部署入口控制器和示例應用時,有個注解 dapr.io/config: xxx?。這個注解是為應用的 Daprd 運行時指定配置,運行時啟動時會從名為 xxx 的 Configuration 資源讀取配置。

執行下面的命令為 httpbin? 應用設置訪問控制規則:默認拒絕所有請求,只允許 flomesh? 命名空間下的 id 為 ingress? 的應用通過 GET? 方式訪問路徑 /get。更多訪問控制配置,可以參考 Dapr 訪問控制官方文檔[4]。

kubectl apply -n httpbin -f - <<EOF
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: httpbinconfig
spec:
accessControl:
defaultAction: deny
trustDomain: "public"
policies:
- appId: ingress
defaultAction: deny
trustDomain: 'public'
namespace: "flomesh"
operations:
- name: /get
httpVerb: ['GET']
action: allow
EOF

應用配置之后,需要重啟應用。

kubectl rollout restart deploy httpbin -n httpbin

等到重啟完成,再訪問 /get 路徑,正常響應。

curl HOST_IP:80/dapr/get -H 'dapr-app-id:httpbin.httpbin'
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip",
"Connection": "keep-alive",
"Dapr-App-Id": "httpbin.httpbin",
"Dapr-Callee-App-Id": "httpbin",
"Dapr-Caller-App-Id": "ingress",
"Forwarded": "for=10.42.0.40;by=10.42.0.40;host=fsm-ingress-pipy-864d8d9c76-jctcx",
"Host": "127.0.0.1:80",
"Proto": "HTTP/1.1",
"Protomajor": "1",
"Protominor": "1",
"Referer": "",
"Traceparent": "00-00000000000000000000000000000000-0000000000000000-00",
"User-Agent": "curl/7.86.0",
"X-Forwarded-Host": "fsm-ingress-pipy-864d8d9c76-jctcx"
},
"origin": "10.42.0.40",
"url": "http://fsm-ingress-pipy-864d8d9c76-jctcx/get"
}

但是,如果是訪問路徑 /headers?,會收到下面的響應:被禁止訪問 /headers。

curl HOST_IP:80/dapr/headers -H 'dapr-app-id:httpbin.httpbin'
{
"errorCode": "ERR_DIRECT_INVOKE",
"message": "fail to invoke, id: httpbin.httpbin, err: rpc error: code = PermissionDenied desc = access control policy has denied access to appid: ingress operation: headers verb: GET"
}

總結

文中使用的兩種入口方案各有優缺點,方案 1 架構簡單,也是我們常用的方案;方案 2 中相當于將入口控制器聲明為 Dapr 應用,實際上暴露的是 Dapr 的 API,在實現上更像是一個全局的應用運行時。

參考資料

[1] 文檔: https://fsm-docs.flomesh.io/docs/demos/ingress_basics

[2] Dapr 服務調用的 API: https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services/

[3] Dapr 的訪問控制功能: https://docs.dapr.io/operations/configuration/invoke-allowlist/

[4] Dapr 訪問控制官方文檔: https://docs.dapr.io/operations/configuration/invoke-allowlist/

責任編輯:武曉燕 來源: 云原生指北
相關推薦

2022-10-13 06:46:05

Dapr訪問控制策略

2022-07-08 22:23:40

DaprRedis分布式

2023-02-11 12:47:07

2009-07-20 10:46:09

Ingres數據庫

2021-08-24 15:10:01

Dapr工具庫應用程序

2022-09-25 22:19:24

Dapr分布式追蹤

2022-09-21 21:50:18

Dapr消息隊列

2022-09-29 07:27:50

DaprKubernetes

2022-09-19 16:08:31

Dapr發布訂閱

2021-08-02 09:40:57

Dapr阿里云Service Mes

2025-01-08 10:41:56

2010-09-29 16:38:03

企業應用訪問

2022-09-27 21:32:14

Dapr指標與日志

2013-06-07 10:46:48

深信服應用交付應用訪問

2010-08-06 10:10:17

思科路由器動態訪問列表

2019-07-31 08:11:46

ACL訪問控制列表網絡通信

2022-09-30 06:36:25

DaprFastHTTP

2012-08-27 09:28:07

JavaPython

2009-07-20 16:40:55

JDBC訪問SQL S

2009-09-02 15:08:47

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久伊人一区 | 自拍偷拍中文字幕 | 久草新在线 | 亚洲天堂男人的天堂 | 欧美日韩一区在线 | 久草在线在线精品观看 | 精品国模一区二区三区欧美 | 91精品国产91久久久久久不卞 | 97精品久久| 亚洲高清视频在线观看 | 天天澡天天狠天天天做 | 日本一区二区不卡 | v亚洲| 人人天天操 | 国产高清一区二区 | 久久久青草婷婷精品综合日韩 | 97国产精品视频人人做人人爱 | 91国自产 | 91精品国产自产在线老师啪 | 成人a视频在线观看 | 超碰高清| 亚洲一区二区免费视频 | 国产综合久久久久久鬼色 | 亚洲精品久久久久久久久久久 | 国产成人福利在线 | 久久久久久免费看 | 亚洲欧美在线免费观看 | 国产在线精品一区二区 | 九七午夜剧场福利写真 | 国产高清视频一区二区 | 国产视频久久久 | 色综合久 | 日韩成人免费av | 日韩电影在线一区 | 欧美一区二区三区四区在线 | 亚洲人人 | 国产一区二区不卡 | 91欧美 | 青青草原精品99久久精品66 | 伊人狠狠干| 男人天堂网址 |