內部網路通訊
同一專案中的服務透過內部主機名稱互相存取:
<hostname>.zenavo.internal例如,API 連線 postgresql.zenavo.internal:5432。新服務的主機名由它的名稱生成(My API → my-api,第二個 PostgreSQL → postgresql-2);可以在服務的 設定 中的 內部主機名稱 修改。服務 網路 分頁的 內部 下會顯示這個位址。流量只在伺服器內部流轉;不同專案之間無法存取彼此的服務。
網域解析
內部網路位址是伺服器解析器上真實的 DNS 名稱,所以在任何地方都能用:系統解析器、dig 和 nslookup,以及自己查詢 DNS 的程式,例如在 proxy_pass 中使用變數時 nginx 的 resolver,或者自帶解析器的 Go 和 Node 用戶端。讓 nginx 使用容器 /etc/resolv.conf 中的 nameserver:
resolver 10.43.0.10 valid=10s; # /etc/resolv.conf 中的 nameserver 行
set $api api.zenavo.internal;
location / { proxy_pass http://$api:8080; }一個名稱只會解析到發起查詢的服務所在專案中的服務:api.zenavo.internal 在每個專案中指向不同的服務,專案中沒有任何服務使用的名稱不會返回位址。服務 ID 也可以作為名稱使用(svc-k3j9x2ab.zenavo.internal)。每個容器的 /etc/hosts 中也列出了專案的內部網路位址,作為後備。
解析結果是一條指向服務叢集名稱(api.<project namespace>.svc.cluster.local)的 CNAME,後面跟著它的位址;請在設定中使用 zenavo.internal 名稱,因為叢集名稱是內部細節,可能會變化。
在剛接入的伺服器上,內部網路 DNS 會在第一次部署後一兩分鐘開始工作;這段時間由 /etc/hosts 兜底。
修改主機名
新的主機名在服務下次部署時生效,舊的名稱屆時停止解析。使用 ${CONTAINER_HOSTNAME} 的變數(資料庫服務共享的變數就是這樣)會自動跟著變;直接寫了舊位址的地方,例如你自己寫的連線字串,需要手動更新。
服務 ID
每個服務還有一個永久的隨機 ID,例如 svc-k3j9x2ab,顯示在服務名稱下方和它的 設定 中。儲存卷、日誌和 API 路由都使用它,所以修改服務名稱或主機名不會移動任何資料。
被移除的服務的儲存卷會保留在伺服器上,直到專案被刪除,所以它的 ID 永遠不會分配給其他服務。
在主機名功能出現之前建立的服務,ID 由名稱生成(postgresql),在你選擇新主機名之前,它也是服務的主機名。
連接埠
內部 下的 暴露連接埠 用於新增服務監聽的連接埠。每個連接埠包括:
連接埠和網域的修改會立即生效:Zenavo 儲存後會重新部署專案。