Layer 7 Routing


在 Docker EE UCP 3.x 有一個 L7 Routing (Interlock) 功能可以輔助佈署在 Docker Swarm 平台的 web 應用與其客戶端保持固定的 session 。

下面例子是在已建置好的 Docker EE (引擎版本 18.09 )的叢集環境中進行,在叢集中也安裝了 UCP ,版本 3.1.1 ,並採用了配置 cookie 的方式來達成 Session Persistence,其他配置方法將另文描述。使用Cookie的方式需要指定Web應用裡用到的Cookie的名字。需要Web應用來配合。

首先,在 UCP 啟動 L7 Routing (Interlock):
登入 UCP ,左邊菜單 Admin Settings > Layer 7 Routing > Enable Layer 7 Routing


預設是關閉狀態,點選啟用 Layer 7 Routing.


之後,在所要佈署的微服務應用的 compose yaml 文件中,加入3個 labels, 具體寫法可以參考下面 compose yaml 片段:


# a sample of compose yaml for session persistence
version: 3.3
services:
 web1:
  image: web1
  labels:
    com.docker.lb.hosts: "app.local"
    com.docker.lb.port: "8000"
    com.docker.lb.sticky_session_cookie: "session"


其中,
com.docker.lb.hosts 是佈署在平台上的應用 domain name 可用其中一個實體節點 domain name 代替;
com.docker.lb.port 是這個微服務應用程式所發布服務的 port ;
com.docker.lb.sticky_session_cookie 這裡填Web應用裡預定義Cookie的名字,使得建立 service 的同時也建立 cookie, 對於同一個來源其後續的請求都會固定在同一個容器實體來回應;

使用 docker stack deploy 執行佈署之後,可以通過 curl 來查看 cookie ,

$ curl -vs -c cookie.txt -b cookie.txt -H "Host: app.local" http://127.0.0.1:8000

注意來自於服務的 Set-Cookie 以及 x-upstream-addr 封包欄位內容。

背後的實現是用 http://nginx.org/en/docs/http/ngx_http_upstream_module.html#hash來做的。(interlock-proxy 意味著一個 Nginx 反向代理服務器)。Cookie方式實際上是Nginx 對 Cookie 來做 hashing。

在後端服務發生變化的情況下(某些副本數量發生變化),會有少部分的密鑰被重定向到不同的後端服務器,從而可能會有部分用戶需要重新登錄(假設web應用使用session的話)

留言

這個網誌中的熱門文章

Docker 環境下的 Proxy 配置