Appearance
基础资源选型
这层到底提供什么
基础资源层不处理数据,它回答四个问题:
| 问题 | 组件 | 能力 |
|---|---|---|
| 组件跑在哪、怎么调度 | Kubernetes | 统一编排、故障自愈、滚动发布 |
| 镜像从哪来 | Harbor | 私有镜像仓库,内网唯一来源 |
| 密钥怎么管、怎么轮转 | OpenBao | 密钥存储、动态凭证、PKI |
| 外部怎么进来、证书怎么签 | Envoy Gateway + cert-manager | 南北向入口、证书签发与轮转 |
四个能力缺一个,后面每层都要打补丁。所以这层不是"装几个工具",是先把平台的公共能力立起来。
为什么是 Kubernetes
候选对比
| 维度 | Kubernetes | 裸机 + 虚拟机 | Hadoop YARN | Nomad |
|---|---|---|---|---|
| 组件承载范围 | 计算与有状态服务统一编排,本栈全部组件以容器交付 | 逐组件手工部署,无统一编排 | 只调度 Hadoop 作业,不承载中间件 | 容器为主,有状态支持有限 |
| 故障自愈 | 声明式期望态 + 控制器循环,节点或进程故障自动重建 | 依赖人工介入 | 仅作业级重试 | 声明式,但生态较弱 |
| 弹性与扩容 | 加机器即扩算力,不改组件部署方式 | 需重建虚机并重新部署 | 需停机调整队列与节点 | 可扩,但周边需自建 |
| 发布与回滚 | 镜像版本即声明,回滚就是改回上一版 | 靠人记操作步骤 | 无版本化发布概念 | 需自建发布流程 |
| 生态与事实标准 | 云原生事实标准,所有组件的首选支持对象 | 无统一生态 | 仅覆盖 Hadoop 生态 | 生态与插件较少 |
| 人才与知识可得 | 知识库与人才供给最充足 | 全手工,不可持续 | 知识面窄 | 人才稀少 |
结论
Kubernetes 是必选项,不是可选项。 原因不是"流行",而是本栈的现实:
- 十几个组件里既有无状态计算(Spark、Flink、Kyuubi),也有有状态服务(Kafka、PostgreSQL、Doris、Elasticsearch)。只有 K8s 能用同一套声明式方式管理两类负载。
- 数仓要的是"ETL 不中断、对外服务不掉线"。K8s 的控制器循环、滚动升级、就绪探针、PDB 是这套可用性的最低保障。
- 未来加 GPU 节点跑 AI 训练/推理,还是同一套调度;换成 YARN 或裸机,等于重做一遍。
Harbor:私有镜像仓库
为什么必须有:K8s 每次拉镜像都走公网,一是慢、二是断网就起不来;镜像本身也是需要版本管理的资产。生产环境必须内网仓库。
落地要点:
- 先有鸡还是先有蛋:Harbor 自己也跑在 K8s 上。第一次要从公网拉 Harbor 镜像,装好后再把集群的镜像源切到 Harbor。
- 项目与配额:按
base、data、compute、governance分项目,开镜像保留策略(保留最近 N 个 tag + 每周全量),否则半年就把盘吃满。 - 扫描与签名:开 Trivy 扫描;有条件上 cosign 签名,配合准入策略只允许签名镜像。
- 复制:多集群时用 Harbor 的 replication 做异地同步。
测试集群例外:短期测试可以暂时不装 Harbor,用公网镜像 + 国内加速;但要在验收清单里记一笔"生产必须补"。三节点都拉同一批镜像,重复流量不小,能配本地缓存/加速器就配。
OpenBao:密钥与证书
背景:Vault 从 2023 年起改为 BUSL 许可,源码可见但不再是 OSI 开源。OpenBao 是它的开源分支(MPL-2.0),API 基本兼容,迁移成本低。
本栈里它干三件事:
| 用途 | 引擎 | 说明 |
|---|---|---|
| 静态密钥 | KV v2 | 数据库密码、S3 AK/SK、组件 admin token |
| 动态凭证 | Database secrets engine | 给 Spark/Flink 发短时数据库账号,避免长期密码 |
| 证书 | PKI secrets engine | 作为 cert-manager 的内部 CA 后端 |
落地要点:
- 生产用 Raft 存储 + 三节点,开自动解封(云 KMS 或 transit);
- 根令牌离线保存,日常用带策略的 AppRole / Kubernetes auth;
- 密钥轮转不是"改个密码",要配合应用 reload(K8s Secret 更新后滚动重启);
- 先定密钥分级:平台级、组件级、业务级,别把所有东西塞一个 path。
Envoy Gateway 与 cert-manager
Envoy Gateway:基于 Gateway API 的南北向入口。选它的理由是"够用且不复杂"——HTTPRoute/GRPCRoute、TLS 终止、统一认证(JWT/OIDC,必要时接外部鉴权)、限流,覆盖本栈对外暴露的需求。它不是唯一解,Traefik、APISIX、云厂商 LB 都能替代,但别同时上两套入口。
cert-manager:K8s 证书管理的事实标准。两种用法:
- 对外域名走 ACME(Let's Encrypt / 企业 CA);
- 内部组件间走
CAIssuer,CA 后端接 OpenBao PKI,证书自动续期。
注意:内部证书有效期别设太长(90 天足够),否则轮转逻辑永远得不到验证。
生产拓扑与测试集群的差异
| 项 | 生产 | 3 节点测试集群 |
|---|---|---|
| 集群 | 3 master + N worker,etcd 独立盘 | 3 台 kubeadm(1 control-plane + 2 worker) |
| 入口 | Envoy Gateway + 云 LB + WAF | NodePort + SSH 隧道 |
| 镜像 | Harbor + 扫描 + 签名 | 公网镜像 + 加速 |
| 密钥 | OpenBao 三节点 Raft | 单实例或三节点 Raft(看时间) |
| 存储 | Ceph 独立存储节点池、独立故障域 | SeaweedFS 3 节点,或 Ceph 3 OSD 同机房 |
| 网络 | CNI + NetworkPolicy + 多网卡 | 默认 CNI,单网卡/私网 |
| 升级 | 先 staging 后生产,逐节点 drain | 不升级,随环境重建 |
落地检查清单
- [ ] K8s 版本与所有 Operator(Spark、Flink、Doris、Strimzi、OpenMetadata)的兼容矩阵核对过
- [ ] 节点池按
system/compute/storage打标签,组件用 nodeSelector 固定 - [ ] 每个命名空间设置 ResourceQuota 与 LimitRange,防止一个组件吃光节点
- [ ] 关键组件配 PodDisruptionBudget,节点维护时不至于全挂
- [ ] 镜像仓库、密钥、入口、证书四件事都有 owner
- [ ] 集群证书与 kubeconfig 的过期时间记录在案