Kubernetes 是用于自动部署、扩展和管理容器化应用程序的一个开源的容器编排解决方案。尽管 Kubernetes 最初是为无状态应用程序设计的,但随着有状态工作负载的日益流行,Kubernetes 也可用于管理有状态应用程序。
今天我们想要分享的是如何在 Kubernetes 中使用 YRCloudFile 的 DataLoad 功能。当前业内擅长非结构化数据的存储方式主要是文件存储和对象存储,对象存储的优势在于无限扩容和成本低廉,但在数据访问性能上的确较差。基于这一痛点,高性能分布式文件存储 YRCloudFile 结合用户需求开发了 DataLoad 功能,让用户既能体验文件存储的性能,又能享受对象存储的成本和容量优势;另一方面,容器改变了软件开发、交付和 IT 运营的方式。而 Kubernetes 作为一种可自动实施 Linux 容器操作的开源平台,在其之上能运行所有重要的业务应用,所以逐渐成为了容器编排的业界标准。
通过部署 Fluid + YRCloudFile Runtime,Kubernetes 容器能方便的通过 YRCloudFile 来高效使用对象存储。
Fluid 简介
Fluid 是一款开源的云原生基础架构。在计算和存储分离的大背景驱动下,Fluid 的目标是为 AI 与大数据云原生应用提供一层高效便捷的数据抽象,将数据从存储抽象出来,以便实现:
- 通过数据亲和性调度和分布式缓存引擎加速,实现数据和计算之间的融合,从而加速计算对数据的访问。
- 将数据独立于存储进行管理,并且通过 Kubernetes 的命名空间进行资源隔离,实现数据的安全隔离。
- 将来自不同存储的数据联合起来进行运算,从而有机会打破不同存储的差异性带来的数据孤岛效应。
通过 Kubernetes 服务提供的该数据层抽象,就可以让数据像流体一样在诸如 HDFS、OSS、Ceph 这样的存储源和 Kubernetes 上层的云原生应用计算之间灵活高效地移动、复制、驱逐、转换和管理。而具体的数据操作对用户透明,用户不必再担心访问远端数据的效率,或是管理数据源的便捷性,以及如何帮助 Kubernetes 做出恰当的调度决策等运维问题。用户只需以 Kubernetes 原生数据卷的方式直接访问抽象出来的数据,剩余任务交给 Fluid 完成。
重要概念:
Dataset:数据集是逻辑上相关的一组数据的集合,会被运算引擎使用,比如大数据的 Spark,AI 场景的 TensorFlow。这些数据智能的应用会创造工业界的核心价值。
Runtime:实现数据集安全性,版本管理和数据加速等能力的执行引擎。Fluid 的 Runtime 定义了标准化的接口,通过实现这些接口,开发者能够针对不同的场景与需求,扩展不同的 Runtime。
Fluid + YRCloudFile Runtime,加速数据高效访问
云原生容器应用的数据访问面临众多的挑战,YRCloudFile 为解决这些问题,重构新一代面向容器环境的存储解决方案,开发了标准 CSI 插件无缝对接 Kubernetes。用户只需在 Kubernetes 集群 Master 节点及计算节点上,以容器形式运行 YRCloudFile 提供的 CSI 插件,即可对 YRCloudFile 的存储能力进行调度和访问。此外,YRCloudFile 充分调研客户对于对象存储的使用需求设计了 DataLoad 功能,让用户既能体验文件存储的性能,又享受对象存储的成本和容量优势。对于容器用户来说,只通过 YRCloudFile-CSI 也能够使用 YRCloudFile 的 DataLoad 功能,但是操作上较为冗余,生命周期管理上不够完善。
Fluid 通过在 Kubernetes 中部署 Dataset 和 Runtime 两个自定义资源对象,为数据密集型应用(例如大数据应用、AI 应用等)提供了数据加速的服务,并具备很强的数据集安全性和版本管理能力。用户在 Dataset 中指定远存储的信息,Runtime 将远程数据加载到离计算节点更近的地方,从而达到数据访问加速的效果。
将 Fluid 的管理能力和 YRCloudFile 的高效访问能力结合。YRCloudFile 基于自身特性开发了符合 Runtime 接口的 YRCloudFile Runtime,使用 Fluid 的接口来实现 YRCloudFile 的 DataLoad 功能,让容器用户以 YRCloudFile 为存储卷,只使用 Kubernetes 的 API 接口就可以高效的使用对象存储 。
Fluid + YRCloudFile Runtime 当前具备的 DataLoad 功能如下:
- 支持元数据导入和数据预热
- 支持指定前缀的导入
- 支持数据使用结束后的增量导出
后期我们也会将 YRCloudFile 的 DataLoad 功能持续集成到 YRCloudFile Runtime 中。
整体架构图如下图所示,YRCloudFile Runtime 会启动一个 Master 组件。Master 组件主要用来调用 YRCloudFile 的 gRPC 服务。
使用流程:
- 用户创建 Dataset 定义 S3 的访问信息和 DataLoad 的配置参数。
- 用户创建 Runtime,YRCloudFile Runtime Controller 监听到 YRCloudFile Runtime 资源,会将 YRCloudFile Runtime 与同名的 Dataset 进行绑定。
- 根据 Dataset 的配置,自动导入 S3 数据到 YRCloudFile 中。
- 通过 YRCloudFile-CSI 插件,将对接了 S3 的 YRCloudFile 以 PVC 形式暴露给容器使用,支持容器以 POSIX 接口访问数据。
- 用户使用返回的 PVC 来访问数据。
- 数据使用结束,将增量数据从 YRCloudFile 热层导出到对象存储中。
YRCloudFile Runtime 使用演示
下面来看看如何使用 YRCloudFile Runtime 来访问 S3 数据。
环境要求
- Kubernetes version > 1.14, 支持 CSI
- Fluid 0.7.0
- YRCloudFile集群 v6.8.x
- YRCloudFile-CSI,YRCloudFileRuntime v6.8.x
创建 Dataset
创建 Dataset 的 YAML 文件
apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
name: sample
spec:
mounts:
- mountPoint: s3_ip
name: sample
options:
fs.s3.accessKeyId: s3_access_key
fs.s3.accessKeySecret: s3_access_key_secret
fs.s3.bucketName: s3_bucket_name
loadType: onlyMeta/mate+data
importPrefix: prefix
needExport: true/false
参数解释:
mountPoint,accessKeyId,bucketName 是访问 S3 的必备信息。
loadType:导入模式,只导入元数据或者预加载(导入数据+元数据)。
importPrefix:通过配置 importPrefix 导入指定前缀的文件。
needExport:数据使用结束后是否将增量数据导出到 S3。
创建 YRCloudFile Runtime
创建 YRCloudFile Runtime 的 YAML 文件:
apiVersion: data.fluid.io/v1alpha1
kind: YrFSRuntime
metadata:
name: test1
YRCloudFile Runtime 只有一个 Master 组件,创建 YRCloudFile Runtime 后会启动 Master 的 Pod 。
创建 YRCloudFile Runtime 并查看 Master 组件 Pod 的状态。
$kubectl apply -f yrfsruntime.yaml
yrfsruntime.data.fluid.io/sample created
$kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-master-0 1/1 Running 0 4m23s
Pod 创建成功后,YRCloudFile Runtime controller 就会进入 Pod 调用 gRPC 来执行 S3 数据的导入。
查看导入状态:
$kubectl get yrfsruntime
NAME MASTER PHASE AGE
sample Imported 2m12s
当状态为表示 Imported 已经导入完成,会创建出与 Dataset 同名的 PVC 将 YRCloudFile 暴露给容器使用。
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
sample Bound pvc-8e344d70-d346-47de-9645-2468c6669877 100Pi RWX yrcloudfile-sc 5m42s
创建容器使用 S3 数据
创建 Pod 的 YAML:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /data
name: vol
volumes:
- name: vol
persistentVolumeClaim:
claimName: sample
通过配置与 YRCloudFile Runtime 同名的 PVC,容器可以立刻像使用文件存储一样使用对象存储中的数据。进入 Pod 执行查看目录下是否已包含对象存储中的数据:
$ kubectl exec -it nginx bash -- ls /data
通过上述的设计,我们将 YRCloudFile 的 DataLoad 功能融入到 Fluid 中,用户只需简单的创建 Dataset 和 Runtime,就可以让容器高效的使用对象存储,既能享受到文件存储的性能,还可以做到降本增效。未来我们的 DataLoad 功能会不断演进,也会更好融入到 Kubernetes 中,敬请期待哦。