MODULE 14 Virtual Networking · 15–20% ~3 giờ Administrator

Azure Load Balancer

Phân phối lưu lượng mạng hiệu quả giữa các backend instance — public LB, internal LB, SKU Basic/Standard, backend pools, health probes và load balancing rules.

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.

Thành phần cốt lõi
  • 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
Thuật toán phân phối
  • 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
Lưu ý thi AZ-104: Load Balancer là Layer 4 — không xử lý HTTP headers, cookies, hay URL path. Nếu cần routing theo URL path hoặc cookie-based session, dùng Application Gateway (Layer 7).

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
Kiến trúc 3-tier điển hình

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.

Outbound rules (Standard LB)

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
Khuyến nghị: Luôn dùng Standard SKU cho workload production. Basic SKU đang trong lộ trình retirement. Standard LB yêu cầu Standard Public IP — không thể mix Basic IP với Standard LB.

4. Backend Pools, Health Probes & Load Balancing Rules

Backend Pool
  • • Đị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
Health Probe
  • 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 đó
Load Balancing Rule
  • • 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
Inbound NAT Rules

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)

Lab 14-A: Tạo Standard Public LB Lab 14-B: Cấu hình Backend Pool & Health Probe Lab 14-C: LB Rules & Inbound NAT Lab 14-D: Kiểm tra failover
1

Tạo Resource Group, VNet, Subnet và 2 VM backend

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# 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'
Verify Portal: Portal → rg-az104-m14 → xác nhận 2 VM (vm-m14-web01, vm-m14-web02) đã tạo thành công, trạng thái Running. Vào Virtual Networks → vnet-m14 → Subnets → snet-backend có NSG gán.
2

Tạo Standard Public Load Balancer và cấu hình Frontend IP

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# 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"
Verify Portal: Portal → Load balancers → lb-m14-public → Frontend IP configuration → xác nhận feip-m14 có Static Public IP. SKU phải hiển thị "Standard".
3

Thêm VM vào Backend Pool, tạo Health Probe và Load Balancing Rule

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# 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"
Verify Portal: Portal → lb-m14-public → Backend pools → bepool-m14 → xác nhận 2 VM. Vào Health probes → probe-http80 trạng thái "Healthy". Load balancing rules → rule-http hiển thị. Inbound NAT rules → nat-ssh-vm01 và nat-ssh-vm02.
4

Kiểm tra phân phối tải và test failover

Bash— Linux/macOS/Cloud Shell, KHÔNG chạy CMD
# 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
Verify Portal: Portal → lb-m14-public → Insights → xem biểu đồ Data path availability và Health probe status. Khi VM1 nginx dừng, Health probe status của VM1 về 0 — LB tự động bypass VM1. Portal → Monitor → Metrics → lb-m14-public → chọn metric "Health Probe Status".
5

Cleanup — Dọn dẹp tài nguyên tránh phát sinh chi phí

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# 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"
Lưu ý: Standard Public IP và Standard LB tính phí theo giờ ngay cả khi không có traffic. Luôn cleanup sau khi hoàn thành lab để tránh chi phí không cần thiết.

Kết Quả Đầu Ra

Phân biệt Public LB và Internal LB

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

Phân biệt Basic và Standard SKU

Nắm SLA, giới hạn backend pool, tính năng HA Ports, Outbound Rules — chọn Standard cho production

Cấu hình Backend Pool đầy đủ

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

Health Probe hoạt động chính xác

Tạo probe TCP/HTTP/HTTPS, cấu hình interval và threshold, xác minh LB tự bypass instance unhealthy

Load Balancing Rules và Inbound NAT

Tạo rule phân phối traffic HTTP, cấu hình session persistence, tạo Inbound NAT rule cho admin SSH

Test và giám sát failover

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.

Giải pháp

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.

Triển khai

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.

Lợi ích

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.

Giải pháp

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.

Triển khai

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.

Lợi ích

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.

Giải pháp

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).

Triển khai

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.

Lợi ích

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.

Zalo