基于 ACK Fluid 的混合云优化数据访问(四):将第三方存储目录挂载到 Kubernetes,提升效率和标准化

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 基于 ACK Fluid 的混合云优化数据访问(四):将第三方存储目录挂载到 Kubernetes,提升效率和标准化

作者:车漾


前文回顾:

本系列将介绍如何基于 ACK Fluid 支持和优化混合云的数据访问场景,相关文章请参考:

-基于 ACK Fluid 的混合云优化数据访问(一):场景与架构

-基于 ACK Fluid 的混合云优化数据访问(二):搭建弹性计算实例与第三方存储的桥梁

-基于 ACK Fluid 的混合云优化数据访问(三):加速第三方存储的读访问,降本增效并行


在前一篇文章加速第三方存储的读访问,降本增效并行中,介绍如何加速第三方存储访问,实现更好的性能,更低的成本同时降低对专线稳定性的依赖。


还有一些客户的场景下,出于历史原因和容器存储接口开发维护的成本,并没有选择使用标准的 CSI 接口,而是使用非容器化的手段,比如自动化脚本。但是一旦拥抱云,就需要考虑如何和基于标准接口的云服务对接的问题。


而本文将重点介绍如何通过 ACK Fluid 实现第三方存储主机目录挂载 Kubernetes 化,更加标准并加速提效。



概述


有许多企业由于历史原因和技术云下存储选择没有支持 CSI 协议,只支持以主机目录的方式通过 ansible 等运维工具挂载,一方面存在与 Kubernetes 标准化平台的对接的挑战,另一方面也需要应对与上篇文章类似的性能和成本的问题:


  • 缺少标准化,上云困难:主机目录挂载的模式由于无法被 Kubernetes 感知和调度,很难被容器化工作负载使用和管理。
  • 缺少数据隔离性:由于整个目录都被挂载到主机上,并被所有的工作负载访问,导致数据全局可见。
  • 数据访问在成本,性能和可用性上有何场景 2 相同的需求,因此不再赘述。


ACK Fluid 提供了基于 JindoRuntime 的 PV 主机目录通用加速能力[1],直接支持主机目录挂载可以原生,简单,快速,安全的获得通过分布式缓存实现数据访问加速能力。


1. 将传统架构迁移到云原生适配架构:将主机目录挂载模式变化为 Kubernetes 可以管理的 CSI 协议下的 PV 存储卷,方便通过标准化协议与公共云相结合。

2. 传统架构迁移低成本:只需要实现主机目录挂载可以立即使用,无需额外开发;只需要在部署时刻将 Hostpath 协议转换成 PV 存储卷。

3. 数据可隔离:通过 Fluid 的子数据集模式可以隔离不同用户对于线下存储不同目录的可见性。

4. 可以提供和《加速第三方存储的读访问,降本增效并行》一样的性能,成本,自动化和无缓存数据落盘的优点。


总结:ACK Fluid 为云上计算访问第三方存储的主机目录挂载方式提供了开箱即用,高性能,低成本,自动化和无数据落盘的收益。


演示


1. 前提条件

  • 已创建 ACK Pro 版集群,且集群版本为 1.18 及以上。具体操作,请参见创建 ACK Pro 版集群[2]
  • 已安装云原生 AI 套件并部署 ack-fluid 组件。重要:若您已安装开源 Fluid,请卸载后再部署 ack-fluid 组件。
  • 未安装云原生 AI 套件:安装时开启 Fluid 数据加速。具体操作,请参见安装云原生 AI 套件[3]
  • 已安装云原生 AI 套件:在容器服务管理控制台云原生 AI 套件页面部署 ack-fluid
  • 已通过 kubectl 连接 ACK 集群。具体操作,请参见通过 kubectl 工具连接集群[4]
  • 已创建需要访问存储系统对应的 PV 存储卷和 PVC 存储卷声明。在 Kubernetes 环境中,不同的存储系统有不同的存储卷创建方式,为保证存储系统与 Kubernetes 集群的连接稳定,请根据对应存储系统的官方文档进行准备。


2. 准备主机目录挂载点

本示例中通过 sshfs 模拟第三方存储通过 fluid 转化为数据卷声明,并且对其实现访问加速。



2.1 首先登录三台机器 192.168.0.1,192.168.0.2,192.168.0.3, 分别安装 sshfs 服务,在本例子中以 CentOS 为例,执行如下命令。


$ sudo yum install sshfs -y


2.2 登录 sshfs 服务器 192.168.0.1,执行如下命令,在 /mnt 目录下创建一个新的子目录作为主机目录挂载点,并且创建一个测试文件。


