S3
Kubedoop 中很多产品都要读写对象存储:Hive 把表数据放在上面,Trino 查询它,Spark 往里写检查点。 为了不在每个产品资源里重复填写端点和凭据,Kubedoop 把 S3 抽象成两个集群资源,由产品去引用。
两个对象
| 对象 | 描述内容 |
|---|---|
S3Connection | 对象存储在哪、怎么连:host、port、TLS、region、寻址风格、凭据 |
S3Bucket | 一个桶名,加上这个桶所在的连接 |
两者都属于 s3.kubedoop.dev/v1alpha1 API 组。
产品用哪一个,取决于它如何寻址存储。被交付整个桶的产品用 S3Bucket;自己决定桶名的产品——
比如 Hive Metastore——直接用 S3Connection。
inline 与 reference 二选一
凡是接受 S3 配置的地方,Kubedoop 都提供同一对字段:inline 就地定义,reference 引用同命名空间
下已有对象的名字。两者互斥,同时设置或都不设置都会解析失败:
invalid S3 connection: inline and reference are mutually exclusive
invalid S3 connection: neither inline nor reference is set
只要有第二个产品要访问同一个对象存储,就该改用 reference,让端点只定义一次。
S3Connection
apiVersion: s3.kubedoop.dev/v1alpha1
kind: S3Connection
metadata:
name: minio
spec:
host: minio.default.svc.cluster.local
port: 9000
pathStyle: true
region: us-east-1
credentials:
secretClass: minio-credentials
| 字段 | 必填 | 默认值 | 说明 |
|---|---|---|---|
host | 是 | — | 对象存储主机名。不带协议头,协议由 tls 决定 |
port | 否 | — | 不设置时端点里完全不带端口,走协议默认端口 |
credentials | 是 | — | 提供访问密钥的 SecretClass,见下文 |
pathStyle | 否 | false | 寻址风格,见下文 |
tls | 否 | — | 一旦设置,端点切换为 https |
region | 否 | us-east-1 | 请求签名用的区域 |
端点由这些字段拼装:设置了 tls 就用 https,否则用 http。因此不存在一个需要额外同步的
"是否启用 TLS" 开关。
凭据
credentials.secretClass 指向的 SecretClass 必须提供且仅需提供两个键:
| 键 | 产品读取为 |
|---|---|
ACCESS_KEY | AWS_ACCESS_KEY_ID |
SECRET_KEY | AWS_SECRET_ACCESS_KEY |
Secret Operator 会把它们以文件形式挂载到 /kubedoop/secret/<volume>/,产品再注入到环境变量:
export AWS_ACCESS_KEY_ID="$(cat /kubedoop/secret/s3-credentials/ACCESS_KEY)"
export AWS_SECRET_ACCESS_KEY="$(cat /kubedoop/secret/s3-credentials/SECRET_KEY)"
credentials 还可以带 scope,用于收窄签发凭据的适用范围——SecretClass 的作用域机制参见
认证。
pathStyle:这个字段会让 MinIO 挂掉
pathStyle 决定桶的寻址方式:
| 取值 | 生成的 URL | 适用于 |
|---|---|---|
false(默认) | https://<bucket>.<host>——虚拟主机风格 | AWS S3 |
true | https://<host>/<bucket>——路径风格 | MinIO、Ceph RGW 等绝大多数自建后端 |
默认值对 AWS 是对的,对大多数集群内部署是错的。MinIO 尤其只支持路径风格。用默认值时客户端会去解析
<bucket>.<host>——集群内的 MinIO 就是 warehouse.minio——这个域名在 DNS 里并不存在。
准入阶段不会拦截这个错误。 资源正常创建,Pod 正常启动,直到第一次访问对象时才失败。
MinIO、Ceph RGW 这类后端请设置 pathStyle: true。
TLS
设置 tls 会把端点切到 https。嵌套的 verification 决定如何校验服务端证书:
spec:
host: s3.example.com
tls:
verification:
server:
caCert:
secretClass: tls # 签发 CA 证书的 SecretClass
verification | 行为 |
|---|---|
server.caCert.secretClass | 用该 SecretClass 提供的 CA 校验 |
server.caCert.webPki: {} | 用系统内置的公共 CA 集校验 |
none: {} | 完全不校验证书 |
none 会彻底关闭校验,不应出现在生产环境。
S3Bucket
S3Bucket 就是一个桶名加一个连接,而这个连接本身同样是 inline/reference 二选一:
apiVersion: s3.kubedoop.dev/v1alpha1
kind: S3Bucket
metadata:
name: warehouse
spec:
bucketName: warehouse
connection:
reference: minio
bucketName 是对象存储上的真实桶名;资源自身的 metadata.name 只是其他 Kubedoop 资源引用它时
用的名字。两者不必相同。
没有 connection 的桶会解析失败:
invalid S3 bucket "warehouse": no connection is set
在产品中使用
产品侧暴露的是同一对 inline/reference 字段。Hive Metastore 在 clusterConfig.s3 下接受一个连接:
apiVersion: hive.kubedoop.dev/v1alpha1
kind: HiveMetastore
metadata:
name: hive
spec:
clusterConfig:
s3:
reference: minio
把 reference: minio 换成字段与 S3Connection spec 相同的 inline: 块,效果等价,适合只有一个
产品使用该端点的场景。