使用 Dapr 與 Cilium 打造無 Sidecar 服務網格:新一代分佈式應用運行時

本文探討了將 Dapr 與 Cilium 集成的無 Sidecar 服務網格方法,強調了其高性能和安全性。

閱讀原文請轉到:https://jimmysong.io/trans/integrating-dapr-with-cilium/

幾周前,我們介紹了 Dapr,並討論了它與服務網格的重疊功能,儘管 Dapr 本身並不是一個服務網格。如之前的博客所述,近年來服務網格已成爲現代雲原生應用的關鍵組成部分,提供了諸如流量管理、安全性和可觀測性等關鍵功能。傳統的服務網格依賴於 sidecar 代理,這可能會引入複雜性和性能開銷。而 Cilium 的無 sidecar 服務網格功能通過利用 eBPF 實現高效的內核級網絡處理,結合 Dapr 這一強大的分佈式應用運行時,這種集成承諾提供高性能、增強的安全性和簡化的操作。

無 Sidecar 服務網格的需求

正如這篇文章所討論的,Cilium 最初作爲 Kubernetes 的一種 eBPF 驅動的容器網絡接口(CNI)開始。隨着時間的推移,Cilium 演變成了 Kubernetes 內部網絡的多功能工具。2022 年 7 月,Cilium 服務網格的首個版本發佈,引入了一種利用 eBPF 並在 Linux 內核中運行的無 sidecar 服務網格。

這種服務網格旨在廣泛利用 eBPF,專注於較低層次的網絡(直到第 4 層)以提供其功能。然而,對於一個功能齊全的服務網格,較高層次的功能如服務調用依賴於第 7 層。通常,這些功能需要一個代理來實現重試和斷路等功能。

考慮到 Dapr 及其第 7 層功能,它傳統上運行在基於 sidecar 的模型上。雖然這是準確的,但有一個與無 sidecar 架構相一致的替代方法。

介紹 Dapr 共享

Dapr 共享提供了 Dapr 的另一種部署模型。雖然默認的方法仍然使用 sidecars,但 Dapr 共享允許用戶輕鬆地將 Dapr 運行時(Daprd)部署爲 Kubernetes 內的 DaemonSet(每個節點一個)或 Deployment(每個集羣一個)。這種方法的顯著優勢在於,它在一定程度上將 Daprd 實例的生命週期與實際應用的生命週期解耦。你可能會問:這有什麼好處?有幾種情況下,這種方法是有利的:

通過在這些情況下使用 Dapr 共享,我們仍然可以利用所有構建塊和高級功能,如 mTLS 與服務調用結合使用。

我們的示例案例和架構

理論介紹完畢,現在是時候進行實踐了。我們將設置一個簡單而強大的架構,以演示 Dapr 和 Cilium 服務網格如何協同工作。

在這個設置中,我們將採用前沿技術。Cilium 將處理一般的網絡層,並使用其 Gateway API 實現來管理流入我們演示集羣的南北流量。對於東西流量,我們將利用 Cilium GAMMA 實現,通過 Dapr 共享運行時進行增強,以確保全面的集成。

通過整合這些技術,我們將能夠爲我們的設置添加彈性和其他高級功能。這種架構將展示 Dapr 和 Cilium 之間的無縫協作,爲 Kubernetes 環境提供強大而可擴展的網絡解決方案。

要求

如果你想跟進,你將需要訪問一個 Kubernetes 集羣。這個集羣應該安裝了 Cilium 版本 1.16,配置如下:

你可以按照官方文檔安裝 Cilium。

設置 Gateway API 和網關

如前所述,我們將使用 GatewayAPI 來路由流量進入我們的集羣。這可以通過定義一個 Gateway 資源輕鬆實現,如下所示:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: default-gateway
  namespace: default
spec:
  gatewayClassName: cilium
  listeners:
  - allowedRoutes:
      namespaces:
        from: All
    name: default-http
    port: 80
    protocol: HTTP

有了這個資源並正確安裝 Cilium,你可以運行以下命令來驗證 Gateway 是否已成功編程並具有外部 IP:

kubectl get gateway default-gateway

這應該輸出類似於:

NAME              CLASS    ADDRESS          PROGRAMMED   AGE
default-gateway   cilium   18.192.114.200   True         27h