$ mkdir /mnt/demo-remote-fs
$ cd /mnt/demo-remote-fs
$ dd if=/dev/zero of=/mnt/demo-remote-fs/allzero-demo count=1024 bs=10M


2.3 执行如下命令,为 sshfs 的客户端 192.168.0.2 和 192.168.0.3 两个节点创建相应的主机目录。


$ mkdir /mnt/demo-remote-fs
$ sshfs 192.168.0.1:/mnt/demo-remote-fs /mnt/demo-remote-fs
$ ls /mnt/demo-remote-fs


2.4 执行如下命令,为 192.168.0.2 和 192.168.0.3 节点打标签。标签 demo-remote-fs=true 用于设置 JindoRuntime 的 Master 和 Worker 组件的节点调度约束条件。


$ kubectl label node 192.168.0.2 demo-remote-fs=true$ 
kubectl label node 192.168.0.3 demo-remote-fs=true


2.5 选择 192.168.0.2 执行如下命令,访问数据,评估文件访问性能,拷贝 10G 文件的时间需要 1m5.889s。


$  ls -lh /mnt/demo-remote-fs/
total 10G
-rwxrwxr-x 1 root root 10G Aug 13 10:07 allzero-demo
$ time cat /mnt/demo-remote-fs/allzero-demo > /dev/null
real  1m5.889s
user  0m0.086s
sys  0m3.281s


3. 创建 Fluid Dataset 和 JindoRuntime

使用如下 YAML,创建 dataset.yaml 文件。


下方 dataset.yaml 配置文件中包含两个待创建的 Fluid 资源对象,分别是 Dataset 和 JindoRuntime。


  • Dataset:所需挂载的主机目录信息。
  • JindoRuntime:待启动的 JindoFS 分布式缓存系统配置,包括缓存系统 Worker 组件副本数,以及每个 Worker 组件最大可用的缓存容量等。


apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: hostpath-demo-dataset
spec:
  mounts: 
    - mountPoint: local:///mnt/demo-remote-fs
      name: data
      path: /
  accessModes:
    - ReadOnlyMany
---
apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: hostpath-demo-dataset
spec:
  master:
    nodeSelector:
      demo-remote-fs: "true"
  worker:
    nodeSelector:
      demo-remote-fs: "true"
  fuse:
    nodeSelector:
      demo-remote-fs: "true"
  replicas: 2
  tieredstore:
    levels:
      - mediumtype: MEM
        path: /dev/shm
        quota: 10Gi
        high: "0.99"
        low: "0.99"


配置文件中资源对象的详细参数说明如下。



3.1 执行如下命令,创建 Dataset 和 JindoRuntime 资源对象。


$ kubectl create -f dataset.yaml


3.2 执行如下命令,查看 Dataset 的部署情况。


$ kubectl get dataset hostpath-demo-dataset


预期输出:


NAME                    UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
hostpath-demo-dataset   10.00GiB         0.00B    20.00GiB         0.0%                Bound   47s


3.3 Dataset 处于 Bound 状态,表明 JindoFS 缓存系统已在集群内正常启动,应用 Pod 可正常访问 Dataset 中定义的数据。


4. 创建 DataLoad 执行缓存预热

由于首次访问无法命中数据缓存,可能导致应用 Pod 的数据访问效率较低。Fluid 提供了 DataLoad 缓存预热操作提升首次数据访问的效率。


4.1 创建 dataload.yaml 文件,代码示例如下。


apiVersion: data.fluid.io/v1alpha1
kind: DataLoad
metadata:
  name: dataset-warmup
spec:
  dataset:
    name: hostpath-demo-dataset
    namespace: default
  loadMetadata: true
  target:
    - path: /
      replicas: 1


上述资源对象的详细参数说明如下所示。



4.2 执行如下命令,创建 DataLoad 对象。


$ kubectl create -f dataload.yaml


4.3 执行如下命令,查看 DataLoad 状态。


$ kubectl get dataload dataset-warmup


预期输出:


NAME             DATASET                 PHASE      AGE   DURATION
dataset-warmup   hostpath-demo-dataset   Complete   96s   1m2s


4.4 执行如下命令,查看数据缓存状态。


$ kubectl get dataset


预期输出:


NAME                    UFS TOTAL SIZE   CACHED     CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
hostpath-demo-dataset   10.00GiB         10.00GiB   20.00GiB         100.0%              Bound   157m


DataLoad 缓存预热操作完成后,数据集的已缓存数据量 CACHED 已更新为整个数据集的大小,代表整个数据集已被缓存,缓存百分比 CACHED PERCENTAGE 为 100.0%。


5. 查看数据预热后的访问性能

