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

news/2024/4/25 14:16:37/文章来源:https://blog.csdn.net/hahachenchen789/article/details/128957585

前言

在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: demoimage: nginxvolumeMounts:- mountPath: /dataname: demovolumes:- name: demopersistentVolumeClaim: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"},},},},}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_255723.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二进制部署K8S集群

目录 一、架构图 二、部署步骤 1、实验环境 2、操作系统初始化配置 3、部署 docker引擎 4、部署 etcd 集群 5、部署 Master 组件 一、架构图 二、部署步骤 1、实验环境 服务器类型IP地址master192.168.80.5node01192.168.80.8node02192.168.80.9 2、操作系统初始化配置…

SpringBoot整合Mybatis的核心原理

0. 前言:1. 自动配置类MybatisAutoConfiguration:1.1. SqlSessionFactory的生成:1.2. Mapper的扫描和代理生成:1.2.1. MapperScannerConfigurer1.2.2. MapperFactoryBean1.2.3. getMapper生成代理对象2. 小结:0. 前言&…

3D模型深度生成网络【ShapeAssembly】

推荐:使用 NSDT场景设计器 快速搭建 3D场景。 我们提出了一个深度生成模型,该模型学习在ShapeAssembly中编写新颖的程序,ShapeAssembly是一种用于建模3D形状结构的特定领域语言。 执行 ShapeAssembly 程序会生成一个由部件代理长方体的分层连…

2023,考个软考中级证书稳妥深圳入户,5月考试8月办入户

最新消息!最新消息!最新消息! 2023年2月8日,深圳市发展和改革委员会深圳市公安局深圳市人力资源和社会保障局关于印发《深圳市积分入户办法》的最新通知↓ 来源《深圳市发展和改革委员会》 该积分入户将于2023年2月15日正式实施&…

Prometheus监控Java-JMX

一、什么是 JMX Exporter ? JMX Exporter 利用 Java 的 JMX 机制来读取 JVM 运行时的一些监控数据,然后将其转换为 Prometheus 所认知的 metrics 格式,以便让 Prometheus 对其进行监控采集。 那么,JMX 又是什么呢?它的全称是&a…

ChatGPT 支持的搜索引擎 Bing 究竟什么样?

微软于2月8日北京时间凌晨在 Redmond 线下举办一场媒体活动,围绕微软的产品以及 AI,公布最新消息。这里我们先回顾一下微软在 AI 上的布局。 2019年,微软向 OpenAI 投资10亿美元,成为了 OpenAI 紧密的合作伙伴,而微软…

Java中动态调用setter以及getter

0x00 前言 对于非专业程序员的安全人员来说,因为没有代码项目的积累,很多知识体系都不完善,所以有必要在一些常用的内容进行学习的总结。 在很多的调用链中都会用到**“动态调用setter以及getter”**这个知识点,比如经典的CB链&a…

Python语言零基础入门教程(九)

Python pass 语句 Python pass 是空语句,是为了保持程序结构的完整性。 pass 不做任何事情,一般用做占位语句。 Python 语言 pass 语句语法格式如下: pass测试实例: #!/usr/bin/python # -*- coding: UTF-8 -*- # 输出 Pytho…

线程池小结

什么是线程池 线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象; 为什么使用线程池 …

leetcode刷题之背包问题(01背包)

01 背包 概念:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]weight[i]weight[i],得到的价值是value[i]value[i]value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 方法1:暴力回溯…

FPGA时序约束与分析 --- 实例教程(1)

注意: 时序约束辅助工具或者相关的TCL命令,都必须在 open synthesis design / open implemention design 后才能有效运行。 1、时序约束辅助工具 2、查看相关时序信息 3、一般的时序约束顺序 1、 时序约束辅助工具(1)时序约束编辑…

微服务负载均衡器Ribbon

目录 什么是Ribbon 客户端的负载均衡 服务端的负载均衡 常见负载均衡算法 Nacos使用Ribbon 添加LoadBalanced注解 修改controller Ribbon负载均衡策略 IRule AbstractLoadBalancerRule 修改默认负载均衡策略 自定义负载均衡策略 配置自定义的策略 饥饿加载 Ribbo…

【golang】1797. 设计一个验证系统

你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在 currentTime 时刻之后 timeToLive 秒过期。如果验证码被更新了,那么它会在 currentTime (可能与之前的 currentTime 不同)时…

C语言经典编程题100例(1-20)

1、练习2-1 Programming in C is fun!本题要求编写程序&#xff0c;输出一个短句“Programming in C is fun!”。输入格式:本题目没有输入。输出格式:在一行中输出短句“Programming in C is fun!”。代码&#xff1a;#include<stdio.h> int main() {printf("Progra…

Java中类是什么

类(class)是构造对象的模板或蓝图。 我们可以将类想象成制作小甜饼的模具&#xff0c;将对象想象为小甜饼。由类构造(construct)对象的过程称为创建类的实例(instance)。 正如前面所看到的&#xff0c;用Java 编写的所有代码都位于某个类里面。 标准 Java 库提供了几千个类&a…

bcript 算法

一、简介 今天要给大家介绍的一种“加密”算法叫做 bcrypt&#xff0c;bcrypt 是由 Niels Provos 和 David Mazires 设计的密码哈希函数&#xff0c;他是基于 Blowfish 密码而来的&#xff0c;并于 1999 年在 USENIX 上提出。 除了加盐来抵御 rainbow table 攻击之外&#xf…

尚硅谷电商数仓5.0(华为云服务器)主机初期基本配置

文章目录服务器配置信息&#xff1a;注意事项&#xff1a;1.购买注意事项&#xff1a;2.后期使用注意事项&#xff1a;三台主机的基本配置服务器配置信息&#xff1a; 使用了两个账号&#xff0c;账号1买了两个服务器&#xff0c;一台4核8G&#xff0c;一台2核4G&#xff0c;账…

hgame2023 WebMisc

文章目录Webweek1Classic Childhood GameBecome A MemberGuess Who I AmShow Me Your BeautyWeek2Git Leakagev2boardSearch CommodityDesignerweek3Login To Get My GiftPing To The HostGopher Shopweek4Shared DiaryTell MeMiscweek1Where am I神秘的海报week2Tetris Master…

Qml学习——基本控件

最近在学习Qml&#xff0c;但对Qml的各种用法都不太熟悉&#xff0c;总是会搞忘&#xff0c;所以写几篇文章对学习过程中的遇到的东西做一个记录。 学习参考视频&#xff1a;https://www.bilibili.com/video/BV1Ay4y1W7xd?p1&vd_source0b527ff208c63f0b1150450fd7023fd8 目…

蓝桥杯刷题023——机器人塔(DFS)

2016国赛 题目描述 X 星球的机器人表演拉拉队有两种服装&#xff0c;A 和 B。 他们这次表演的是搭机器人塔。 类似&#xff1a; A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是&#xff1a; A 只能站在 AA 或 BB 的肩上。 B 只能站在 AB 或 BA 的肩上。 你的任务…