Swarm mode 上線 5 - load balancer | 負載平衡器
科技新知

MacauYeah・2024-10-28
前面我們一直談 swarm 的設定,但對於真實的服務,我們還要考慮客戶端是如何連接我們的伺服器群集。通常網路服務,客戶端都會經過域名轉換成IP,然而通過IP連線服務。 Ingress Network 假設我們 swarm 內有5個節點,那到底域名應該指向我們哪一個節點的 IP 呢? 如果我們不考慮節點死機的話,其實5個節點的IP都可以。因為 swarm 會自動把同一個公開的 port ,在每一個節點上都可以訪問到。 以下例子,即使只有一個 container 運行,佔用 port 8888,它還是會在5個節點上全開。 swarm 通過自己的 ingress network,它所有節點的 8888 串連起來。 services http image bretfisherhttpenv ports 88888888 deploy replicas 1 update_config delay 10s restart_policy condition onfailure 我們可以在每個節點上,都會找到這個 ingress network,而且那個Network ID,應該是一樣的 gt; docker network ls grep ingress t7rmk6g9zybm ingress overlay swarm 如果上述的 service 的 replicas 調成大於1的數量, ingress network 還會方便地自動 round robin 輪替 地分派流量,達到最簡單的負載平衡。 Virtual IP 前述的設定,我們有一最大的假設,就是節點不會死機。但實際情況下,各種原因,例如安全性更新、重啟中,都會讓節點暫時無法使用。即使所有 service 都是會自動 failover 故障轉移,但客戶端還是用舊機 IP ,它還是無法訪問。因為該機 IP 已無法使用,除非我們連 IP 也懂 failover。這時, Virtual IP 就是我們的救命靈藥。 在 ubuntu 上,我們可以經過 keepalived 去設定 Virtual IP aptget update amp;amp; aptget install keepalived y 然後設定 keepalived , 假設 172.22.1.5 是我們的 Virtual IP 。 然後每個節點都要加入conf # vim etckeepalivedkeepalived.conf # assume failover ip is 172.22.1.5 vrrp_instance VI_1 # change interface according to machine status interface eth1 state MASTER # 101 for node1, 102 for node2 # you can start seq from other value, remind unqiue for each node is ok; virtual_router_id 101 # lower value will become master # ex, node1 priority 100, node2 priority 200, node3 priority 150. # if node 1, 2, 3 alive, node2 will become master. # if node 2 gone, node 3 will become master. priority 100 advert_int 1 authentication auth_type PASS auth_pass YOUR_RANDOM_PASSWORD virtual_ipaddress 172.22.1.5 上述需要特別注意的是 virtual_router_id 每個節點應該都要不一樣,以作唯一標識。 priority 每個節點應該都要不一樣,最大的那個節點,就會優先使用 Virtual IP 。 auth_pass 每個節點都相同,但大家在抄時,記得更改。 還有的是開通 iptables ,讓各個節點可以經網絡廣播的方式互相看到對方。 iptables I INPUT d 224.0.0.08 j ACCEPT iptables I INPUT p vrrp j ACCEPT systemctl restart keepalived