5.1 使用如下 YAML,创建 pod.yaml 文件,并修改 YAML 文件中的 claimName 名称与本例子中已创建的 Dataset 名称相同。


apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx
      command:
      - "bash"
      - "-c"
      - "sleep inf"
      volumeMounts:
        - mountPath: /data
          name: data-vol
  volumes:
    - name: data-vol
      persistentVolumeClaim:
        claimName: hostpath-demo-dataset # 名称需要与Dataset相同。


5.2 执行如下命令,创建应用 Pod。


kubectl create -f pod.yaml


5.3 执行如下命令,登录 Pod 访问数据。


$ kubectl exec -it nginx bash


预期输出,可以拷贝 10G 文件的时间需要 0m8.629s,是 sshfs 直接远程拷贝耗时(1m5.889s)的 1/8:


root@nginx:/# ls -lh /data
total 10G
-rwxrwxr-x 1 root root 10G Aug 13 10:07 allzero-demo
root@nginx:/# time cat /data/allzero-demo > /dev/null
real  0m8.629s
user  0m0.031s
sys  0m3.594s


5.4 清理应用 Pod


$ kubectl delete po nginx


相关链接:

[1] PV 主机目录通用加速能力

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/user-guide/accelerate-pv-storage-volume-data-access

[2] 创建 ACK Pro 版集群

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/create-an-ack-managed-cluster-2#task-skz-qwk-qfb

[3] 安装云原生 AI 套件

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/user-guide/deploy-the-cloud-native-ai-suite#task-2038811

[4] 通过 kubectl 工具连接集群

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/obtain-the-kubeconfig-file-of-a-cluster-and-use-kubectl-to-connect-to-the-cluster#task-ubf-lhg-vdb

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
Kubernetes 监控 Cloud Native
"解锁K8s新姿势!Cobra+Client-go强强联手,打造你的专属K8s监控神器,让资源优化与性能监控尽在掌握!"
【8月更文挑战第14天】在云原生领域,Kubernetes以出色的扩展性和定制化能力引领潮流。面对独特需求,自定义插件成为必要。本文通过Cobra与Client-go两大利器,打造一款监测特定标签Pods资源使用的K8s插件。Cobra简化CLI开发,Client-go则负责与K8s API交互。从初始化项目到实现查询逻辑,一步步引导你构建个性化工具,开启K8s集群智能化管理之旅。
15 2
|
5天前
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之ACK/ASK支持ECI的Serverless Container如何解决
Kubernetes 的架构问题之ACK/ASK支持ECI的Serverless Container如何解决
35 7
|
5天前
|
存储 Kubernetes 容器
Kubernetes(K8S) kubesphere 安装
Kubernetes(K8S) kubesphere 安装
25 4
|
5天前
|
存储 Kubernetes 监控
Kubernetes(K8s)基础与入门指南
【8月更文挑战第15天】Kubernetes作为云原生时代的基石,正在逐步改变软件的开发、部署和管理方式。通过掌握Kubernetes的基础知识和核心功能,开发者可以更加灵活地构建和管理容器化应用。未来,随着技术的不断发展和完善,Kubernetes将在更多领域发挥重要作用,推动云原生技术的普及和应用。
|
5天前
|
存储 Kubernetes API
Kubernetes(K8S) kubesphere 介绍
Kubernetes(K8S) kubesphere 介绍
18 2
|
5天前
|
运维 Kubernetes Go
"解锁K8s二开新姿势!client-go:你不可不知的Go语言神器,让Kubernetes集群管理如虎添翼,秒变运维大神!"
【8月更文挑战第14天】随着云原生技术的发展,Kubernetes (K8s) 成为容器编排的首选。client-go作为K8s的官方Go语言客户端库,通过封装RESTful API,使开发者能便捷地管理集群资源,如Pods和服务。本文介绍client-go基本概念、使用方法及自定义操作。涵盖ClientSet、DynamicClient等客户端实现,以及lister、informer等组件,通过示例展示如何列出集群中的所有Pods。client-go的强大功能助力高效开发和运维。
24 1
|
6天前
|
Prometheus Kubernetes 监控
Kubernetes(K8S) 监控 Prometheus + Grafana
Kubernetes(K8S) 监控 Prometheus + Grafana
22 2
|
6天前
|
Kubernetes 容器
Kubernetes(K8S) helm chart
Kubernetes(K8S) helm chart
7 1
|
1天前
|
存储 Kubernetes API
在K8S中,PVC创建和挂载失败原因有哪些?
在K8S中,PVC创建和挂载失败原因有哪些?
|
1天前
|
存储 Kubernetes 监控
在K8S中,集群可以做哪些优化?
在K8S中,集群可以做哪些优化?

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多