Späť na blog

Kubernetes Cross-Zone Traffic: Skrytý Náklad Ktorý Žerie Váš Cloud Bill

|
| kubernetes, aws, networking, cost-optimization, cross-zone, cloud

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:

  1. $0.02/GB sa rýchlo nasčíta s chatty microservices
  2. Topology-aware routing môže znížiť cross-zone o 80%
  3. Najprv zmeraj s Istio metrikami alebo VPC Flow Logs
  4. Zone-local caching je často najväčšia výhra

Skontroluj svoj AWS účet - možno budeš prekvapený.


Súvisiace články

Súvisiace články

Citujte tento článok

Ak na článok odkazujete, pridajte pôvodnú URL a uveďte autora.

Michal Drozd. "Kubernetes Cross-Zone Traffic: Skrytý Náklad Ktorý Žerie Váš Cloud Bill". https://www.michal-drozd.com/sk/blog/k8s-cross-zone-traffic/ (Publikované 8. apríla 2025).