現在我們已經設置好了 Gateway,我們可以繼續運行一個虛擬應用。

虛擬應用和簡單路由

爲了測試我們的設置,我們將部署由 Traefik Labs 創建的 whoami 鏡像。這個應用顯示 HTTP 請求頭和其他相關信息,這對於驗證我們的配置非常有用。讓我們開始部署並使虛擬應用可訪問。

爲 whoami 應用創建一個服務、部署和 HTTPRoute:

apiVersion: v1
kind: Service
metadata:
  name: whoami
  labels:
    app: whoami
spec:
  ports:
    - name: http
      targetPort: 80
      port: 80
  selector:
    app: whoami
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami-v1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoami
      version: v1
  template:
    metadata:
      labels:
        app: whoami
        version: v1
    spec:
      serviceAccountName: whoami
      containers:
        - image: traefik/whoami
          imagePullPolicy: IfNotPresent
          name: whoami
          ports:
            - containerPort: 80
          env:
            - name: WHOAMI_NAME
              value: "v1"
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: whoami-route-service
spec:
  parentRefs:
  - group: ""
    kind: Service
    name: whoami
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: whoami
      port: 80

部署這些資源後,你可以使用一個簡單的 curl 命令來驗證設置:

curl -v http://18.192.114.200

預期輸出應類似於:

