Tổng quan Hạ tầng
BANA sử dụng các Kubernetes cluster riêng biệt cho staging và production trên VNPAY Cloud. Cả hai dùng chung Kustomize base nhưng khác biệt đáng kể về mức độ hoàn thiện kiến trúc.
| Staging | Production | |
|---|---|---|
| Mục đích | Kiểm thử nội bộ, demo, môi trường tích hợp | Lưu lượng thật |
| Domain | sgw.staging.bana.com.vn (API), *.staging.bana.com.vn (frontend) | TBD |
| Node | 3 (2 default + 1 stateful) | 7+ (2 system + 3 app + 2 stateful) |
| Ingress | nginx-ingress (đơn lẻ) | nginx-ingress (cặp HA) |
| API Gateway | Traefik (đơn lẻ) | Traefik (cặp HA) |
| CD | Triển khai thủ công bằng kubectl apply | Pipeline GitLab CI/CD |
| Secret | Sealed Secrets | Sealed Secrets |
| TLS | cert-manager | cert-manager |
| Mở rộng | Thủ công | HPA + PDB + topology spread |
| Giám sát | Prometheus + Grafana + Loki | Prometheus + Grafana + Loki + Tempo + OTel |
Luồng Lưu lượng
Kiến trúc phân tách edge ingress (nginx-ingress) khỏi API gateway (Traefik). Traefik không phải là ingress controller — nó là API gateway phía backend với rate limiting, circuit breaking, và security header.
Nguyên tắc Thiết kế
| Nguyên tắc | Quyết định | Lý do |
|---|---|---|
| Cluster riêng biệt | Staging + Production | Không ảnh hưởng lẫn nhau, mở rộng độc lập |
| Edge vs Gateway | nginx-ingress (edge) + Traefik (API gateway) | Phân tách trách nhiệm — TLS/tĩnh vs API middleware |
| CI/CD | GitLab CI/CD + GitLab Container Registry | Team đã sử dụng GitLab |
| TLS | cert-manager với Let's Encrypt | Tự động gia hạn, không cần quản lý chứng chỉ thủ công |
| Cấu hình | Kustomize overlay | Cùng base, overlay khác nhau cho từng môi trường |
| Secret | Sealed Secrets | Mã hóa trong Git, không phụ thuộc bên ngoài |
| Identity-first | Init container chờ identity | Tất cả VerifierApp cần JWKS từ IssuerApp |
| Migration | K8s Job trước deployment | Tách biệt khỏi runtime, idempotent |
| Payment tách nhỏ | 2 Deployment từ 1 image | api, worker qua biến môi trường APP_MODE |
| Signal dual-route | REST có middleware, WebSocket không có | Không rate-limit trên kết nối persistent |
Cấu trúc Tài liệu
| Trang | Mô tả |
|---|---|
| Multi-Tenancy (PRD) | Các mức cô lập tenant (Pool / Bridge / Silo) và chiến lược di chuyển tenant |
| Quyết định | ADR hạ tầng cross-cutting |
| Thiết kế Cluster | Node pool, namespace — staging vs production |
| Workload | Mọi thông số Deployment/StatefulSet |
| Mạng | nginx-ingress + Traefik API gateway, TLS, routing |
| Tầng Dữ liệu | PostgreSQL, Redis, Kafka, Typesense |
| Cấu hình | ConfigMap, Secret, ánh xạ biến môi trường |
| Quan sát | Prometheus, Grafana, Loki, Tempo, OpenTelemetry |
| Bảo mật & Gia cố | Bảo mật pod, RBAC, chuỗi cung ứng image, PriorityClass |
| Vận hành | GitLab CI/CD, migration, quy trình triển khai |