diff --git a/README.md b/README.md index 85aaf8c..4e89865 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,9 @@ Quản deploy lakehouse lên K8s qua ArgoCD. Theo khuôn `argo-k8s` (App-of-Apps ## Cấu trúc ``` +infra/cluster/ Hạ tầng NỀN cụm (singleton toàn cụm, tách khỏi envs/) + 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) @@ -41,17 +44,21 @@ images/spark-cdc/ Dockerfile (image bundled) ## Điều kiện tiên quyết trên cụm (Phase 0 — dựng TRƯỚC) 1. ArgoCD (đã có). -2. **Longhorn** (StorageClass `longhorn`) — cho Kafka PV + checkpoint. -3. **Sealed Secrets controller**. -4. **cert-manager** + ingress (nếu expose UI). -5. **Gitea `git.dbiz.com`** online + repo này + **Deploy Token** (đọc repo cho ArgoCD, đọc registry cho pull image). -6. **Woodpecker** nối Gitea, khai secret `gitea_registry_user` / `gitea_registry_token`. +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ất cả. +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. @@ -62,4 +69,6 @@ images/spark-cdc/ Dockerfile (image bundled) ## 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. diff --git a/charts/lake-cdc-job/templates/sparkapplication.yaml b/charts/lake-cdc-job/templates/sparkapplication.yaml index 33015c0..81f988f 100644 --- a/charts/lake-cdc-job/templates/sparkapplication.yaml +++ b/charts/lake-cdc-job/templates/sparkapplication.yaml @@ -38,7 +38,8 @@ spec: - name: KAFKA_BOOTSTRAP value: "{{ .Values.kafka.bootstrap }}" - name: TOPIC_PATTERN - value: "{{ .Values.topicPattern }}" + # | quote: escape backslash đúng (regex crm\.public\..*) -> YAML hợp lệ + value: {{ .Values.topicPattern | quote }} - name: TARGET_TABLE value: "{{ .Values.targetTable }}" - name: TRIGGER_INTERVAL diff --git a/envs/dev/apps/spark-operator.yaml b/envs/dev/apps/spark-operator.yaml index bd5faf1..6e6289e 100644 --- a/envs/dev/apps/spark-operator.yaml +++ b/envs/dev/apps/spark-operator.yaml @@ -3,6 +3,8 @@ kind: Application metadata: name: lake-spark-operator-dev namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "3" spec: project: default source: @@ -22,4 +24,6 @@ spec: namespace: dbiz-lake-dev syncPolicy: automated: { prune: true, selfHeal: true } - syncOptions: [ CreateNamespace=true ] + syncOptions: + - CreateNamespace=true + - ServerSideApply=true # né "annotations Too long" trên CRD spark-operator