*   Trying 18.192.114.200:80...
* Connected to 18.192.114.200 (18.192.114.200) port 80
> GET / HTTP/1.1
> Host: 18.192.114.200
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Tue, 30 Jul 2024 14:16:41 GMT
< content-length: 350
< content-type: text/plain; charset=utf-8
< x-envoy-upstream-service-time: 6
< server: envoy
<
Name: v1
Hostname: whoami-v1-cd9b4bdf7-ht6dc
IP: 127.0.0.1
IP: ::1
IP: 10.42.0.101
IP: fe80::e0d3:4fff:fe30:95ef
RemoteAddr: 10.42.1.170:35911
GET / HTTP/1.1
Host: 18.192.114.200
User-Agent: curl/8.4.0
Accept: */*
X-Envoy-Internal: true
X-Forwarded-For: 10.42.1.82
X-Forwarded-Proto: http
X-Request-Id: bc928d69-06e2-427b-89f1-fab7c8bfb7e9

* Connection #0 to host 18.192.114.200 left intact

這確認了 whoami 應用是可訪問的,且 GatewayAPI 正確路由流量進入我們的集羣。

安裝 Dapr 運行時

接下來,我們需要在我們的 Kubernetes 集羣中安裝 Dapr 運行時。這可以通過使用現有的 Helm chart 快速完成。執行以下命令安裝 Dapr:

helm upgrade --install dapr dapr/dapr \
--version=1.13 \
--namespace dapr-system \
--create-namespace \
--wait

成功安裝的輸出看起來像這樣:

Release "dapr" has been upgraded. Happy Helming!
NAME: dapr
LAST DEPLOYED: Tue Jul 30 16:09:45 2024
NAMESPACE: dapr-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing Dapr: High-performance, lightweight serverless runtime for cloud and edge

Your release is named dapr.

To get started with Dapr, we recommend using our quickstarts:
https://github.com/dapr/quickstarts

For more information on running Dapr, visit:
https://dapr.io

要驗證所有 Dapr 組件是否正確運行,檢查 dapr-system 命名空間中的 pods:

kubectl get pods -n dapr-system

典型的輸出應顯示所有 Dapr 組件處於運行狀態:

NAME                                    READY   STATUS    RESTARTS   AGE
dapr-operator-c449df54-px8q2            1/1     Running   0          25h
dapr-placement-server-0                 1/1     Running   0          25h
dapr-sentry-774c876df5-h2nhh            1/1     Running   0          25h
dapr-sidecar-injector-78769c6d9-zh2jw   1/1     Running   0          25h

Dapr 成功安裝並且所有組件健康後,我們可以繼續安裝我們的共享實例。

部署 Dapr 共享實例

現在,讓我們設置我們的 Dapr 共享實例。我們需要部署兩個實例:一個用於入口(Cilium Gateway)和一個用於虛擬的 whoami 應用。入口實例將作爲 DaemonSet 部署,而 whoami 實例將作爲 Deployment 部署。

helm upgrade --install ingress-shared oci://registry-1.docker.io/daprio/dapr-shared-chart --set shared.appId=ingress --set shared.strategy=daemonset --set shared.remoteURL=cilium-gateway-default-gateway.default.svc.cluster.local --set shared.remotePort=80 --set shared.daprd.mtls.enabled=true --namespace default

helm upgrade --install whoami-shared  oci://registry-1.docker.io/daprio/dapr-shared-chart --set shared.appId=whoami --set shared.strategy=deployment --set shared.remoteURL=whoami.default.svc.cluster.local --set shared.remotePort=80 --set shared.daprd.mtls.enabled=true --namespace default

執行這些命令後,你可以使用以下命令驗證 Dapr 共享實例是否正在正確運行:

kubectl get pods

你應該看到類似於這樣的輸出:

NAME                                               READY   STATUS    RESTARTS   AGE
ingress-shared-dapr-shared-chart-bfnxc             1/1     Running   0          29s
ingress-shared-dapr-shared-chart-lg62n             1/1     Running   0          21s
whoami-shared-dapr-shared-chart-69fd8658db-kmzph   1/1     Running   0          26s

有了這些共享實例的運行,我們已經成功建立了一個強大的設置來處理應用流量和服務調用。

Daprise 操作

現在來到了有趣的部分:"Dapr 化" 我們的設置!我們將 Dapr 與 Cilium Gateway 和 whoami 應用整合,充分利用 Dapr 的功能。爲了確保所有請求都通過專門的網關的 Dapr 共享實例流動,我們將配置 HTTPRoute 以針對這個 Dapr 實例。Dapr 期望特定的 URL 格式用於服務調用,因此我們將使用 Gateway API 中的 URLRewrite 過濾器來調整請求路徑。

使用以下配置更新之前的 HTTPRoute 資源:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: whoami-route
spec:
  parentRefs:
  - name: default-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    filters:
    - type: URLRewrite
      urlRewrite:
        path: 
          type: ReplacePrefixMatch
          replacePrefixMatch: /v1.0/invoke/whoami.default/method//
    backendRefs:
    - name: ingress-dapr
      port: 3500

我們是如何 "Dapr 化" 它的?

爲了驗證一切是否正常工作,對網關的外部 IP 執行 curl 請求:

curl -v http://18.192.114.200

你應該看到類似於這樣的輸出:

*   Trying 18.192.114.200:80...
* Connected to 18.192.114.200 (18.192.114.200) port 80
> GET / HTTP/1.1
> Host: 18.192.114.200
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 719
< content-type: text/plain; charset=utf-8
< date: Tue, 30 Jul 2024 14:38:18 GMT
< traceparent: 00-00000000000000000000000000000000-0000000000000000-00
< x-envoy-upstream-service-time: 18
< server: envoy
<
Name: v1
Hostname: whoami-v1-cd9b4bdf7-4tmvr
IP: 127.0.0.1
IP: ::1
IP: 10.42.1.30
IP: fe80::7f:66ff:fe14:15ad
RemoteAddr: 10.42.0.60:55178
GET / HTTP/1.1
Host: whoami.default.svc.cluster.local:80
User-Agent: curl/8.4.0
Accept: */*
Accept-Encoding: gzip
Dapr-Callee-App-Id: whoami
Dapr-Caller-App-Id: ingress
Forwarded: for=10.42.0.131;by=10.42

.0.131;host=ingress-shared-dapr-shared-chart-bfnxc
Traceparent: 00-00000000000000000000000000000000-0000000000000000-00
X-Envoy-Internal: true
X-Envoy-Original-Path: /
X-Forwarded-For: 10.42.1.110
X-Forwarded-For: 10.42.0.131
X-Forwarded-Host: ingress-shared-dapr-shared-chart-bfnxc
X-Forwarded-Proto: http
X-Request-Id: 5556df41-f78f-4c98-9526-f5025a787a1e

* Connection #0 to host 18.192.114.200 left intact

從頭文件中,你可以看到 Dapr-Callee-App-Id 和 Dapr-Caller-App-Id,表明流量正確通過 Dapr 實例路由。這個設置確保連接默認通過 mTLS(傳輸)加密,爲我們的通信增加了額外的安全層。我們已經成功地將 Dapr 與 Cilium 的服務網格整合在一起,利用其先進的功能增強了應用的網絡和服務調用。

