75 lines
5.6 KiB
Markdown
75 lines
5.6 KiB
Markdown
# dbiz-lake-k8s — DBIZ Lakehouse GitOps
|
|
|
|
Quản deploy lakehouse lên K8s qua ArgoCD. Theo khuôn `argo-k8s` (App-of-Apps, Helm + YAML thuần).
|
|
**Công cụ: Helm + ApplicationSet. KHÔNG Kustomize.**
|
|
|
|
## Git/CI — URL là biến số (không chờ hạ tầng)
|
|
- **`https://git.renolation.com/renolation/dbiz-lake-k8s.git`** trong các Application = placeholder repo GitOps. Chạy được với repo BẤT KỲ đang dùng.
|
|
Đổi repo (vd sang Gitea `git.dbiz.com` sau này) = một lệnh: `grep -rl 'https://git.renolation.com/renolation/dbiz-lake-k8s.git' | xargs sed -i 's#https://git.renolation.com/renolation/dbiz-lake-k8s.git#<url-thật>#g'`,
|
|
rồi cập nhật ArgoCD repo creds. Không phải chờ Gitea.
|
|
- **`<IMAGE_REGISTRY>`** trong values = registry chứa image. Đổi tương tự khi chuyển registry.
|
|
- **CI: Woodpecker** (đã có) build + push image. File: `.woodpecker/`. Secret registry khai trong Woodpecker UI.
|
|
- Đích cuối: code + registry ở Gitea `git.dbiz.com` (built-in registry) — nhưng KHÔNG chặn việc chạy hôm nay.
|
|
|
|
## Triết lý
|
|
- **Lakehouse as a product**: DBIZ lake = "khách số 0". Mọi thứ THAM SỐ HOÁ (không hardcode)
|
|
để sau nhân bản cho khách mua gói (Vietbank/Gemadept) qua **ApplicationSet** — CHƯA làm, hoãn tới khi có khách thứ 2.
|
|
- **Stateful đứng yên, compute di**: MinIO (data lake) GIỮ NGUYÊN ngoài K8s, trỏ qua Service+Endpoints.
|
|
Kafka dựng mới (Strimzi) trên K8s — chấp nhận snapshot CDC lại.
|
|
- **dev giống prod**: cùng chart, khác values theo env (dev/prod). Helm values-driven, portable.
|
|
- **Portable cho on-prem**: chart nhận mọi dependency (S3/nguồn/kafka) qua values → chạy được cả trên
|
|
hạ tầng DBIZ lẫn on-prem tại khách (air-gapped: mirror image sang registry nội bộ khách).
|
|
|
|
## Cấu trúc
|
|
```
|
|
infra/cluster/ Hạ tầng NỀN cụm (singleton toàn cụm, tách khỏi envs/<env>)
|
|
root.yaml App-of-apps tầng nền (infra-cluster-root)
|
|
00-longhorn.yaml Longhorn (Helm upstream, SC longhorn, replica=2, KHÔNG default)
|
|
charts/lake-cdc-job/ Chart CDC job (SparkApplication) — THAM SỐ HOÁ theo customer
|
|
envs/dev/
|
|
apps/ ArgoCD Applications (App-of-Apps)
|
|
root.yaml Root -> quét apps/
|
|
infra.yaml External Service+Endpoints (MinIO ngoài, Postgres nguồn)
|
|
strimzi-operator.yaml Strimzi (Helm upstream)
|
|
spark-operator.yaml Spark Operator (Helm upstream)
|
|
kafka-cluster.yaml -> envs/dev/kafka (Kafka CRD)
|
|
cdc-job.yaml CDC job (chart lake-cdc-job + values, multi-source)
|
|
kafka/ Kafka CRD (Strimzi, KRaft, Longhorn PV)
|
|
infra/ external-services.yaml (IP hạ tầng ngoài)
|
|
values/ values per-app (cdc-job.yaml = khách số 0 dbiz)
|
|
sealed-secrets/ SealedSecrets (imagePullSecret, creds) — an toàn commit
|
|
images/spark-cdc/ Dockerfile (image bundled)
|
|
.woodpecker/ Woodpecker CI (build + push image lên Gitea registry)
|
|
```
|
|
|
|
## Điều kiện tiên quyết trên cụm (Phase 0 — dựng TRƯỚC)
|
|
1. ArgoCD (đã có).
|
|
2. **Sealed Secrets controller** (đã có).
|
|
3. **cert-manager** + ingress (nếu expose UI).
|
|
4. **Gitea `git.dbiz.com`** online + repo này + **Deploy Token** (đọc repo cho ArgoCD, đọc registry cho pull image).
|
|
5. **Woodpecker** nối Gitea, khai secret `gitea_registry_user` / `gitea_registry_token`.
|
|
|
|
> **Longhorn** (StorageClass `longhorn`, cho Kafka PV + checkpoint) KHÔNG còn dựng tay — nay là app GitOps trong `infra/cluster/`, apply ở Bootstrap bước 0. Phải XANH trước khi apply tầng lake.
|
|
|
|
## Bootstrap (khi Gitea + nền sẵn sàng)
|
|
0. **Tầng nền cụm TRƯỚC** — apply app-of-apps hạ tầng, chờ Longhorn XANH rồi mới sang bước sau:
|
|
`kubectl apply -f infra/cluster/root.yaml` (node không có repo -> dùng raw URL của Gitea).
|
|
Verify: `kubectl get sc longhorn` + pods `longhorn-system` Running.
|
|
1. Điền IP thật vào `envs/dev/infra/external-services.yaml` (MinIO, Postgres nguồn).
|
|
2. Seal imagePullSecret (Gitea registry, tên `gitea-registry`) -> `envs/dev/sealed-secrets/`.
|
|
3. Push `images/spark-cdc/**` -> Woodpecker tự build + push image lên `git.dbiz.com/dbiz/spark-cdc`.
|
|
4. `kubectl apply -f envs/dev/apps/root.yaml` -> ArgoCD sync tầng lake (cdc-job xin PVC storageClass=longhorn).
|
|
|
|
## Nhân bản cho khách mới (TƯƠNG LAI)
|
|
- Copy `envs/dev/values/cdc-job.yaml`, đổi `customer`, nguồn, bucket, namespace, s3.endpoint.
|
|
- Nhiều khách -> **ApplicationSet** (generator theo customer).
|
|
- Mức cách ly (1/2/3) = preset values + namespace/cụm riêng. Vietbank on-prem = cùng chart, cụm khác.
|
|
- S3: DBIZ dựng (ngoài/trong cụm) hoặc khách tự cấp — chỉ đổi `s3.endpoint` + secret, không sửa chart.
|
|
|
|
## LƯU Ý
|
|
- CDC Docker cũ GIỮ CHẠY tới khi CDC K8s verify xong, rồi mới tắt (không đập cái đang chạy).
|
|
- Version Helm chart (Strimzi/Spark Operator) đang pin TẠM — kiểm bản mới nhất khi dựng thật.
|
|
- Longhorn pin `1.11.3`, `defaultClassReplicaCount=2` — cụm chỉ 2 worker = 2 node lưu trữ (3 control-plane bị taint). `local-path` VẪN default; `longhorn` KHÔNG default. Thêm worker thứ 3 mới nâng replica=3.
|
|
- Cài Longhorn qua ArgoCD phải để `preUpgradeChecker.jobEnabled=false` — helm hook pre-upgrade sẽ deadlock ở PreSync (chạy trước khi RBAC/CRD tạo).
|
|
- 5 VM/1 host Proxmox: HA storage là ảo giác tới khi trải 2 host. Backup (Velero/pg_dump/mc mirror) là phòng thủ thật.
|