Lý Thuyết Cốt Lõi
1. Tổng Quan Azure Load Balancer
Azure Load Balancer là dịch vụ Layer 4 (TCP/UDP) phân phối lưu lượng đến đến nhiều backend instance. Hoạt động ở transport layer, không đọc nội dung HTTP — khác với Application Gateway (Layer 7). Phù hợp cho workload cần throughput cao, độ trễ thấp.
- • Frontend IP configuration: địa chỉ IP public hoặc private mà client kết nối đến
- • Backend pool: tập hợp VM hoặc VMSS nhận traffic
- • Health probe: kiểm tra trạng thái backend instance (TCP/HTTP/HTTPS)
- • Load balancing rule: ánh xạ frontend IP:port → backend pool:port
- • Inbound NAT rule: chuyển tiếp port cụ thể đến VM cụ thể trong pool
- • 5-tuple hash (mặc định): source IP, source port, dest IP, dest port, protocol → đảm bảo cùng flow đến cùng backend
- • 2-tuple hash: chỉ source IP + dest IP → cùng client đến cùng backend
- • 3-tuple hash: source IP + dest IP + protocol
- • Session persistence: None / Client IP / Client IP and protocol
2. Public Load Balancer vs Internal Load Balancer
| Đặc điểm | Public Load Balancer | Internal Load Balancer |
|---|---|---|
| Frontend IP | Public IP address (có thể là Static) | Private IP từ subnet trong VNet |
| Mục đích | Xử lý traffic từ Internet vào backend VM | Cân bằng tải nội bộ giữa các tier (VD: web → app → DB) |
| Use case | Web servers công khai, API gateway tier | App server tier, database cluster, SAP HANA |
| SNAT outbound | Tự động cung cấp SNAT cho backend VM ra Internet | Không cung cấp SNAT — VM cần NAT Gateway hoặc Public IP riêng |
Internet → Public LB → Web VMs → Internal LB → App VMs → Internal LB → DB VMs. Mỗi tier có LB riêng, tách biệt traffic và tăng tính sẵn sàng.
Standard LB cho phép cấu hình Outbound rules kiểm soát SNAT: chọn frontend IP, số port SNAT allocation, và protocol. Tránh SNAT exhaustion cho workload có nhiều outbound connection.
3. SKU Basic vs Standard — So Sánh Chi Tiết
| Tính năng | Basic SKU | Standard SKU |
|---|---|---|
| Backend pool | Tối đa 300 instance, cùng Availability Set/VMSS | Tối đa 1000 instance, bất kỳ VM trong VNet |
| Health probes | TCP, HTTP | TCP, HTTP, HTTPS |
| SLA | Không có SLA | 99.99% |
| Availability Zones | Không hỗ trợ | Zone-redundant, zonal frontend |
| HA Ports | Không | Có (cân bằng tải tất cả port cùng lúc) |
| Outbound rules | Không | Có (kiểm soát SNAT tường minh) |
| Bảo mật mặc định | Mở tất cả inbound | Đóng tất cả inbound — phải tạo NSG rule cho phép |
| Chi phí | Miễn phí (chỉ tính data processed) | Tính phí theo giờ + data processed |
4. Backend Pools, Health Probes & Load Balancing Rules
- • Định nghĩa bằng NIC (IP-based) hoặc VMSS
- • Standard LB: thêm VM từ bất kỳ subnet trong VNet
- • Tự động cập nhật khi scale VMSS
- • Một VM có thể thuộc nhiều backend pool
- • TCP probe: thử kết nối port, không gửi data
- • HTTP probe: gửi GET, mong 200 OK
- • HTTPS probe: giống HTTP nhưng qua TLS
- • Interval: 5–15s (mặc định 15s)
- • Unhealthy threshold: số lần fail liên tiếp (mặc định 2)
- • Instance down → LB ngừng gửi traffic đến instance đó
- • Frontend IP + port → Backend pool + backend port
- • Protocol: TCP hoặc UDP
- • Session persistence: None / Client IP / Client IP+Protocol
- • Floating IP: bật khi cần DSR (Direct Server Return) hoặc SQL AlwaysOn AG
- • Idle timeout: 4–30 phút (TCP)
- • HA Ports rule (Standard): protocol=All, port=0 → cân bằng tất cả port
Cho phép truy cập trực tiếp vào từng VM riêng lẻ qua port cụ thể. VD: frontend port 50001 → VM1:22 (SSH), 50002 → VM2:22. Thường dùng để admin từng VM mà không cần public IP riêng. NAT Rule Pool (Standard LB) tự động map port range cho VMSS instances.
Bài Tập Thực Hành (Lab)
Tạo Resource Group, VNet, Subnet và 2 VM backend
# Tạo Resource Group
az group create \
--name rg-az104-m14 \
--location southeastasia
# Tạo VNet và subnet
az network vnet create \
--resource-group rg-az104-m14 \
--name vnet-m14 \
--address-prefix 10.14.0.0/16 \
--subnet-name snet-backend \
--subnet-prefix 10.14.1.0/24
# Tạo NSG cho backend subnet
az network nsg create \
--resource-group rg-az104-m14 \
--name nsg-m14-backend
# Cho phép HTTP (80) từ mọi nguồn (Standard LB đóng mặc định)
az network nsg rule create \
--resource-group rg-az104-m14 \
--nsg-name nsg-m14-backend \
--name Allow-HTTP \
--priority 100 \
--protocol Tcp \
--destination-port-range 80 \
--access Allow
# Cho phép SSH (22) để quản trị
az network nsg rule create \
--resource-group rg-az104-m14 \
--nsg-name nsg-m14-backend \
--name Allow-SSH \
--priority 110 \
--protocol Tcp \
--destination-port-range 22 \
--access Allow
# Gán NSG vào subnet
az network vnet subnet update \
--resource-group rg-az104-m14 \
--vnet-name vnet-m14 \
--name snet-backend \
--network-security-group nsg-m14-backend
# Tạo Availability Set để VM hưởng SLA
az vm availability-set create \
--resource-group rg-az104-m14 \
--name avset-m14 \
--platform-fault-domain-count 2 \
--platform-update-domain-count 5
# Tạo VM1 (web server)
az vm create \
--resource-group rg-az104-m14 \
--name vm-m14-web01 \
--image Ubuntu2204 \
--size Standard_B1s \
--availability-set avset-m14 \
--vnet-name vnet-m14 \
--subnet snet-backend \
--nsg "" \
--public-ip-address "" \
--admin-username azureuser \
--generate-ssh-keys \
--custom-data '#!/bin/bash
apt-get update -y
apt-get install -y nginx
echo "<h1>Web Server 01 - vm-m14-web01</h1>" > /var/www/html/index.html
systemctl enable nginx && systemctl start nginx'
# Tạo VM2 (web server)
az vm create \
--resource-group rg-az104-m14 \
--name vm-m14-web02 \
--image Ubuntu2204 \
--size Standard_B1s \
--availability-set avset-m14 \
--vnet-name vnet-m14 \
--subnet snet-backend \
--nsg "" \
--public-ip-address "" \
--admin-username azureuser \
--generate-ssh-keys \
--custom-data '#!/bin/bash
apt-get update -y
apt-get install -y nginx
echo "<h1>Web Server 02 - vm-m14-web02</h1>" > /var/www/html/index.html
systemctl enable nginx && systemctl start nginx'
Tạo Standard Public Load Balancer và cấu hình Frontend IP
# Tạo Standard Public IP (bắt buộc dùng với Standard LB)
az network public-ip create \
--resource-group rg-az104-m14 \
--name pip-m14-lb \
--sku Standard \
--allocation-method Static \
--zone 1 2 3
# Tạo Standard Public Load Balancer
az network lb create \
--resource-group rg-az104-m14 \
--name lb-m14-public \
--sku Standard \
--public-ip-address pip-m14-lb \
--frontend-ip-name feip-m14 \
--backend-pool-name bepool-m14
# Kiểm tra LB đã tạo
az network lb show \
--resource-group rg-az104-m14 \
--name lb-m14-public \
--query "{name:name, sku:sku.name, frontendIPs:frontendIPConfigurations[0].publicIPAddress.id}" \
-o table
# Lấy Public IP của LB để test sau
LB_IP=$(az network public-ip show \
--resource-group rg-az104-m14 \
--name pip-m14-lb \
--query ipAddress -o tsv)
echo "Load Balancer Public IP: $LB_IP"
Thêm VM vào Backend Pool, tạo Health Probe và Load Balancing Rule
# Lấy NIC ID của từng VM
NIC1_ID=$(az vm show \
--resource-group rg-az104-m14 \
--name vm-m14-web01 \
--query "networkProfile.networkInterfaces[0].id" -o tsv)
NIC2_ID=$(az vm show \
--resource-group rg-az104-m14 \
--name vm-m14-web02 \
--query "networkProfile.networkInterfaces[0].id" -o tsv)
# Thêm VM1 vào backend pool
az network nic ip-config update \
--resource-group rg-az104-m14 \
--nic-name $(basename $NIC1_ID) \
--name ipconfig1 \
--lb-name lb-m14-public \
--lb-address-pools bepool-m14
# Thêm VM2 vào backend pool
az network nic ip-config update \
--resource-group rg-az104-m14 \
--nic-name $(basename $NIC2_ID) \
--name ipconfig1 \
--lb-name lb-m14-public \
--lb-address-pools bepool-m14
# Tạo Health Probe kiểm tra HTTP port 80
az network lb probe create \
--resource-group rg-az104-m14 \
--lb-name lb-m14-public \
--name probe-http80 \
--protocol Http \
--port 80 \
--path / \
--interval 15 \
--threshold 2
# Tạo Load Balancing Rule: frontend port 80 → backend port 80
az network lb rule create \
--resource-group rg-az104-m14 \
--lb-name lb-m14-public \
--name rule-http \
--protocol Tcp \
--frontend-port 80 \
--backend-port 80 \
--frontend-ip-name feip-m14 \
--backend-pool-name bepool-m14 \
--probe-name probe-http80 \
--idle-timeout 4 \
--load-distribution Default
# Tạo Inbound NAT Rule: SSH đến VM1 qua port 50001
az network lb inbound-nat-rule create \
--resource-group rg-az104-m14 \
--lb-name lb-m14-public \
--name nat-ssh-vm01 \
--protocol Tcp \
--frontend-port 50001 \
--backend-port 22 \
--frontend-ip-name feip-m14
# Tạo Inbound NAT Rule: SSH đến VM2 qua port 50002
az network lb inbound-nat-rule create \
--resource-group rg-az104-m14 \
--lb-name lb-m14-public \
--name nat-ssh-vm02 \
--protocol Tcp \
--frontend-port 50002 \
--backend-port 22 \
--frontend-ip-name feip-m14
# Liên kết NAT rule với NIC của từng VM
az network nic ip-config update \
--resource-group rg-az104-m14 \
--nic-name $(basename $NIC1_ID) \
--name ipconfig1 \
--lb-inbound-nat-rules nat-ssh-vm01 \
--lb-name lb-m14-public
az network nic ip-config update \
--resource-group rg-az104-m14 \
--nic-name $(basename $NIC2_ID) \
--name ipconfig1 \
--lb-inbound-nat-rules nat-ssh-vm02 \
--lb-name lb-m14-public
echo "LB cấu hình hoàn tất. Public IP: $LB_IP"
Kiểm tra phân phối tải và test failover
# Test load balancing: gọi 10 lần, xem response từ VM1 và VM2
LB_IP=$(az network public-ip show \
--resource-group rg-az104-m14 \
--name pip-m14-lb \
--query ipAddress -o tsv)
echo "Testing load balancer at http://$LB_IP"
for i in $(seq 1 10); do
echo -n "Request $i: "
curl -s --max-time 5 http://$LB_IP | grep -o "Server 0[12]"
done
# Test SSH đến VM1 qua NAT rule (port 50001)
# ssh -p 50001 azureuser@$LB_IP
# Simulate failover: dừng nginx trên VM1
# (thực hiện qua Azure Serial Console hoặc SSH)
# sudo systemctl stop nginx
# Sau khi dừng nginx, health probe sẽ fail VM1
# Load Balancer tự động chỉ gửi traffic đến VM2
sleep 30
echo "Testing after VM1 nginx stopped (expect all requests to VM2):"
for i in $(seq 1 5); do
echo -n "Request $i: "
curl -s --max-time 5 http://$LB_IP | grep -o "Server 0[12]"
done
# Kiểm tra trạng thái health probe
az network lb probe show \
--resource-group rg-az104-m14 \
--lb-name lb-m14-public \
--name probe-http80 \
-o table
Cleanup — Dọn dẹp tài nguyên tránh phát sinh chi phí
# Xóa toàn bộ Resource Group — xóa tất cả resource bên trong
az group delete --name rg-az104-m14 --yes --no-wait
echo "Resource group rg-az104-m14 đang được xóa (background)."
echo "Kiểm tra trạng thái: az group show --name rg-az104-m14"
Kết Quả Đầu Ra
Chọn đúng loại LB theo kiến trúc: internet-facing dùng Public LB, giao tiếp nội bộ dùng Internal LB
Nắm SLA, giới hạn backend pool, tính năng HA Ports, Outbound Rules — chọn Standard cho production
Thêm VM vào backend pool qua NIC IP config, hiểu cách Standard LB chấp nhận VM từ mọi subnet trong VNet
Tạo probe TCP/HTTP/HTTPS, cấu hình interval và threshold, xác minh LB tự bypass instance unhealthy
Tạo rule phân phối traffic HTTP, cấu hình session persistence, tạo Inbound NAT rule cho admin SSH
Xác nhận LB tự động reroute khi backend instance down, theo dõi Health Probe Status và Data Path Availability trên Azure Monitor
Ứng Dụng Thực Tế
Tình huống 1: Sàn TMĐT flash sale — Public LB phân phối traffic đột biến
Sàn thương mại điện tử Việt Nam tổ chức flash sale 11/11, traffic tăng đột biến 10x trong 1 giờ, yêu cầu zero-downtime.
Standard Public LB với VMSS backend (autoscale 2–20 instance). Health probe HTTP /health mỗi 5 giây. Session persistence = None (stateless web tier). Floating IP tắt — không cần DSR.
VMSS scale-out khi CPU > 70%, scale-in khi CPU < 30%. LB tự động phát hiện instance mới từ VMSS và bắt đầu phân phối traffic sau khi health probe pass. Outbound rules cấu hình 64K SNAT port/instance.
Xử lý 500K request/phút không downtime. SLA 99.99% với Standard LB. Chi phí tối ưu — scale-in sau flash sale giảm 80% VM instance. Tiết kiệm ~15 triệu VNĐ/tháng so với dùng Fixed capacity.
Tình huống 2: Core banking — Internal LB cho tier App và DB
Ngân hàng TMCP cần kiến trúc 3-tier an toàn, không expose app server và DB ra Internet, đảm bảo HA cho tầng xử lý giao dịch.
Public LB → Web tier (DMZ subnet). Internal LB 1 → App tier (private IP 10.x.2.100). Internal LB 2 (HA Ports) → SQL Always On AG cluster (private IP 10.x.3.100). Floating IP bật trên SQL LB rule hỗ trợ AG listener.
NSG chặn mọi traffic từ Internet đến App/DB subnet. Zone-redundant Internal LB — frontend IP replicated across Zone 1,2,3. Health probe TCP 1433 kiểm tra SQL AG primary node. Idle timeout 30 phút cho DB connection.
App server hoàn toàn ẩn khỏi Internet. SQL failover tự động < 30 giây khi primary node down. Compliance PCI DSS network segmentation. Throughput 1M packet/giây Layer 4.
Tình huống 3: Công ty game online — UDP Load Balancing cho game servers
Game online realtime cần cân bằng tải UDP (giao thức game), độ trễ dưới 50ms, player cùng session phải kết nối đúng game server.
Standard Public LB với UDP rule port 7000-7100 (game server ports). Session persistence = Client IP — đảm bảo cùng player IP → cùng game server. Zone-redundant frontend IP tại Southeast Asia (Singapore).
Health probe TCP 7001 (game server heartbeat port). 10 VM backend D4s_v5 (game compute optimized). Inbound NAT rules cho admin access port 22 qua frontend port 60001-60010. NSG cho phép UDP 7000-7100.
Hỗ trợ 50K concurrent player phân bổ đều 10 server. Session persistence đảm bảo không mất kết nối mid-game. Server crash → LB tự chuyển player sau 30s (probe interval). Latency < 20ms trong nước.