實現流量轉移使用 Gamma

Dapr 不提供的一個功能,但 Cilium 提供的是流量轉移。幸運的是,通過我們的集成,我們可以利用 Cilium 的 GAMMA(服務網格的 Gateway API)來啓用這個功能。GAMMA 擴展了 Gateway API 以支持集羣內的東西向流量管理,補充其用於南北向流量的用途。要設置流量轉移,我們需要創建一個 HTTPRoute 配置,以便在應用的不同版本之間進行負載平衡。通過利用 GAMMA,你可以在不同版本的應用之間轉移流量,使得部署新功能或進行金絲雀發佈更容易,最小化中斷。首先,我們將部署 whoami 應用的新版本併爲其創建額外的服務。以下是部署 whoami 版本 2 並設置必要服務的 YAML 配置:

apiVersion: v1
kind: Service
metadata:
  name: whoami-v1
  labels:
    app: whoami
    version: v1
spec:
  ports:
    - name: http
      targetPort: 80
      port: 80
  selector:
    app: whoami
    version: v1
---
apiVersion: v1
kind: Service
metadata:
  name: whoami-v2
  labels:
    app: whoami
    version: v2
spec:
  ports:
    - name: http
      targetPort: 80
      port: 80
  selector:
    app: whoami
    version: v2
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami-v2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoami
      version: v2
  template:
    metadata:
      labels:
        app: whoami
        version: v2
    spec:
      serviceAccountName: whoami
      containers:
        - image: traefik/whoami
          imagePullPolicy: IfNotPresent
          name: whoami
          ports:
            - containerPort: 80
          env:
            - name: WHOAMI_NAME
              value: "v2"

接下來,我們配置一個 HTTPRoute 來啓用在 whoami-v1 和 whoami-v2 之間的流量轉移。HTTPRoute 將根據定義的權重將一定比例的流量路由到每個應用版本。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: whoami-route-service
spec:
  parentRefs:
  - group: ""
    kind: Service
    name: whoami
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: whoami-v1
      port: 80
      weight: 50
    - name: whoami-v2
      port: 80
      weight: 50

這裏重要的部分是 parentRefs。雖然在傳統的 Gateway API 中,我們使用這個來綁定該 HTTPRoute 到一個網關,我們在這裏將其綁定到 whoami 服務,啓用 GAMMA 案例。

此外,通過在 backendRef 中定義 weight,我們可以調整我們希望如何轉移流量。爲了確保流量轉移工作正確,你可以進行多次 curl 請求並檢查響應,以驗證流量是否按照指定在 whoami-v1 和 whoami-v2 之間分配。

curl http://18.192.114.200
Name: v1
Hostname: whoami-v1-cd9b4bdf7-4tmvr
IP: 127.0.0.1
IP: ::1
IP: 10.42.1.30
IP: fe80::7f:66ff:fe14:15ad
RemoteAddr: 10.42.0.60:55178
GET / HTTP/1.1
Host: whoami.default.svc.cluster.local:80
User-Agent: curl/8.4.0
Accept: */*
Accept-Encoding: gzip
Dapr-Callee-App-Id: whoami
Dapr-Caller-App-Id: ingress
Forwarded: for=10.42.0.131;by=10.42.0.131;host=ingress-shared-dapr-shared-chart-bfnxc
Traceparent: 00-00000000000000000000000000000000-0000000000000000-00
X-Envoy-Internal: true
X-Envoy-Original-Path: /
X-Forwarded-For: 10.42.1.110
X-Forwarded-For: 10.42.0.131
X-Forwarded-Host: ingress-shared-dapr-shared-chart-bfnxc
X-Forwarded-Proto: http
X-Request-Id: e9d8ab85-8ae7-46a9-8b44-42240d1d6833
---
curl http://18.192.114.200
Name: v2
Hostname: whoami-v2-766bb5fbd5-bfx9j
IP: 127.0.0.1
IP: ::1
IP: 10.42.1.181
IP: fe80::d441:87ff:fea1:d123
RemoteAddr: 10.42.1.27:32774
GET / HTTP/1.1
Host: whoami.default.svc.cluster.local:80
User-Agent: curl/8.4.0
Accept: */*
Accept-Encoding: gzip
Dapr-Callee-App-Id: whoami
Dapr-Caller-App-Id: ingress
Forwarded: for=10.42.0.131;by=10.42.0.131;host=ingress-shared-dapr-shared-chart-bfnxc
Traceparent: 00-00000000000000000000000000000000-0000000000000000-00
X-Envoy-Internal: true
X-Envoy-Original-Path: /
X-Forwarded-For: 10.42.1.64
X-Forwarded-For: 10.42.0.131
X-Forwarded-Host: ingress-shared-dapr-shared-chart-bfnxc
X-Forwarded-Proto: http
X-Request-Id: f1df7207-098c-4a98-8a97-858ce1f9c0ed

