前文回顾:
本系列将介绍如何基于 ACK Fluid 反对和优化混合云的数据拜访场景,相干文章请参考:《基于 ACK Fluid 的混合云优化数据拜访(一):场景与架构》
在前文《基于 ACK Fluid 的混合云优化数据拜访(一):场景与架构》中,重点介绍 ACK Fluid 反对混合云数据拜访实用的不同利用场景和架构实现。在本文中会重点介绍如何通过 ACK Fluid 实现公共云的弹性计算实例拜访云下存储系统的能力。
概述
ACK(阿里云容器服务 Kubernetes)即开即用的弹性能力能够很好做自建 IDC 的弹性能力补充。特地是随着 AIGC 的风行,算力推动翻新的理念深入人心,许多本来抵制计算上云的客户也开始在评估公共云。他们通常会抉择应用 ECI(弹性计算实例)作为技术验证的第一步。然而,如何将自建存储与云上弹性资源对接,特地是 ECI 资源对接,就成了混合云客户应用阿里云的门槛。比方,用户想疾速比拟通过云上 ASK 和云下自建机房运行训练任务的老本,传统的做法须要把数据搬到云上,这就会波及数据隐衷问题,还有迁徙的工夫和金钱老本,无奈做疾速验证。甚至有些客户短期内无奈通过外部平安评审,导致整个翻新节奏受到重大的影响。
能够看到许多企业的数据都是存在线下,并且应用的存储类型多样,包含各种开源存储(Ceph,lustrure,JuiceFS,CubeFS)和自建存储。在应用公共云计算资源的时候,也存在挑战:
- 数据迁云安全性和老本评估工夫长:对于数据迁徙到云存储上,须要平安和存储团队的长时间评估,这会延缓整个上云过程。
- 数据拜访适配性差:比方公共云对于弹性计算实例(ECI)反对的分布式存储类型无限(比方 NAS,OSS,CPFS),然而对于第三方存储不足反对。
- 接入云平台周期长和难度高:须要开发和保护云原生兼容的 CSI 插件,一方面须要相干的专家和开发适配工程量,同时要保护版本的降级,同时反对的场景无限。比方自建 CSI 无奈适配弹性计算实例(ECI)。
- 不足可信通明的数据接入形式:如何在 Serverless 容器的黑盒零碎拜访数据过程中躲避泄露,如何确保数据在传输、拜访过程中平安,通明,牢靠。
- 防止业务批改的需要:如何确保业务用户不感知基础设施层面的差别,防止对现有利用自身进行任何批改。
ACK Fluid 通过提供 ThinRuntime 扩大机制反对将基于 FUSE 实现第三方存储客户端以容器化的形式接入 Kubernetes 中,能够反对阿里云上规范 Kubernetes,边缘 Kubernetes,Serverless Kubernetes 多种状态。
- 简略的开发接入模式,易扩大:基于 ThinRuntime 计划,只须要理解 Dockerfile 构建就能够实现,个别开发工作 2-3 小时左右,从而显著升高了接入第三方存储的工作老本。同时基于开源 Fluid 规范对于 ThinRuntime 提供了残缺的反对,只有满足开源要求就能够适配。
- 平安可控的数据拜访:以容器化的形式反对自定义形式实现数据拜访。整个数据拜访过程云平台无侵入,无需提供实现细节。
- 无升高革新适配的老本:只须要在 PVC 中增加特定 label 即可,满足了业务用户无需感知基础设施层面的差别的需要,能将存储适配工夫缩短为原打算的十分之一。
- 存储客户端的自适应部署:Fluid 同时反对 CSI 和 FUSE Sidecar 两种客户端部署模式,依据所在运行平台抉择适合的部署模式,将 PVC 协定转换成 Sidecar 模式,无需最终用户感知。
- 加强可观测性和可控制性:第三方存储客户端只须要实现本身的容器化,就能够转化为 Fluid 治理的 Pod,无缝接入 Kubernetes 体系,并取得可观测性和计算资源可控制性。
总结:ACK Fluid 为云上计算拜访云下数据提供了扩展性好,平安可控,低适配老本和与云平台实现无关的益处,利用案例参见小米 [1]。
演示
以开源 MinIO 为例,展现如何通过 Fluid 将第三方存储接入阿里云弹性计算资源(ECI)。
1. 前提条件
- 已创立 ACK Pro 版集群,且集群版本为 1.18 及以上。具体操作,请参见创立 ACK Pro 版集群 [2]。
- 已装置云原生 AI 套件并部署 ack-fluid 组件。重要:若您已装置开源 Fluid,请卸载后再部署 ack-fluid 组件。
- 未装置云原生 AI 套件:装置时开启 Fluid 数据减速。具体操作,请参见装置云原生 AI 套件 [3]。
- 已装置云原生 AI 套件:在容器服务治理控制台的云原生 AI 套件页面部署 ack-fluid。
- 已部署 ACK 虚构节点(Virtual Node)。具体操作,请参见通过部署 ACK 虚构节点组件创立 ECI Pod[4]。
- 已通过 kubectl 连贯 ACK 集群。具体操作,请参见通过 kubectl 工具连贯集群 [5]。
2. 筹备 MinIO 环境
部署 Minio 存储到 ACK 集群中。
如下 YAML 文件 minio.yaml:
apiVersion: v1
kind: Service
metadata:
name: minio
spec:
type: ClusterIP
ports:
- port: 9000
targetPort: 9000
protocol: TCP
selector:
app: minio
---
apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
# This name uniquely identifies the Deployment
name: minio
spec:
selector:
matchLabels:
app: minio
strategy:
type: Recreate
template:
metadata:
labels:
# Label is used as selector in the service.
app: minio
spec:
containers:
- name: minio
# Pulls the default Minio image from Docker Hub
image: bitnami/minio
env:
# Minio access key and secret key
- name: MINIO_ROOT_USER
value: "minioadmin"
- name: MINIO_ROOT_PASSWORD
value: "minioadmin"
- name: MINIO_DEFAULT_BUCKETS
value: "my-first-bucket:public"
ports:
- containerPort: 9000
hostPort: 9000
部署上述资源到 ACK 集群:
$ kubectl create -f minio.yaml
部署胜利后,ACK 集群内的其余 Pod 即可通过 http://minio:9000 的 Minio API 端点拜访 Minio 存储系统中的数据。上述 YAML 配置中,咱们设置 Minio 的用户名与明码均为 minioadmin,并在启动 Minio 存储时默认创立一个名为 my-first-bucket 的存储桶,在接下来的示例中,咱们将会拜访 my-first-bucket 这个存储桶中的数据。在执行以下步骤前,首先执行以下命令,在 my-first-bucket 中存储示例文件:
$ kubectl exec -it minio-69c555f4cf-np59j -- bash -c "echo fluid-minio-test > testfile"
$ kubectl exec -it minio-69c555f4cf-np59j -- bash -c "mc cp ./testfile local/my-first-bucket/"
$ kubectl exec -it minio-69c555f4cf-np59j -- bash -c "mc cat local/my-first-bucket/testfile"
fluid-minio-test
3. 集群管理员将 MinIO 接入 Fluid 的开发和部署过程
作为一个 MinIO 存储管理员,接入 Fluid 的工作次要是三个步骤,以下调试过程能够在开源 Kubernetes 中实现:
- 开发和构建 MinIO 容器镜像
- 开发和部署 MinIO 的 RuntimeProfile
- 创立拜访 MinIO 的 Fluid 数据集,并且生成对应的数据卷
3.1. 容器镜像的开发和构建
Fluid 将会把 ThinRuntime 中 FUSE 所需的运行参数、Dataset 中形容数据门路的挂载点等参数传入到 ThinRuntime FUSE Pod 容器中。在容器外部,须要执行参数解析脚本,并将解析完的运行时参数传递给 FUSE 客户端程序,由客户端程序实现 Fuse 文件系统在容器内的挂载。
因而,应用 ThinRuntime CRD 形容存储系统时,须要应用特制的容器镜像,镜像中须要包含以下两个程序:
- FUSE 客户端程序
- FUSE 客户端程序所需的运行时参数解析脚本
对于 FUSE 客户端程序,在本示例中抉择 S3 协定兼容的 goofys 客户端连贯并挂载 minio 存储系统。
对于运行时所需的参数解析脚本,定义如下 python 脚本 fluid-config-parse.py:
import json
with open("/etc/fluid/config.json", "r") as f:
lines = f.readlines()
rawStr = lines[0]
print(rawStr)
script = """
#!/bin/sh
set -ex
export AWS_ACCESS_KEY_ID=`cat $akId`
export AWS_SECRET_ACCESS_KEY=`cat $akSecret`
mkdir -p $targetPath
exec goofys -f --endpoint "$url" "$bucket" $targetPath
"""
obj = json.loads(rawStr)
with open("mount-minio.sh", "w") as f:
f.write("targetPath=\"%s\"\n" % obj['targetPath'])
f.write("url=\"%s\"\n" % obj['mounts'][0]['options']['minio-url'])
if obj['mounts'][0]['mountPoint'].startswith("minio://"):
f.write("bucket=\"%s\"\n" % obj['mounts'][0]['mountPoint'][len("minio://"):])
else:
f.write("bucket=\"%s\"\n" % obj['mounts'][0]['mountPoint'])
f.write("akId=\"%s\"\n" % obj['mounts'][0]['options']['minio-access-key'])
f.write("akSecret=\"%s\"\n" % obj['mounts'][0]['options']['minio-access-secret'])
f.write(script)
上述 python 脚本按以下步骤执行:
- 读取 /etc/fluid/config.json 文件中的 json 字符串,Fluid 会将 Fuse 客户端挂载所需的参数存储并挂载到 Fuse 容器的 /etc/fluid/config.json 文件。
- 解析 json 字符串,从中提取 Fuse 客户端挂载所需的参数。例如,上述示例中的 url、bucket、minio-access-key、minio-access-secret 等参数。
- 提取出所需参数后,输入挂载脚本到文件 mount-minio.sh。
⚠️留神:在 Fluid 中,/etc/fluid/config.json 文件中仅会提供各个加密参数具体值的存储门路,因而须要参数解析脚本额定执行文件读取操作(例如:上述示例中的 “export AWS_ACCESS_KEY_ID=cat $akId
“)。
接着,应用如下 Dockerfile 制作镜像,这里咱们间接抉择蕴含 goofys 客户端程序的镜像(i.e. cloudposse/goofys)作为 Dockerfile 的基镜像:
FROM cloudposse/goofys
RUN apk add python3 bash
COPY ./fluid-config-parse.py /fluid-config-parse.py
应用以下命令构建并推送镜像到镜像仓库:
$ IMG_REPO=<your image repo>
$ docker build -t $IMG_REPO/fluid-minio-goofys:demo .
$ docker push $IMG_REPO/fluid-minio-goofys:demo
3.2. 开发和部署 MinIO 的 ThinRuntimeProfile
在创立 Fluid Dataset 和 ThinRuntime 挂载 Minio 存储系统前,首先须要开发 ThinRuntimeProfile CR 资源。ThinRuntimeProfile 是一种 Kubernetes 集群级别的 Fluid CRD 资源,它形容了一类须要与 Fluid 对接的存储系统的根底配置(例如:容器、计算资源形容信息等)。集群管理员需提前在集群中定义若干 ThinRuntimeProfile CR 资源,在这之后,集群用户须要显示申明援用一个 ThinRuntimeProfile CR 来创立 ThinRuntime,从而实现对应存储系统的挂载。
以下为 MinIO 存储系统的 ThinRuntimeProfile CR 示例(profile.yaml):
apiVersion: data.fluid.io/v1alpha1
kind: ThinRuntimeProfile
metadata:
name: minio
spec:
fileSystemType: fuse
fuse:
image: $IMG_REPO/fluid-minio-goofys
imageTag: demo
imagePullPolicy: IfNotPresent
command:
- sh
- -c
- "python3 /fluid-config-parse.py && chmod u+x ./mount-minio.sh && ./mount-minio.sh"
在上述 CR 示例中:
- fileSystemType 形容了 ThinRuntime FUSE 所挂载的文件系统类型 (fsType)。须要依据应用的存储系统 Fuse 客户端程序填写,例如,goofys 挂载的挂载点 fsType 为 fuse,s3fs 挂载的挂载点 fsType 为 fuse.s3fs)
- fuse 形容了 ThinRuntime FUSE 的容器信息,包含镜像信息 (image、imageTag、imagePullPolicy) 以及容器启动命令 (command) 等。
创立 ThinRuntimeProfile CR minio 并且部署到 ACK 集群。
3.3. 创立 Dataset 和 ThinRuntime CR 来挂载拜访 Minio 存储系统中的数据。
创立拜访 minio 所需的凭证 Secret:
$ kubectl create secret generic minio-secret \
--from-literal=minio-access-key=minioadmin \
--from-literal=minio-access-secret=minioadmin
创立 Dataset 和 ThinRuntime CR 的示例(dataset.yaml),目标是生成用户可用的存储数据卷:
apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
name: minio-demo
spec:
mounts:
- mountPoint: minio://my-first-bucket # minio://<bucket name>
name: minio
options:
minio-url: http://minio:9000 # minio service <url>:<port>
encryptOptions:
- name: minio-access-key
valueFrom:
secretKeyRef:
name: minio-secret
key: minio-access-key
- name: minio-access-secret
valueFrom:
secretKeyRef:
name: minio-secret
key: minio-access-secret
---
apiVersion: data.fluid.io/v1alpha1
kind: ThinRuntime
metadata:
name: minio-demo
spec:
profileName: minio
- Dataset.spec.mounts[*].mountPoint 指定所需拜访的数据桶 (e.g. my-frist-bucket)
- Dataset.spec.mounts[*].options.minio-url 指定 minio 在集群可拜访的 URL(e.g. http://minio:9000)
- ThinRuntime.spec.profileName 指定已创立的 ThinRuntimeProfile(e.g. minio-profile)
创立 Dataset 和 ThinRuntime CR:
$ kubectl create -f dataset.yaml
查看 Dataset 状态,一段时间后,可发现 Dataset 和 Phase 状态变为 Bound,Dataset 可失常挂载应用:
$ kubectl get dataset minio-demo
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE
minio-demo N/A N/A N/A Bound 2m18s
4. 最终用户应用 ECI(弹性容器实例)间接通过 PVC(数据卷申请)间接拜访 MinIO
对于最终用户来说,拜访 MinIO 的过程是非常简单的。以下为示例 Pod Spec 的 YAML 文件(pod.yaml),用户只须要应用和 Dataset 同名的 PVC:
apiVersion: v1
kind: Pod
metadata:
name: test-minio
labels:
alibabacloud.com/fluid-sidecar-target: eci
alibabacloud.com/eci: "true"
spec:
restartPolicy: Never
containers:
- name: app
image: nginx:latest
command: ["bash"]
args:
- -c
- ls -lh /data && cat /data/testfile && sleep 180
volumeMounts:
- mountPath: /data
name: data-vol
volumes:
- name: data-vol
persistentVolumeClaim:
claimName: minio-demo
- http://alibabacloud.com/fluid-sidecar-target=eci 标识了须要启用 ACK Fluid 对于 ECI 的特定反对
- http://alibabacloud.com/eci 示意在 ACK 中调度到 ECI 对应的虚构节点
创立数据拜访 Pod:
$ kubectl create -f pod.yaml
查看数据拜访 Pod 后果:
$ kubectl logs test-minio -c app
total 512
-rw-r--r-- 1 root root 6 Aug 15 12:32 testfile
fluid-minio-test
能够看到,Pod test-minio 可失常拜访 Minio 存储系统中的数据。
- 环境清理
$ kubectl delete -f pod.yaml
$ kubectl delete -f dataset.yaml
$ kubectl delete -f profile.yaml
$ kubectl delete -f minio.yaml
⚠️留神
本示例用于展现整个数据接入流程,相干的 MinIO 环境配置仅作为演示目标。
相干链接:
[1] 小米
https://www.infoq.cn/article/kco7hi5TcVE08ySwNIw7
[2] 创立 ACK Pro 版集群
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/…
[3] 装置云原生 AI 套件
https://help.aliyun.com/zh/ack/cloud-native-ai-suite/user-gui…
[4] 通过部署 ACK 虚构节点组件创立 ECI Pod
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/…
[5] 通过 kubectl 工具连贯集群
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/…
作者:车漾
点击立刻收费试用云产品 开启云上实际之旅!
原文链接
本文为阿里云原创内容,未经容许不得转载。