Fluid-数据缓存亲和性调度原理解析

2023-11-05

前言

在Fluid中,Dataset资源对象中所定义的远程文件是可被调度的,这意味着你能够像管理你的Pod一样管理远程文件缓存在Kubernetes集群上的存放位置。另外,Fluid同样支持对于应用的数据缓存亲和性调度,这种调度方式将应用(e.g. 数据分析任务、机器学习任务等)与所需要的数据缓存放置在一起,以尽可能地减少额外的开销。

本文对Fluid功能-数据缓存亲和性调度能力进行原理解析。其中涉及到Fluid架构和k8s csi driver相关知识。建议先了解相关概念。

为了便于理解,本文使用JuiceFS作为后端runtime引擎。

原理概述

实际上,fluid是利用node label和k8s原生提供的pod亲和性、反亲和性实现的。

在之前文章中,我们知道runtime 缓存worker pod所在的node上,都会被打上label:s-runtime.namespace-runtime.name,表示该node具有数据缓存能力。

对于业务pod使用webhook拦截,在pod的spec配置中,加上对具有该label的node的亲和性。最后借助k8s调度器将pod尽可能调度到具有缓存数据的Node上。

工作流程梳理

详细流程解析

一、创建业务pod,并使用dataset pvc

apiVersion: v1
kind: Pod
metadata:
  name: demo-app
spec:
  containers:
    - name: demo
      image: nginx
      volumeMounts:
        - mountPath: /data
          name: demo
  volumes:
    - name: demo
      persistentVolumeClaim:
        claimName: jfsdemo

二、fluid webhook拦截Pod

1)检测pod是否符合要求

排除fluid自身组件的pod:

func (a *CreateUpdatePodForSchedulingHandler) Handle(ctx context.Context, req admission.Request) admission.Response {
 ......
 if pod.Labels["app"] == "alluxio" || pod.Labels["app"] == "jindofs" || pod.Labels["app"] == "goosefs" || pod.Labels["app"] == "juicefs" {
  setupLog.Info("skip mutating the pod because it's fluid Pods", "Pod", pod.Name, "Namespace", pod.Namespace)
  return admission.Allowed("skip mutating the pod because it's fluid Pods")
  ......
 }

2)检测是否具有dataset的PVC

对于不具有的,需要添加Node 反亲和性,最好不要调度到有缓存的节点上。

func getPreferredSchedulingTermForPodWithoutCache() corev1.PreferredSchedulingTerm {
 return corev1.PreferredSchedulingTerm{
  Weight: 100,
  Preference: corev1.NodeSelectorTerm{
   MatchExpressions: []corev1.NodeSelectorRequirement{
    {
     Key:      common.GetDatasetNumLabelName(),
     Operator: corev1.NodeSelectorOpDoesNotExist,
    },
   },
  },
 }
}

3)添加Node亲和性:必须要在fuse pod所在的Node上

因为只有fuse pod,才能与底层的runtime进行通信,因此业务pod必须要与fuse pod在同一节点:

requiredSchedulingTerm = corev1.NodeSelectorTerm{
   MatchExpressions: []corev1.NodeSelectorRequirement{
    {
     Key:      runtimeInfo.GetCommonLabelName(),
     Operator: corev1.NodeSelectorOpIn,
     Values:   []string{"true"},
    },
   },

4)添加Node亲和性:最好要在worker所在Node

