aicam opened a new pull request, #6295:
URL: https://github.com/apache/texera/pull/6295

   ### What changes were proposed in this PR?
   
   This completes the "make object storage pluggable" work by wiring the **data 
tier** (LakeFS blockstore + Lakekeeper Iceberg warehouse) to an external S3 
store and adding a single switch to drop the in-cluster MinIO entirely. #5932 
did the **application tier** (`storage.s3`) and explicitly deferred this half. 
It is **non-breaking**: the default (on-prem / in-cluster MinIO) install 
renders the same set of resources.
   
   - **`minio.enabled` switch** (`values.yaml`, default `true`) to turn off the 
bundled MinIO subchart and point everything at external S3:
     - `Chart.yaml` -- the `minio` dependency gets `condition: minio.enabled`.
     - `templates/on-prem/minio-persistence.yaml` -- the MinIO PV/PVC is gated 
on `minio.enabled` as well as `minio.persistence.enabled`.
     - `templates/base/external-names/external-names.yaml` -- the 
`<release>-minio` `ExternalName` alias (exposed to the computing-unit-pool 
namespace) is only rendered when MinIO is enabled; with external S3 the CU pods 
reach the store directly via `STORAGE_S3_ENDPOINT`.
   - **Lakekeeper init job** 
(`templates/base/lakekeeper/lakekeeper-init-job.yaml`):
     - `STORAGE_S3_*` env now resolves through the shared `texera.s3.*` helpers 
introduced in #5932 (endpoint + credentials Secret name/keys) instead of 
hardcoding `<release>-minio`.
     - New `lakekeeperInit.createBucket` (default `true`) -- when `false`, the 
job skips `mc mb` and logs that it is using a pre-existing external bucket. 
Needed because an external bucket already exists and its IAM principal may lack 
`s3:CreateBucket`.
     - New `lakekeeperInit.warehouse.flavor` -- `s3-compat` (MinIO/other; emits 
`endpoint` + `path-style-access: true`) or native `aws` (real AWS S3; omits 
both). New optional `lakekeeperInit.warehouse.keyPrefix` to isolate the 
warehouse within a shared bucket.
   - **`values.yaml`** -- documents `minio.enabled`, the LakeFS 
external-blockstore override path, and the new `lakekeeperInit` keys.
   - **`values-aws.yaml`** (new) -- a complete, copy-pasteable all-external-S3 
overlay: MinIO off, `storage.s3` (endpoint/region/credentials or 
`existingSecret`), LakeFS region-only S3 blockstore with credentials injected 
via `extraEnvVars`, and Lakekeeper `flavor: aws` + `createBucket: false`.
   
   How it behaves:
   - **Default (no config):** LakeFS and Lakekeeper use the in-cluster MinIO 
exactly as before; the MinIO subchart, PV/PVC, and `ExternalName` all render as 
today.
   - **External S3 (`-f values-aws.yaml`):** no MinIO is deployed; the app 
tier, LakeFS, and Lakekeeper all target the external S3 buckets, and the 
Lakekeeper warehouse is registered with the native AWS flavor against a 
pre-existing bucket.
   
   ### Any related issues, documentation, discussions?
   
   Closes #6294 (LakeFS blockstore + Lakekeeper warehouse external-S3 task).
   Part of #5891 -- unify AWS (EKS) and on-premise Kubernetes deployment under 
`bin/k8s` (parent feature).
   Follows #5932 (app-tier `storage.s3`) and #5757 (Helm template reorg).
   
   ### How was this PR tested?
   
   **1. Render parity (default install unchanged).** `helm template texera 
bin/k8s` on this branch vs on `main` renders the same set of resources; `helm 
lint bin/k8s` passes. The new `{{- if }}` guards (MinIO ExternalName, 
persistence, createBucket, flavor) all evaluate to their prior behavior when 
`minio.enabled`/`createBucket` default to `true`.
   
   **2. External-S3 render.** `helm template texera bin/k8s -f 
bin/k8s/values-aws.yaml` deploys no MinIO subchart / PV / PVC / ExternalName, 
routes the Lakekeeper init job's `STORAGE_S3_*` at the external endpoint and 
credentials Secret, skips the `mc mb` bucket-creation step, and registers the 
warehouse storage profile with `"flavor": "aws"` (no `endpoint` / 
`path-style-access`). `helm lint` passes for this value set.
   
   **3. End-to-end on a live EKS cluster with real AWS S3.** Stood up an 
isolated EKS cluster (`us-west-2`, its own AWS account, no MinIO) plus two 
pre-created S3 buckets (LakeFS blockstore + Iceberg warehouse) and an IAM user 
scoped to just those buckets with **no** `CreateBucket` permission. Built all 
Texera service images from this branch, deployed the chart with an external-S3 
overlay derived from `values-aws.yaml`, and exercised the full stack:
   - LakeFS + Lakekeeper init jobs authenticated to external S3 and initialized 
(Lakekeeper `aws` flavor, bucket-creation skipped against the pre-existing 
warehouse bucket).
   - Created a dataset -> objects written to the external LakeFS bucket; 
dataset preview served via presigned S3 URLs (external buckets need a CORS 
rule, noted below).
   - Ran a workflow (CSV file scan) end to end -> **success, 100 rows 
returned**, with the Iceberg result table physically materialized in the 
external warehouse bucket (`metadata.json` + data objects confirmed via the S3 
API). This exercises the full external-S3 path: file-service reads the CSV from 
LakeFS -> S3, the computing-unit pod reaches the Lakekeeper REST catalog, and 
results are written to Iceberg -> S3 and read back.
   
   All test AWS resources (cluster, buckets, IAM user) were torn down afterward.
   
   Operational note surfaced by the live test (not a chart defect, worth 
documenting): with a real external S3 store, dataset preview requires a CORS 
rule on the buckets (`GET`/`HEAD`) because the presigned URLs are served 
cross-origin from `*.s3.<region>.amazonaws.com`, whereas the in-cluster MinIO 
was same-origin.
   
   No unit tests were added -- the change is limited to Helm chart 
values/templates, validated by the render diff, `helm lint`, and the live 
end-to-end run above.
   
   ### Was this PR authored or co-authored using generative AI tooling?
   
   Generated-by: Claude Code (Claude Opus 4.8)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to