Posted in: Aws云上云维
AWS ELB使用心得
ELB 是 AWS 的 Managed Load Balancing 服務,可管理 Region 內跨 AZ 的 scalability & HA (在好的雲端架構中,這是一體兩面;並且不能存在 SPOF)。透過官方文件與黑箱測試,可推論其特性如下:
基本功能
- ELB 可設定對外(請求端,Load Balancer protocol)與對內(服務端,Instance Protocol)兩邊的協定;依照選擇不同,常見有幾類作法:
- TCP / TCP : L4 LB
- HTTPS / HTTP: HTTPS termination proxy
- HTTP / HTTP: Reverse proxy
- HTTPS / HTTPS: HTTPS termination with encrypted local traffic
當然也可以逆天亂選 TCP / HTTPS,或 HTTP / SSL;但就責任自負 XD
- 協定相關注意事項如下:
- 作為 SSL or HTTPS termination proxy 時,需要先透過 IAM 上傳 server certificate (註:CF 的 crt 只能透過 aws cli 由 root account 上傳,ELB 無此限制)
- 服務端若使用 https,要注意 ELB (CF 也是) 不接受自簽憑證。花錢吧,寶貝
- 若 ELB 能解析為 http 流量,則可以設定 session stickness;並且 ELB 會設定 X-Forwarded-For 標頭;對於 TCP / SSL / Non-terminated HTTPS 則可開啟 Proxy Protocol Support 以紀錄來源端 IP,詳見官方文件:Enable or Disable Proxy Protocol Support。
- Cross-Zone Load Balancing
若未啟用,ELB 會將流量平均分散給每個 Subnet(每個 AZ 也至多選一個 subnet);啟用後則平均分散給每台活著的 instance。這功能有一陣子了,但以前預設不啟用,現在則預設啟動。 - Connection Draining
新功能,啟動後 ELB 對 instance 會多一種可能狀態(透過 health check 或 AutoScaling 指定)OutOfService: unregistering。在 Connection Draining 指定時間到期前,ELB 會將該機器保持在 unregistering 狀態,而非猛烈斷開連線;而新連線只會分配到 InService 的其他機器。這讓該 instance 上的工作有機會被完成。
運作特性
- ELB 是由 AWS 透過 EC2 instance 實做;雖說 instance 不會出現在 EC2 Instances 列表中,但其 ENI 可以在 Network Interfaces 中看到
- 建立 ELB 後,會產生至少兩個 ENI,並分配在所指定的每個 AZ (Subnet) 下;合理懷疑每張 ENI 後面隱藏一台 ELB vm。每張 ENI 帶有 public IP,而 ELB 給予的 DN 會指向這些 IP 且隨機排序,以平均分配往 LB instance 的流量。
- 當流量增加時,ELB 會自動 scale out,從而增加 ENI 數量,也消耗該 subnet 可用 IP。
- ELB autoscaling 的原則很謎團,似乎是積極 scale out,消極 scale in,以每個 AZ 各 2+ 張 ENI 為目標。
各種手賤、除錯與恢復
- 常見外部錯誤(包含頁面無法顯示,與錯誤認知)
- Security Group / NetACL
- Routing Table (VPC)
- Detached ELB ENI
這或許算是 AWS 設計不良。Network Interfaces 頁面無法修改 SG 還算合理,畢竟可以強迫到 Load Balancer 那頁設定;但能夠 Detach ELB ENI 是那招… 拆下來就裝不回去了。
手賤以後,該 Public IP 還是會出現在 DN 正解回覆中,但 ENI 已經不持有該 IP,因而瀏覽器隨機 timeout。- 判斷依據:在 Network Interfaces 發現狀態為 Available (藍球) 的 ELB ENI
- 解決方案:修改 Load Balancer 設定,取消該 Subnet 後存檔,再重新啟用該 Subnet
- ELB instance down
以前 EC2 常常會有機器卡住但又通過 health check,如果 ENI 全亮,Security Group 與 NetACL 都正確,但裡面外面就是打不到那個 internal and public IP,有可能是 ELB instance down。
比照前項,取消再加回該 Subnet 可能可以解決問題;要是不行,就新建 ELB,再透過調整 CName 將用戶導至新群組。