这里就是缓存亲和性调度了。最好与worker pod在同一节点。

  preferredSchedulingTerm = &corev1.PreferredSchedulingTerm{
   Weight: 100,
   Preference: corev1.NodeSelectorTerm{
    MatchExpressions: []corev1.NodeSelectorRequirement{
     {
      Key:      runtimeInfo.GetCommonLabelName(),
      Operator: corev1.NodeSelectorOpIn,
      Values:   []string{"true"},
     },
    },
   },
  }
 }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fluid-数据缓存亲和性调度原理解析 的相关文章

  • 在 Kubernetes Pod 部署名称上添加随机字符串

    我有一个模板 它基本上是一个实用程序容器 用于在 pod 内运行 kubectl 我想要做的是能够使用不同的名称对同一模板进行多个部署 如 utilitypod randomID 中所示 有没有办法通过 kubectl 和一些 shell
  • 自动备份远程托管服务器的最佳实践

    我正在尝试设置一个用于团队笔记的服务器 我想知道自动备份其数据 又称我的笔记 的最佳方法是什么 目前我计划在 docker 镜像中运行服务器 docker 镜像将由托管服务 例如 Google 托管 我找到了一个适合我的需求的免费托管服务
  • 来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

    我尝试在我的服务器上安装 docker 使用本教程 https docs docker com install linux docker ce ubuntu 我想远程运行 docker 镜像并使用 portainer Web 界面来管理一切
  • 找不到 Kubernetes 持久卷挂载

    我正在尝试创建并安装卷 但陷入困境 这部分创建存储 apiVersion v1 kind PersistentVolumeClaim metadata name pvclaim2 spec accessModes ReadWriteOnce
  • Ingress 未在 GKE 和 GCE 上获取地址

    创建入口时 不会生成地址 并且从 GKE 仪表板查看时 它始终位于Creating ingress地位 描述入口没有显示任何事件 我在 GKE 仪表板上看不到任何线索 有没有人有类似的问题或关于如何调试的任何建议 我的部署 yaml api
  • 在同一个 nginx 服务器块上公开多个 api uri

    Goal 我的目标是在同一个 nginx 服务器上设置多个后端 api 容器 http localhost 80 api account gt 调用 http account service 9000 http localhost 80 a
  • 在 Docker 中保护私有 PyPi 的凭据

    我正在构建 Docker 映像 需要运行 pip install 与带有凭据的私有 PyPi 保护凭证的最佳方法是什么 即使我删除它们 使用各种文件配置选项 pip conf requirements txt netrc 仍然是一个漏洞 因
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • Kubernetes Pod 预热以实现负载均衡

    我们有一个 Kubernetes 服务 其 Pod 需要一些时间来预热第一个请求 基本上 第一个传入请求将从 Redis 读取一些缓存值 并且这些请求可能需要更长的时间来处理 当这些新创建的 Pod 准备就绪并接收完整流量时 在从 Redi
  • 我应该将Python的pyc文件添加到.dockerignore吗?

    我见过几个例子 dockerignorePython 项目的文件 其中 pyc文件和 或 pycache 文件夹被忽略 pycache pyc 由于无论如何这些文件 文件夹都会在容器中重新创建 我想知道这样做是否是一个好习惯 是的 这是一个
  • 无法从外部访问在端口 4567 上的 Docker 容器中运行的应用程序

    使用重新创建设置所需的所有文件更新帖子 还是同样的问题 无法访问容器中运行的服务 FROM python 3 RUN apt get update RUN apt get install y ruby rubygems RUN gem in
  • 诊断“功能主机未运行。”在码头工人

    我正在尝试将几个基于 dotnet 的功能应用程序 v3 迁移到 docker 容器 为此 我们使用来自mcr microsoft com azure functions dotnet https hub docker com micros
  • 如何在 kubernetes 上设置 hostPath 卷权限?

    似乎默认情况下 Kubernetes 创建一个 hostPath 卷755对目录的权限 是否可以通过 a 将这个值设置为其他值volume规格 与手动执行操作相反chmod在相关主机目录上 initContainers name volum
  • 无法从 rollupOptions 自动确定入口点

    我正在尝试对使用 vite 和 vue3 创建的前端应用程序进行 dockerize 它不作为容器工作 这是错误响应 无法从 rollupOptions 或 html 文件自动确定入口点 并且没有显式的 OptimizeDeps inclu
  • 使用外部存储,删除文件夹时出错

    我正在使用 docker nextcloud 我创建了一个干净的实例 我想使用应用程序外部存储 我设法使用以下命令成功配置本地存储 mount id docker exec user 1000 nextcloud php occ files
  • 无法在docker容器中安装npm?

    我正在数字海洋服务器的 Docker 平台上部署一个简单的 Node js 应用程序 包 json name docker centos hello private true version 0 0 1 description Node j
  • 没有特权访问的 Docker VPN IPSec 客户端

    我有一个 mysql 数据库 只有在建立 VPN 连接后才能访问 IpSec shared secret 用户名 密码 所以我想运行一个隔离的docker容器 它将建立此连接并以某种方式代理 公开mysql端口 以便其他容器可以连接到它而不
  • 在 apache docker 容器中运行虚拟主机

    我在同一个 apache 容器中有两个 php 应用程序 我试图在端口上运行其中一个应用程序 因为它需要通过根域而不是子文件夹进行访问 我想在端口 8060 上运行应用程序 我尝试使用 apache 虚拟主机执行此操作 但它不会加载页面 h
  • 等待 pod 附加或挂载卷的超时已过期

    我在裸机上的 ubuntu 上安装 kubernetes 我部署了1个master和3个worker 然后部署 rook 一切工作正常 但是当我想在其上部署 wordpress 时 我收到此错误 无法为 Pod 挂载卷 wordpress
  • 入口控制器可以使用基于选择器的规则吗?

    我已在 AKS 中部署了有状态集 我的目标是对有状态集的流量进行负载平衡 根据我的理解 我可以定义一个 LoadBalancer 服务 它可以基于选择器路由流量 类似这样 apiVersion v1 kind Service metadat