你應該會看到基於配置的流量權重,從兩個應用版本收到響應。此外,我們可以查閱 hubble flow 日誌來檢查實際連接情況:

Jul 29 15:18:13.883: kube-system/svclb-cilium-gateway-default-gateway-f455e04d-jljl8:54047 (ingress) -> default/ingress-shared-dapr-shared-chart-g2596:3500 (ID:33809) http-request FORWARDED (HTTP/1.1 GET http://whoami.cloud-native.rocks/v1.0/invoke/whoami.default/method/something)
Jul 29 15:18:13.884: 10.42.1.170:39105 (ingress) <> default/ingress-shared-dapr-shared-chart-g2596:3500 (ID:33809) to-overlay FORWARDED (TCP Flags: ACK, PSH)
Jul 29 15:18:13.884: 10.42.1.170:39105 (ingress)

 -> default/ingress-shared-dapr-shared-chart-g2596:3500 (ID:33809) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 29 15:18:13.890: default/ingress-shared-dapr-shared-chart-g2596:55194 (ID:33809) -> default/whoami-shared-dapr-shared-chart-crmxz:50002 (ID:14274) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 29 15:18:13.890: default/ingress-shared-dapr-shared-chart-g2596:55194 (ID:33809) <- default/whoami-shared-dapr-shared-chart-crmxz:50002 (ID:14274) to-endpoint FORWARDED (TCP Flags: ACK)
Jul 29 15:18:13.891: default/whoami-shared-dapr-shared-chart-crmxz:46028 (ID:14274) -> default/whoami-v1-cd9b4bdf7-gxkvt:80 (ID:26920) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 29 15:18:13.891: default/whoami-shared-dapr-shared-chart-crmxz:46028 (ID:14274) <- default/whoami-v1-cd9b4bdf7-gxkvt:80 (ID:26920) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 29 15:18:13.893: 10.42.1.170:39105 (ingress) <> default/ingress-shared-dapr-shared-chart-g2596:3500 (ID:33809) to-overlay FORWARDED (TCP Flags: ACK)
Jul 29 15:18:13.895: kube-system/svclb-cilium-gateway-default-gateway-f455e04d-jljl8:54047 (ingress) <- default/ingress-shared-dapr-shared-chart-g2596:3500 (ID:33809) http-response FORWARDED (HTTP/1.1 200 15ms (GET http://whoami.cloud-native.rocks/v1.0/invoke/whoami.default/method/something))
Jul 29 15:18:14.405: kube-system/svclb-cilium-gateway-default-gateway-f455e04d-jljl8:54048 (ingress) -> default/ingress-shared-dapr-shared-chart-zxv74:3500 (ID:33809) http-request FORWARDED (HTTP/1.1 GET http://whoami.cloud-native.rocks/v1.0/invoke/whoami.default/method/something)
Jul 29 15:18:14.406: 10.42.1.170:38391 (ingress) -> default/ingress-shared-dapr-shared-chart-zxv74:3500 (ID:33809) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 29 15:18:14.414: default/ingress-shared-dapr-shared-chart-zxv74:55876 (ID:33809) -> default/whoami-shared-dapr-shared-chart-g572c:50002 (ID:14274) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 29 15:18:14.414: default/whoami-shared-dapr-shared-chart-g572c:58854 (ID:14274) -> default/whoami-v2-766bb5fbd5-jvtcd:80 (ID:2184) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 29 15:18:14.414: default/ingress-shared-dapr-shared-chart-zxv74:55876 (ID:33809) <- default/whoami-shared-dapr-shared-chart-g572c:50002 (ID:14274) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Jul 29 15:18:14.415: default/whoami-shared-dapr-shared-chart-g572c:58854 (ID:14274) <- default/whoami-v2-766bb5fbd5-jvtcd:80 (ID:2184) to-endpoint FORWARDED (TCP Flags: ACK, PSH)

這個日誌顯示,流量被重定向到 whoami-v1 以及 whoami-v2。在 hubble UI 中,這也是可見的。

使用網絡策略進行訪問控制

有了 Cilium 處理到 Dapr 的流量,我們可以利用 Cilium 的網絡策略來配置訪問控制。與 Dapr 的訪問控制在第 7 層(應用層)操作不同,Cilium 的方法在更低的網絡堆棧層次上工作,提供更細粒度的控制。

下面是如何使用 Cilium 的 CiliumNetworkPolicy 配置訪問控制:

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: "allow-ingress-shared-to-whoami"
spec:
  endpointSelector:
    matchLabels:
      dapr.io/app-id: whoami
  ingress:
  - fromEndpoints:
    - matchLabels:
         dapr.io/app-id: ingress
    toPorts:
    - ports:
      - port: "50002"
        protocol: TCP
---
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "allow-ingress-to-ingress-shared"
spec:
  endpointSelector:
    matchLabels:
      dapr.io/app-id: ingress
  ingress:
  - fromEntities:
    - ingress
    toPorts:
    - ports:
      - port: "3500"
        protocol: TCP

這兩個策略將限制我們集羣中的流量流向。它們確保只允許 cilium-gateway 連接到 ingress-dapr 實例。類似地,ingress-dapr 實例是唯一允許與 whoami-dapr 實例通信的實體。這個設置確保 Dapr 共享實例是彼此唯一的通信者,增強了安全性和控制。Cilium 在第 3 層和第 4 層應用網絡策略,提供了在流量到達應用層之前的更細粒度控制。這通過在網絡堆棧的早期阻止未經授權的訪問來減少不必要的流量,並通過提升性能來增強性能。

優勢 1 - 本地重定向策略

Cilium 1.16 引入了一個名爲 Local Redirect Policy 的 beta 功能。這個功能允許你將流量重定向到同一節點上的本地端點,而不是在整個集羣中路由。這對於優化流量流和確保某些連接保持本地特別有用。

apiVersion: "cilium.io/v2"
kind: CiliumLocalRedirectPolicy
metadata:
  name: "redirect-ingress"
spec:
  redirectFrontend:
    serviceMatcher:
      serviceName: ingress-dapr
      namespace: default
  redirectBackend:
    localEndpointSelector:
      matchLabels:
        dapr.io/app-id: ingress
    toPorts:
      - port: "3500"
        protocol: TCP

我們將使用這個策略確保從 cilium-gateway 到其 Dapr 共享實例的流量保持在節點上。這種方法將連接保持在同一節點上,確保在流量離開節點之前建立並維持 mTLS。請注意,由於這是一個 beta 功能,你需要在 Cilium 中啓用它。有關啓用此功能的指南,請參閱 Cilium 文檔。

優勢 2 - mTLS 和強身份

將 Cilium 整合到你的設置中的另一個優勢是使用 Cilium 的 mTLS 功能,而不是 Dapr 的。Cilium 通過節點間的 Wireguard 或 IPSec 隧道提供 mTLS,與 Dapr 通過雙向 gRPC 連接使用 mTLS 的方法相比,提供了明顯的好處。

一旦在 Cilium 本身啓用了 mTLS,你可以通過將其附加到 CiliumNetworkPolicy 來在 Cilium 中強制執行 mTLS:

authentication:
    mode: "required"

Cilium 將檢查匹配的強身份以及 mTLS 驗證。

總結

總之,Dapr 與 Cilium 的無 sidecar 服務網格的整合爲微服務架構打開了新的可能性。通過利用 Dapr 共享,我們可以將 Dapr 運行時的生命週期與應用解耦,允許更靈活的部署。Dapr 的強大服務調用能力與 Cilium 的高效、基於 eBPF 的網絡和服務網格功能的結合,使得微服務交互具有高性能、安全性和彈性。

這次演示展示了這些技術如何協調一致,創造了一個簡化服務管理的前沿基礎設施,同時增強了可擴展性和可靠性。Dapr 和 Cilium 的整合代表了構建下一代分佈式應用的重要一步。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/OtjUzi6UfGmAa7Z8gaG2LQ