Phần 10 — Production: Observability, Backup, Upgrade và Disaster Recovery
Ý kiến
0
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Phần cuối series K8s: Cluster API (CAPI) quản lý cluster bằng K8s API, FinOps với OpenCost + Karpenter + right-sizing, AI/ML workloads (GPU, Kubeflow, KServe, vLLM, Argo Workflows, gang scheduling), Edge K8s và WebAssembly.
Multi-tenancy K8s (soft: namespace+RBAC+Quota, HNC, Capsule, vCluster; hard: cluster riêng) và multi-cluster: management cluster, GitOps ApplicationSet, Cluster API, Karmada, Crossplane, observability liên cluster.
Service Mesh chuyên sâu cho K8s: Istio (sidecar + ambient), Linkerd (proxy Rust nhẹ), Cilium Service Mesh (eBPF sidecarless) — mTLS, VirtualService, AuthorizationPolicy, canary, mirror, multi-cluster, đo overhead, khi không nên dùng mesh.
Series Kubernetes Toàn Tập — 13 phần:
Phần 10 — Production checklist ← bạn đang đọc
Cluster lên không khó. Vận hành cluster khỏi tay qua nhiều năm mới là phần thực sự khó. Phần cuối này gom checklist production: observability, backup/restore, cluster upgrade, disaster recovery, capacity planning và những thứ ai vận hành K8s lâu cũng từng vấp.
Bộ ba kinh điển: metrics, logs, traces. Thêm profiling và events.
Stack chuẩn open-source:
Prometheus (hoặc Mimir) — scrape và lưu metrics.
kube-state-metrics — expose state K8s object (Deployment desired vs available, …).
node-exporter — metrics node (CPU, RAM, disk, network).
cAdvisor — đã embed trong kubelet, expose container metrics.
Prometheus Operator — CRD ServiceMonitor/PodMonitor/PrometheusRule cho phép app khai báo scrape config trong YAML riêng.
Grafana — dashboard.
Kubernetes Mixin có dashboard và alert built-in cho mọi component: monitoring.mixins.dev.
App nên log JSON ra stdout/stderr — không log file.
Collector chạy DaemonSet (Promtail / Alloy / Fluent Bit / Vector) đọc /var/log/containers/*.log.
Lưu trong Loki / Elasticsearch / Cloud (CloudWatch, GCP Logging, Datadog).
Quan trọng: thêm label/tag namespace, app, pod, container. Không log secret hay PII.
OpenTelemetry là chuẩn. App instrument bằng OTel SDK, gửi span đến OTel Collector → Tempo / Jaeger / cloud.
Cho microservice, tracing là cách duy nhất hiểu được latency end-to-end qua nhiều hop.
Pyroscope + Grafana Beyla (eBPF) cho continuous profiling và auto-instrument app không sửa code.
K8s tự generate event. Ship vào logs cho audit:
kubectl get events -A --sort-by='.lastTimestamp'
# Vẫn không đủ — chỉ giữ 1h mặc định. Cài kube-eventer hoặc event-exporter để ship sang Loki/Elastic.
| SLI | Target gợi ý |
|---|---|
| API server p99 latency < | 1s |
| API server error rate < | 1% |
| etcd disk write latency p99 < | 100ms |
| Node Ready % | > 99.9% |
| Pod scheduling latency p99 < | 30s |
| App request error rate < | 0.1% |
Node NotReady > 5 phút.
etcd leader change quá thường xuyên / disk space < 20%.
API server error rate cao.
CoreDNS pod crash loop.
PVC sắp đầy (> 80%).
Pod CrashLoopBackOff > 5 phút.
Cert expired trong 14 ngày (kube cert + ingress cert).
etcd — toàn bộ state cluster. Mất etcd là mất cluster.
PVC data — data app: database, file user upload.
Manifest source — đã ở Git nếu bạn GitOps.
Secrets ngoài Git — backup từ Vault/cloud KMS riêng.
# Trên control plane
sudo ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /backup/etcd-$(date +%F-%H%M).db
# Verify
etcdctl snapshot status /backup/etcd-...db --write-out=table
Lưu snapshot off-site (S3, cloud), encrypted. Chạy CronJob trong cluster hoặc cron trên host.
Restore: dùng etcdctl snapshot restore vào thư mục data, đổi kubeadm config trỏ về data dir mới, restart etcd. Tài liệu chính thức có bước chi tiết — diễn tập định kỳ.
Velero là tool open-source de facto: backup mọi object K8s và PVC volume vào S3.
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.10.0 \
--bucket my-velero-backups \
--backup-location-config region=us-east-1 \
--snapshot-location-config region=us-east-1
# Backup theo lịch
velero schedule create daily \
--schedule="0 2 * * *" \
--include-namespaces='*' \
--ttl 720h
# Backup ad-hoc
velero backup create pre-upgrade --include-namespaces prod
# Restore
velero restore create --from-backup pre-upgrade
Velero hỗ trợ CSI snapshot và Restic / Kopia để backup file-level cho volume không snapshot được.
Snapshot disk database không thay backup database logic. Postgres bị corrupt 4 giờ trước, snapshot 30 phút trước cũng corrupt. Backup app-level (pg_dump, WAL archiving) vẫn cần thiết, ship sang object storage.
Mỗi quý:
Restore etcd snapshot lên cluster test.
Velero restore namespace prod vào cluster test, verify app chạy.
Restore DB từ pg_dump vào staging.
Đo RTO/RPO thực tế, không để giả định.
K8s phát hành minor mỗi ~4 tháng, hỗ trợ 12–14 tháng. Bạn phải upgrade — không có lựa chọn.
Control plane và node lệch tối đa ±2 minor.
Upgrade từng minor một (1.28 → 1.29 → 1.30), không nhảy.
kubectl lệch tối đa ±1 minor.
# Trên control plane đầu tiên
sudo apt-get update
sudo apt-mark unhold kubeadm
sudo apt-get install -y kubeadm=1.31.0-1.1
sudo apt-mark hold kubeadm
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.31.0
# Trên các control plane khác
sudo kubeadm upgrade node
# Upgrade kubelet + kubectl
sudo apt-mark unhold kubelet kubectl
sudo apt-get install -y kubelet=1.31.0-1.1 kubectl=1.31.0-1.1
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# Trên control plane
kubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data
# Trên worker
sudo apt-get update
sudo apt-mark unhold kubeadm kubelet kubectl
sudo apt-get install -y kubeadm=1.31.0-1.1 kubelet=1.31.0-1.1 kubectl=1.31.0-1.1
sudo apt-mark hold kubeadm kubelet kubectl
sudo kubeadm upgrade node
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# Quay lại control plane
kubectl uncordon worker-1
Đọc Release Notes và Deprecation minor đó.
Chạy kube-no-trouble (kubent) phát hiện API deprecated trong cluster.
Backup etcd + Velero snapshot.
Upgrade add-on (CNI, ingress, cert-manager, operator) theo support matrix.
Upgrade staging cluster trước tối thiểu 1 tuần.
PDB cho workload quan trọng để drain không kéo cả app xuống.
Bảo trì thông báo trước, lịch ngoài giờ peak.
Cloud lo control plane. Bạn vẫn phải:
Upgrade node group (rolling, blue/green node pool).
Upgrade add-on (CNI, kube-proxy, CoreDNS) cũng phải bấm.
Test workload trên node mới trước khi switch.
Phải định nghĩa rõ:
RTO (Recovery Time Objective) — bao lâu được phép down.
RPO (Recovery Point Objective) — chấp nhận mất tối đa bao nhiêu data.
| Tier | RTO | RPO | Kiến trúc |
|---|---|---|---|
| 1 (mission-critical) | < 15 phút | ~0 | Multi-region active/active, replicate sync |
| 2 | < 1 giờ | < 5 phút | Multi-AZ + read replica cross-region |
| 3 | < 4 giờ | < 30 phút | Single region multi-AZ, backup cross-region |
| 4 | < 24 giờ | < 1 giờ | Backup-only, restore khi cần |
Lựa chọn architecture cluster:
Single cluster multi-AZ — đa số use case. Cluster Autoscaler + topology spread.
Federated / multi-cluster (Cluster API, Karmada, Argo CD multi-cluster) — đa region, complexity cao.
Active/passive qua DNS + Velero — RPO tệ hơn nhưng simple.
Theo dõi node:cpu_utilisation, node:memory_utilisation qua thời gian.
Đặt buffer 20–30% (chỗ cho rolling update, node fail).
Đo resource:requested/allocatable — đây là chỉ số scheduler thấy, không phải usage thực.
Mỗi node 100% allocated requests = scheduler không nhét được gì → pod Pending dù CPU thật nhàn.
Đa node group: 1 group on-demand baseline, 1 group spot/preemptible cho burst.
Theo dõi pod_overhead (kubelet, daemonset, system) ~ 10–15% mỗi node.
Check alert chưa close.
Check pod restart bất thường.
Review log lỗi top.
Review cost (kubecost, opencost).
Image vuln scan (Trivy Operator) — fix critical.
Patch OS node (kured cho reboot tự động).
Rotate certificate (kubeadm renew, hoặc tự động).
Review RBAC binding mới.
Review network policy mới.
Test restore Velero.
Upgrade minor K8s.
DR drill: restore vào cluster phụ.
Penetration test / kube-bench / kube-hunter.
Review SLO, sửa burn rate.
Bật topology-aware routing để giảm cross-AZ traffic.
Spot/Preemptible cho workload có thể chịu restart (web, batch). PDB + maxUnavailable đúng.
Right-size requests bằng VPA recommend mode + Kubecost.
Karpenter consolidation tự move pod xuống node ít, xoá node thừa.
Set imagePullPolicy: IfNotPresent + image registry cache (Harbor pull-through).
Đừng over-provision Loki/Mimir/Tempo — dùng object storage S3 thay block volume.
Track cost theo namespace/team với labels (opencost project).
Không set readiness probe. User bị 502 mỗi lần rollout.
Liveness probe quá nhạy. App slow lúc GC → restart loop → tệ hơn nữa.
Không có PDB. Drain node = app down.
Không có anti-affinity. 3 replica chung 1 node, node chết = app chết.
Resource requests 0. BestEffort, evict đầu tiên.
Memory limit thiếu. Pod ăn RAM cả node → kubelet OOM-kill ngẫu nhiên.
CPU limit quá thấp. Throttling latency.
etcd disk chậm. Cluster chậm toàn bộ. Dùng SSD/NVMe dedicated.
Backup etcd nhưng chưa từng restore. Khi cần thì lạc.
kubectl apply -f với credentials master từ CI. Lúc bị leak là cluster mất. Dùng GitOps + workload identity.
CrashLoopBackOff vì image pull fail. Kiểm registry credentials, network egress.
Network policy default-deny rồi quên allow DNS — app gọi gì cũng fail name resolution.
StatefulSet PVC giữ luôn sau delete. Chiếm chỗ và $.
Ingress 504 timeout mặc định 60s — tăng theo workload nếu cần.
Cluster autoscaler không xoá được node vì pod không có PDB hoặc cluster-autoscaler.kubernetes.io/safe-to-evict annotation.
| Tên | Tác dụng |
|---|---|
| k9s | TUI quản lý cluster — siêu nhanh |
| kubectl-neat | Clean YAML mặc định auto generated |
| stern | Tail log nhiều pod cùng lúc với màu |
| kubectx / kubens | Đổi context/namespace nhanh |
| kubeshark | tcpdump cho K8s traffic |
| kubent | Phát hiện API deprecated trước upgrade |
| kube-bench | CIS benchmark |
| kube-hunter | Tìm misconfiguration |
| trivy-operator | Scan image vuln + secret |
| opencost / kubecost | Cost theo namespace/team |
| popeye | Sanitize cluster (find issues) |
Confirm scope: 1 app? 1 namespace? Toàn cluster?
Stop bleeding: rollback deploy gần nhất (kubectl rollout undo), scale up, evacuate node.
Diagnose: kubectl get events -A, log API server, log etcd, log CNI, Grafana.
Communicate: status page, channel team, không im lặng.
Postmortem blameless: timeline, root cause, action items.
Bạn đã đi qua 10 phần đầu:
Hiểu vì sao K8s tồn tại và kiến trúc.
Dựng được cluster local và production.
Chạy mọi loại workload với probe, lifecycle đúng.
Kết nối service qua DNS, expose qua Ingress/Gateway.
Lưu data với PV/PVC, snapshot, expansion.
Inject config/secret an toàn, dùng external secret store.
Bảo mật với RBAC, SecurityContext, Pod Security Standards.
Scale workload và cluster với HPA, VPA, KEDA, Cluster Autoscaler, Karpenter.
Package + GitOps, mở rộng với CRD + Operator.
Vận hành production: observability, backup, upgrade, DR, cost.
K8s là chặng đường, không phải đích. Mỗi minor version đổi vài thứ, mỗi vendor có gotcha riêng. Đọc kubernetes.io/docs mỗi khi release notes mới, lăn vào hands-on, và đừng ngại break/cài lại cluster lab.
Build it, break it, fix it — that's how you actually learn Kubernetes.