随机推荐

  • IndexError: too many indices for tensor of dimension 0

    源代码 import torch import torchvision import torch nn as nn from model import LeNet import torch optim as optim import tor
  • Vmware 如何开启CPU虚拟化

    首先要说明VMware workstation7桌面平台的配置情况 CPU 宿主机CPU 内存 设置数值为虚拟机最大可用内存 动态分配内存大小 主板芯片组 Intel 440BX 显卡 VMware SVGA IDE控制器 Intel 82
  • golang判断字符串是不是数字

    参考 Golang如何去判断字符串是数字还是字符 CSDN论坛 func IsNum s string bool err strconv ParseFloat s 64 return err nil
  • DataGrip创建MySQL数据库与使用

    打开DataGrip创建一个MySQL数据库 打开数据库的配置 会提示安装驱动 数据库的版本需要与驱动版本一致 自己在官网下载MySQL驱动 若不一致 需要下载驱动 http central maven org maven2 mysql m
  • 等保2.0:MySQL数据库测评

    身份鉴别 身份鉴别A 应对登录的用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 测评方法 1 执行mysql u root p命令 查看是否提示输入口令鉴别用户身份 mysql u root p 2 查询u
  • 利用session技术实现 用户登陆 功能

    首先 利用jsp技术写出登陆页面 h1 用户登录 h1
  • MySQL-day15-增删改查实例实操

    文章目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 权限管理 六 过滤查询 having 1 举例 2 小练习 七 查询排序 order by 1 示例 2 小练习 八 限制查询 limit
  • 【unity设置】导入hdr图并设置为天空盒

    在IBL笔记前 我们都知道IBL是通过环境来作为间接全局光赋予irradiance 那么首先我们需要导入一张hdr图并将其设置为环境贴图 天空盒 这种图片多的小tips放在正文中过于臃肿 这边还是单独拿出来一篇小笔记 1 下载HDR贴图 首
  • 解答:x86架构下,页面大小为什么是4K?

    前提 32位逻辑地址空间的计算机系统 三级页表 每个页中每个条目占4Byte 即32位的数据 以上前提是目前x86架构32位系统的真实情况 设 页大小为X byte 则 X 4就是每个页中可以存取的条目个数 两级页表的地址转化关系如图1所示
  • Java入门需要了解(集合工具类-三十三)

    集合工具类目录 集合工具类的作用 Collections Collections排序 被排序的类实现Comparable接口方式排序 使用比较器Comparator方式排序 逆序排序 Collections二分查找 Collections获
  • charles抓包

    charles抓包 charles抓https包 参考这个来配置 https blog csdn net qq 20113327 article details 122299433 下载 安装 然后就是配置 抓包原理就是手机用电脑的网络走代
  • 计算机网络分类及其(从多角度分类)主要特点

    一 按照网络的覆盖范围进行分类 从网络的覆盖范围进行分类 计算机网络可以分为局域网 广域网和城域网 1 局域网 局域网是在局部区域范围内将计算机 外设和通信设备通过高速通信线路互连起来的网络系统 常见于一栋大楼 一个校园或一个企业内 局域网
  • 冯·诺依曼、哈佛、改进型哈佛体系结构解析

    在如今的CPU中 由于Catch的存在 这些概念已经被模糊了 个人认为去区分他们并没有什么意义 仅作为知识点 哈佛结构设计复杂 但效率高 冯诺依曼结构则比较简单 但也比较慢 CPU厂商为了提高处理速度 在CPU内增加了高速缓存 也基于同样的
  • 密码学之密匙交换

    最近在学习网易公开课上可汗学院现代密码学的课程 整理了一下自己的笔记2 迪菲 赫尔曼密匙交换 迪菲 赫尔曼密匙交换利用了单向函数正向求解很简单 反向求解很复杂的特性 n x mod m s 已知n x m求s简单 已知n m s求x很难 此
  • html5中的localStorage 临时存储

    localStorage 临时存储 localStorage 用于长久保存整个网站的数据 只支持 string 类型的存储 容量一般在2 5Mb左右 保存的数据没有过期时间 直到手动去删除 而sessionStorage在网页回话结束时失效
  • 一个“程序员的自我修养”是什么?

    在 喜剧之王 中 周星驰扮演的尹天仇 一直梦想成为一名演员 而他不管是在扮演跑龙套 或者在街坊中开设演员训练班 亦或成为主角时 他对待演员的态度 始终是认真 热爱而又投入的 而那一本他随身携带的书 演员的自我修养 尽管不知道里面具体写的是什
  • Transformer warning: [encoder.embed_tokens.weight] is newly initialized

    在使用transformer 加载预训练的T5 encoder参数的时候 经常会出现 Some weights of T5EncoderModel were not initialized from the model checkpoint
  • Vue下载文件不成功及下载文件名称问题

    看代码 import axiosDown from axios downloadFile path return axiosDown url path method get responseType blob 这一步也很关键 一定要加上 r
  • Qt对动态库(*.dll)的封装以及使用

    创建工程 首先先择左侧项目的Library 再选择右侧的C Library库然后点击下一步 接下来需要设置工程名以及路径 点击下一步 下一步即可 这里需要设置Type为共享库Shared Library 并设置类名 然后一路默认即可 工程结
  • Fluid-数据缓存亲和性调度原理解析

    前言 在Fluid中 Dataset资源对象中所定义的远程文件是可被调度的 这意味着你能够像管理你的Pod一样管理远程文件缓存在Kubernetes集群上的存放位置 另外 Fluid同样支持对于应用的数据缓存亲和性调度 这种调度方式将应用