跳到主要内容

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,见下文
pathStylefalse寻址风格,见下文
tls一旦设置,端点切换为 https
regionus-east-1请求签名用的区域

端点由这些字段拼装:设置了 tls 就用 https,否则用 http。因此不存在一个需要额外同步的 "是否启用 TLS" 开关。

凭据

credentials.secretClass 指向的 SecretClass 必须提供且仅需提供两个键:

产品读取为
ACCESS_KEYAWS_ACCESS_KEY_ID
SECRET_KEYAWS_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
truehttps://<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: 块,效果等价,适合只有一个 产品使用该端点的场景。

相关内容