Kubernetes даёт автоскейлинг — это и плюс, и минус. HPA масштабирует поды при нагрузке, но атакующий может спровоцировать scale-up и устроить вам счёт от облака на $$$.
В этом гайде: защита K8s кластера на всех уровнях — от edge до pod security.
Уровни защиты
Защита K8s строится послойно:
- Edge — CDN/WAF (Cloudflare)
- Ingress Controller — rate limiting
- Service Mesh — Istio policies
- Network Policies — изоляция подов
- Pod Security — ресурсы, security context
Ingress Rate Limiting
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
nginx.ingress.kubernetes.io/limit-rps: "10"
nginx.ingress.kubernetes.io/limit-connections: "5"
nginx.ingress.kubernetes.io/limit-burst-multiplier: "5"
nginx.ingress.kubernetes.io/limit-whitelist: "10.0.0.0/8"
spec:
ingressClassName: nginx
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
HPA Protection
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api
minReplicas: 2
maxReplicas: 10 # КРИТИЧНО: не 100!
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
behavior:
scaleUp:
stabilizationWindowSeconds: 60
policies:
- type: Pods
value: 2 # Макс +2 пода за раз
periodSeconds: 60
Network Policies
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-api-ingress
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: ingress-nginx
ports:
- protocol: TCP
port: 8080
Pod Security
spec:
template:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: api
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: [ALL]
resources:
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080
Мониторинг
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: ddos-alerts
spec:
groups:
- name: ddos
rules:
- alert: HighRateLimitHits
expr: sum(rate(nginx_ingress_controller_requests{status="429"}[5m])) > 100
for: 2m
labels:
severity: warning
- alert: RapidPodScaling
expr: delta(kube_deployment_status_replicas[5m]) > 5
for: 1m
labels:
severity: critical