Kubernetes Cross-Zone Traffic: Skrytý Náklad Ktorý Žerie Váš Cloud Bill
Cross-zone traffic sme sa naucili cez drahu lekciu na fakture. “Prečo je náš AWS účet taký vysoký? Ani nemáme toľko záťaže.” Pozriem sa na Cost Explorer: $5000/mesiac za data transfer, a ani neservírujeme externý traffic. Je to cross-zone traffic medzi podmi.
V multi-AZ Kubernetes clusteroch môže každé volanie služby spôsobiť cross-zone poplatky ak si nedáte pozor.
Testované na: EKS 1.28, AWS us-east-1, 3 AZ, 20 nodov
Skrytý Náklad
AWS Cross-Zone Pricing
Rovnaká AZ (us-east-1a → us-east-1a): ZADARMO
Cross-AZ (us-east-1a → us-east-1b): $0.01/GB každým smerom = $0.02/GB celkom
Príklad výpočtu:
- Service A volá Service B: 1KB request, 10KB odpoveď
- 1000 RPS = 11KB × 1000 × 86400 = 950GB/deň
- Ak 66% cross-zone: 627GB × $0.02 = $12.54/deň
- Mesačne: $376 za JEDEN pár služieb!
10 chatty služieb × $376 = $3760/mesiac v cross-zone traffic
Prečo Sa To Deje
3-AZ cluster:
- AZ-a: 7 nodov, 30% podov
- AZ-b: 7 nodov, 35% podov
- AZ-c: 6 nodov, 35% podov
Service A pod (AZ-a) → Service B ClusterIP → kube-proxy → náhodný endpoint
↓
66% šanca: iná AZ!
Meranie Cross-Zone Traffic
Prometheus Metriky
# Ak používate Istio - traffic podľa source/destination zóny
sum(rate(istio_tcp_sent_bytes_total[5m])) by (source_workload_zone, destination_workload_zone)
# Bez Istio - použi AWS VPC Flow Logs alebo CNI metriky
AWS Cost Explorer
1. Choď do AWS Cost Explorer
2. Filter: Service = "EC2-Other"
3. Group by: Usage Type
4. Hľadaj: DataTransfer-Regional-Bytes
Mesačný cross-zone náklad okamžite viditeľný
Node Labels
# Skontroluj zóny nodov
kubectl get nodes -L topology.kubernetes.io/zone
# Output:
# node-1 Ready topology.kubernetes.io/zone=us-east-1a
# node-2 Ready topology.kubernetes.io/zone=us-east-1b
# node-3 Ready topology.kubernetes.io/zone=us-east-1c
Riešenia
1. Topology-Aware Routing (Kubernetes 1.21+)
# Service s topology-aware routingom
apiVersion: v1
kind: Service
metadata:
name: backend
annotations:
# Deprecated v 1.27, použi topologySpreadConstraints
service.kubernetes.io/topology-aware-hints: Auto
spec:
selector:
app: backend
ports:
- port: 80
2. Topology Spread Constraints
# Deployment ktorý sa rozloží rovnomerne cez zóny
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 6 # 2 per zóna pre 3 AZ
template:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: backend
3. Istio Locality Load Balancing
# DestinationRule s locality prioritou
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: backend
spec:
host: backend.default.svc.cluster.local
trafficPolicy:
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 30s
connectionPool:
tcp:
maxConnections: 100
loadBalancer:
localityLbSetting:
enabled: true
# Preferuj rovnakú zónu, potom rovnaký región
distribute:
- from: "us-east-1/us-east-1a/*"
to:
"us-east-1/us-east-1a/*": 80
"us-east-1/us-east-1b/*": 10
"us-east-1/us-east-1c/*": 10
4. Pod Anti-Affinity + Local Service
# Zabezpeč pody v každej zóne
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- backend
topologyKey: topology.kubernetes.io/zone
5. Internal Traffic Policy (Kubernetes 1.26+)
# Smeruj len na node-local endpointy
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: backend
internalTrafficPolicy: Local # Preferuj same-node endpointy
ports:
- port: 80
Architektonické Vzory
Vzor 1: Zone-Aware Microservices
Pred (cross-zone heavy):
┌─────────────────────────────────────────────────┐
│ AZ-a │
│ [API Gateway] ─────────────────────────────────┼──→ [Service B v AZ-b]
│ │
│ [Service A] ───────────────────────────────────┼──→ [Service C v AZ-c]
└─────────────────────────────────────────────────┘
Po (zone-local):
┌─────────────────────────────────────────────────┐
│ AZ-a │
│ [API Gateway] → [Service A] → [Service B] → [Service C]
│ (všetko lokálne) │
└─────────────────────────────────────────────────┘
│ AZ-b │
│ [API Gateway] → [Service A] → [Service B] → [Service C]
│ (všetko lokálne) │
└─────────────────────────────────────────────────┘
Vzor 2: Shard podľa Zóny
# Database read repliky per zóna
# Aplikácia sa pripája k lokálnej replike
# ConfigMap so zone-specific configom
apiVersion: v1
kind: ConfigMap
metadata:
name: db-config
data:
DB_HOST_AZ_A: "postgres-replica-a.db.svc"
DB_HOST_AZ_B: "postgres-replica-b.db.svc"
DB_HOST_AZ_C: "postgres-replica-c.db.svc"
# Init container alebo sidecar zistí zónu
# a nastaví vhodný DB_HOST
Vzor 3: Cache per Zóna
# Redis per zóna, nie cross-zone
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
replicas: 3
template:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
Odhad Nákladov
Pred Optimalizáciou
Cluster: 20 nodov, 3 AZ
Služby: 15 microservices
Priemerný service-to-service traffic: 50GB/deň
Bez zone awareness:
- 66% cross-zone = 33GB × $0.02 = $0.66/deň per pár služieb
- 15 služieb × 14 spojení / 2 = 105 párov
- ALE nie všetky páry komunikujú
Realisticky: 30 aktívnych párov × $0.66 = $19.80/deň
Mesačne: ~$600 v cross-zone traffic
Po Optimalizácii
S topology-aware routingom:
- 80% same-zone traffic
- 20% cross-zone = 10GB × $0.02 = $0.20/deň per pár
- 30 aktívnych párov × $0.20 = $6/deň
Mesačne: ~$180 v cross-zone traffic
Úspora: $420/mesiac = $5040/rok
Monitoring
Prometheus Metriky
# Cross-zone traffic pomer (s Istio)
sum(rate(istio_tcp_sent_bytes_total{
source_workload_zone != destination_workload_zone
}[5m]))
/
sum(rate(istio_tcp_sent_bytes_total[5m]))
# Traffic podľa páru zón
sum(rate(istio_tcp_sent_bytes_total[5m])) by (
source_workload_zone,
destination_workload_zone
)
Alert Rules
groups:
- name: cross_zone_traffic
rules:
- alert: HighCrossZoneTrafficRatio
expr: |
sum(rate(istio_tcp_sent_bytes_total{source_workload_zone != destination_workload_zone}[1h]))
/
sum(rate(istio_tcp_sent_bytes_total[1h]))
> 0.5
for: 1h
annotations:
summary: "Cross-zone traffic >50% z celkového"
description: "Zváž povolenie topology-aware routingu"
Checklist
## Cross-Zone Traffic Optimalizácia
### Meranie
- [ ] Povoľ topology labels na nodoch
- [ ] Skontroluj AWS Cost Explorer pre DataTransfer-Regional
- [ ] Zmeraj cross-zone pomer s Istio/CNI metrikami
### Quick Wins
- [ ] Povoľ topology-aware hints na high-traffic službách
- [ ] Nastav internalTrafficPolicy: Local kde vhodné
- [ ] Zabezpeč rovnomerné rozloženie podov cez zóny
### Architektonické Zmeny
- [ ] Pridaj read repliky per zóna pre databázy
- [ ] Pridaj cache layer per zóna
- [ ] Zváž zone-sharded služby pre ťažký traffic
### Monitoring
- [ ] Dashboard s cross-zone traffic pomerom
- [ ] Alert na cross-zone pomer > 50%
- [ ] Sleduj mesačný cross-zone cost trend
Záver
Cross-zone traffic je skrytý Kubernetes náklad:
- $0.02/GB sa rýchlo nasčíta s chatty microservices
- Topology-aware routing môže znížiť cross-zone o 80%
- Najprv zmeraj s Istio metrikami alebo VPC Flow Logs
- Zone-local caching je často najväčšia výhra
Skontroluj svoj AWS účet - možno budeš prekvapený.
Súvisiace články
- CoreDNS vs NodeLocal DNS Cache - Network optimalizácia
- K8s CPU Throttling Pitva - Performance tuning
Súvisiace články
$10k/Mesiac AWS Chyba: NAT Gateway vs VPC Endpoints
Vaše privátne subnety používajú NAT Gateway pre S3 a DynamoDB. Platíte $0.045/GB za bezplatný traffic. Ukážem ako VPC Endpoints ušetria tisíce mesačne.
S3 Intelligent-Tiering: Pasca Malých Objektov
S3 Intelligent-Tiering šetrí peniaze pre veľké súbory ale účtuje minimum 128KB overhead. Pre milióny malých objektov ZVYŠUJE náklady. Ukážem matematiku.
CoreDNS vs NodeLocal DNS Cache: Zníženie Kubernetes DNS Latencie 10x
Vaše pody robia 100 DNS queries per request. CoreDNS je bottleneck. Benchmarkujem NodeLocal DNS cache a ukážem konfiguráciu pre produkciu.
Kubernetes conntrack Vyčerpanie: Tichý Zabijak Paketov
Náhodné DNS timeouty, dropped spojenia, služby timeout-ujú. Vaša nf_conntrack tabuľka je plná. Ukážem ako diagnostikovať, monitorovať a opraviť tento K8s networking problém.
Citujte tento článok
Ak na článok odkazujete, pridajte pôvodnú URL a uveďte autora.