技术

下一个平台Agent 激发LLM涌现——提示工程 LLM微调理论及实践 大佬沉思 LLM外挂知识库 LLMOps 多模态LLM Python一些比较有意思的库 LLM部分技术源码学习 LangChain源码学习 通用分布式计算引擎Ray Python并发 go依赖注入 go collection gc的基本原理 golang性能分析及优化 数据湖 高性能计算与存储 Linux2.1.13网络源代码学习 《大数据经典论文解读》 三驾马车学习 Spark 内存管理及调优 Yarn学习 从Spark部署模式开始讲源码分析 容器狂占内存资源怎么办? 多角度理解一致性 golang io使用及优化模式 Flink学习 c++学习 学习ebpf go设计哲学 ceph学习 学习mesh kvm虚拟化 学习MQ go编译器以及defer实现 学习go 为什么要有堆栈 汇编语言 计算机组成原理 运行时和库 Prometheus client mysql 事务 mysql 事务的隔离级别 mysql 索引 坏味道 学习分布式 学习网络 学习Linux go堆内存分配 golang 系统调用与阻塞处理 Goroutine 调度过程 重新认识cpu mosn有的没的 负载均衡泛谈 单元测试的新解读 《Redis核心技术与实现》笔记 《Prometheus监控实战》笔记 Prometheus 告警学习 calico源码分析 对容器云平台的理解 Prometheus 源码分析 并发的成本 基础设施优化 hashicorp raft源码学习 docker 架构 mosn细节 与微服务框架整合 Java动态代理 编程范式 并发通信模型 《网络是怎样连接的》笔记 go channel codereview gc分析 jvm 线程实现 go打包机制 go interface及反射 如何学习Kubernetes 《编译原理之美》笔记——后端部分 《编译原理之美》笔记——前端部分 Pilot MCP协议分析 go gc 内存管理玩法汇总 软件机制 istio流量管理 Pilot源码分析 golang io 学习Spring mosn源码浅析 MOSN简介 《datacenter as a computer》笔记 学习JVM Tomcat源码分析 Linux可观测性 学习存储 学计算 Gotty源码分析 kubernetes operator kaggle泰坦尼克问题实践 kubernetes扩缩容 神经网络模型优化 直觉上理解深度学习 如何学习机器学习 TIDB源码分析 什么是云原生 Alibaba Java诊断工具Arthas TIDB存储——TIKV 《Apache Kafka源码分析》——简介 netty中的线程池 guava cache 源码分析 Springboot 启动过程分析 Spring 创建Bean的年代变迁 Linux内存管理 自定义CNI IPAM 共识算法 spring redis 源码分析 kafka实践 spring kafka 源码分析 Linux进程调度 让kafka支持优先级队列 Codis源码分析 Redis源码分析 C语言学习 《趣谈Linux操作系统》笔记 docker和k8s安全访问机制 jvm crash分析 Prometheus 学习 Kubernetes监控 容器日志采集 Kubernetes 控制器模型 容器狂占资源怎么办? Kubernetes资源调度——scheduler 时序性数据库介绍及对比 influxdb入门 maven的基本概念 《Apache Kafka源码分析》——server Kubernetes类型系统 源码分析体会 《数据结构与算法之美》——算法新解 Kubernetes源码分析——controller mananger Kubernetes源码分析——apiserver Kubernetes源码分析——kubelet Kubernetes介绍 ansible学习 Kubernetes源码分析——从kubectl开始 jib源码分析之Step实现 jib源码分析之细节 线程排队 跨主机容器通信 jib源码分析及应用 为容器选择一个合适的entrypoint kubernetes yaml配置 《持续交付36讲》笔记 mybatis学习 程序猿应该知道的 无锁数据结构和算法 CNI——容器网络是如何打通的 为什么很多业务程序猿觉得数据结构和算法没用? 串一串一致性协议 当我在说PaaS时,我在说什么 《数据结构与算法之美》——数据结构笔记 PouchContainer技术分享体会 harbor学习 用groovy 来动态化你的代码 精简代码的利器——lombok 学习 《深入剖析kubernetes》笔记 编程语言那些事儿 rxjava3——背压 rxjava2——线程切换 spring cloud 初识 《深入拆解java 虚拟机》笔记 《how tomcat works》笔记 hystrix 学习 rxjava1——概念 Redis 学习 TIDB 学习 如何分发计算 Storm 学习 AQS1——论文学习 Unsafe Spark Stream 学习 linux vfs轮廓 《自己动手写docker》笔记 java8 实践 中本聪比特币白皮书 细读 区块链泛谈 比特币 大杂烩 总纲——如何学习分布式系统 hbase 泛谈 forkjoin 泛谈 看不见摸不着的cdn是啥 《jdk8 in action》笔记 程序猿视角看网络 bgp初识 calico学习 AQS——粗略的代码分析 我们能用反射做什么 web 跨域问题 《clean code》笔记 《Elasticsearch权威指南》笔记 mockito简介及源码分析 2017软件开发小结—— 从做功能到做系统 《Apache Kafka源码分析》——clients dns隐藏的一个坑 《mysql技术内幕》笔记 log4j学习 为什么netty比较难懂? 递归、回溯、动态规划 apollo client源码分析及看待面向对象设计 学习并发 docker运行java项目的常见问题 OpenTSDB 入门 spring事务小结 分布式事务 javascript应用在哪里 《netty in action》读书笔记 netty对http2协议的解析 ssl证书是什么东西 http那些事 苹果APNs推送框架pushy apple 推送那些事儿 编写java框架的几大利器 java内存模型和jvm内存布局 java exception Linux IO学习 netty内存管理 测试环境docker化实践 netty在框架中的使用套路 Nginx简单使用 《Linux内核设计的艺术》小结 Go并发机制及语言层工具 Linux网络源代码学习——数据包的发送与接收 《docker源码分析》小结 docker namespace和cgroup zookeeper三重奏 数据库的一些知识 Spark 泛谈 链式处理的那些套路 netty回顾 Thrift基本原理与实践(二) Thrift基本原理与实践(一) 回调 异步执行抽象——Executor与Future Docker0.1.0源码分析 java gc Jedis源码分析 深度学习泛谈 Linux网络命令操作 JTA与TCC 换个角度看待设计模式 Scala初识 向Hadoop学习NIO的使用 以新的角度看数据结构 并发控制相关的硬件与内核支持 systemd 简介 quartz 源码分析 基于docker搭建测试环境(二) spring aop 实现原理简述 自己动手写spring(八) 支持AOP 自己动手写spring(七) 类结构设计调整 分析log日志 自己动手写spring(六) 支持FactoryBean 自己动手写spring(九) 总结 自己动手写spring(五) bean的生命周期管理 自己动手写spring(四) 整合xml与注解方式 自己动手写spring(三) 支持注解方式 自己动手写spring(二) 创建一个bean工厂 自己动手写spring(一) 使用digester varnish 简单使用 关于docker image的那点事儿 基于docker搭建测试环境 分布式配置系统 JVM执行 git maven/ant/gradle/make使用 再看tcp kv系统 java nio的多线程扩展 《Concurrency Models》笔记 回头看Spring IOC IntelliJ IDEA使用 Java泛型 vagrant 使用 Go常用的一些库 Python初学 Goroutine 调度模型 虚拟网络 《程序员的自我修养》小结 Kubernetes存储 访问Kubernetes上的Service Kubernetes副本管理 Kubernetes pod 组件 Go基础 JVM类加载 硬币和扑克牌问题 LRU实现 virtualbox 使用 ThreadLocal小结 docker快速入门

架构

大模型推理服务框架 模型服务化(未完成) 大模型RHLF 大模型训练 大模型推理 从Attention到Transformer k8s设备管理 LLM工具栈 ddd从理念到代码 如何应用LLM 小鼠如何驾驭大象(LLM)? 多类型负载协调员Koordinator controller-runtime细节分析 finops学习 kubevela多集群 kubevela中cue的应用 基于k8s的工作流 容器和CPU那些事儿 kubevela源码分析 数据集管理fluid 应用管理平台kubevela karmada支持crd 多集群管理 AutoML和AutoDL 特征平台 实时训练 分布式链路追踪 helm tensorflow原理——python层分析 如何学习tensorflow 数据并行——allreduce 数据并行——ps 机器学习中的python调用c 机器学习训练框架概述 embedding的原理及实践 tensornet源码分析 大模型训练和推理 X的生成——特征工程 tvm tensorflow原理——core层分析 模型演变 《深度学习推荐系统实战》笔记 keras 和 Estimator tensorflow分布式训练 分布式训练的一些问题 基于Volcano的弹性训练 图神经网络 pytorch弹性分布式训练 从混部到统一调度 从RNN到Attention pytorch分布式训练 CNN 《动手学深度学习》笔记 pytorch与线性回归 多活 volcano特性源码分析 推理服务 kubebuilder 学习 mpi 学习pytorch client-go学习 tensorflow学习 提高gpu 利用率 GPU与容器的结合 GPU入门 AI云平台梳理 tf-operator源码分析 k8s批处理调度/Job调度 喜马拉雅容器化实践 Kubernetes 实践 学习rpc BFF openkruise学习 可观察性和监控系统 基于Kubernetes选主及应用 《许式伟的架构课》笔记 Admission Controller 与 Admission Webhook 发布平台系统设计 k8s水平扩缩容 Scheduler如何给Node打分 Scheduler扩展 深入controller openkruise cloneset学习 controller-runtime源码分析 pv与pvc实现 csi学习 client-go informer源码分析 kubelet 组件分析 调度实践 Pod是如何被创建出来的? 《软件设计之美》笔记 mecha 架构学习 Kubernetes events学习及应用 CRI 资源调度泛谈 业务系统设计原则 grpc学习 元编程 以应用为中心 istio学习 下一代微服务Service Mesh 《实现领域驱动设计》笔记 概率论 serverless 泛谈 《架构整洁之道》笔记 处理复杂性 那些年追过的并发 服务器端编程 网络通信协议 架构大杂烩 如何学习架构 《反应式设计模式》笔记 项目的演化特点 反应式架构摸索 函数式编程的设计模式 服务化 ddd反模式——CRUD的败笔 研发效能平台 重新看面向对象设计 业务系统设计的一些体会 函数式编程 《左耳听风》笔记 业务程序猿眼中的微服务管理 DDD实践——CQRS 项目隔离——案例研究 《编程的本质》笔记 系统故障排查汇总及教训 平台支持类系统的几个点 代码腾挪的艺术 abtest 系统设计汇总 《从0开始学架构》笔记 初级权限系统设计 领域驱动理念 现有上传协议分析 移动网络下的文件上传要注意的几个问题 推送系统的几个基本问题 做配置中心要想好的几个基本问题 不同层面的异步 分层那些事儿 性能问题分析 用户认证问题 资源的分配与回收——池 消息/任务队列

标签

k8s设备管理 多类型负载协调员Koordinator controller-runtime细节分析 finops学习 kubevela多集群 kubevela中cue的应用 基于k8s的工作流 容器和CPU那些事儿 kubevela源码分析 数据集管理fluid 应用管理平台kubevela karmada支持crd 多集群管理 helm 从混部到统一调度 volcano特性源码分析 kubebuilder 学习 client-go学习 tf-operator源码分析 k8s批处理调度/Job调度 喜马拉雅容器化实践 Kubernetes 实践 openkruise学习 基于Kubernetes选主及应用 Admission Controller 与 Admission Webhook k8s水平扩缩容 Scheduler如何给Node打分 Scheduler扩展 深入controller openkruise cloneset学习 controller-runtime源码分析 pv与pvc实现 csi学习 client-go informer源码分析 kubelet 组件分析 调度实践 Pod是如何被创建出来的? Kubernetes events学习及应用 CRI 资源调度泛谈 如何学习Kubernetes 以应用为中心 kubernetes operator kubernetes扩缩容 serverless 泛谈 什么是云原生 自定义CNI IPAM docker和k8s安全访问机制 Kubernetes监控 Kubernetes 控制器模型 Kubernetes资源调度——scheduler Kubernetes类型系统 Kubernetes源码分析——controller mananger Kubernetes源码分析——apiserver Kubernetes源码分析——kubelet Kubernetes介绍 Kubernetes源码分析——从kubectl开始 kubernetes yaml配置 CNI——容器网络是如何打通的 当我在说PaaS时,我在说什么 《深入剖析kubernetes》笔记 Kubernetes存储 访问Kubernetes上的Service Kubernetes副本管理 Kubernetes pod 组件

当我在说PaaS时,我在说什么

2018年09月26日

简介

2023

一个paas 包括以下几个部分

  1. 工作流。工作流是一个偏上层的概念,先发哪再发哪,几个实例,再发几个实例,流量先切多少,再切多少。下一层负责当前阶段意图的具体实现,比如实例配置、发到哪个集群。workflow vs 手工管理
  2. 多集群。
  3. Workload 在联邦层要有一个抽象/载体。
  4. 集群调度。
  5. 应用管理
  6. 应用配置。包括label、运行时,挂载资源等。
  7. 应用的载体 1. 描述应用本身,deployment 不够,openkruise 的cloneset。 2. 应用的运维,比如hpa 等组件。一个应用会对应一个workload 集合。
  8. 应用渲染 1. Kubevela 表达应用的方式是:所有属性都是kv,内部建立deployment/cloneset 模版引用kv,最后渲染成workload crd。 2. 常见方式是,给用户提供表达ui,定义view struct,view struct 转为 crd struct。
  9. 给用户提供一个paas界面,假设支持100个操作(工作流的价值之一就是可以规范这些动作),有两种实现方式 1. 每种操作对应一个或多个k8s 原生对象的增删改 2. 几乎所有操作只对应 一个object 的增删改,主要是改。

一次应用部署要解决哪些问题

  1. 一次应用部署由哪些部分构成
  2. 如何构建workload?镜像、configmap、端口,资源。workload 静态配置
  3. 如何分发worklaod?部署到哪里,甚至多个集群分别部署几个实例
  4. 如何访问worklaod?流量管理
  5. 上述配置有一部分想抽成模版,以便复用。哪些要经常应用间复用、哪些是应用独有的?哪些经常变,哪些不经常变?
  6. 应用部署完成后,有一些部署后才知道的状态,比如ip、实例名等
  7. 一次应用部署 由上述多个 领域的概念揉和组成,构建workload = workload 静态配置 + 目标集群+ 流量管理 + 模版配置。
  8. 是统一弄一个静态模版以此构建worklaod,还是每次构建workload时东拼西凑?
  9. 上述领域配置可能会更新,但应用部署一旦执行 需要固化应用部署时的状态 以便追溯,因此要上述配置要维护多版本。

实现架构

  1. 基于db 实现 workfow 和step,k8s 只是一种数据源:一次发布会对应一系列的任务,如:初始化环境,构建镜像,分批发布等等。这些任务会被有序地扔给 JAVA Executor 来进行实际的业务逻辑,比如,往 Kubernetes 中下发资源,以及与 MySQL 数据库进行当前任务的状态同步,等等。在当前的任务完成后,JAVA Executor 会从 任务库/编排引擎中获取下一个任务。这个架构中最大的问题就在于轮询调用, JAVA Executor 会每隔一秒从 任务列表中进行获取,查看是否有新任务;同时,JAVA Executor 下发了 Kubernetes 资源后,也会每隔一秒尝试从集群中获取资源的状态。
    1. 并不是 Kubernetes 生态中的控制器模式,如果将编排引擎层升级为事件监听的控制器模式,就能更好地对接整个 Kubernetes 生态,同时提升效率。
    2. 如果使用的是传统的以容器为基础下发的云原生工作流的话(很多活儿用容器干,比如打镜像),就需要将原本的业务逻辑打包成镜像,维护并更新一大堆镜像制品
  2. 基于k8s 实现 workfow 和step,crd 部分具有监听能力 : 创建了发布单之后,业务侧会将模型写入数据库,进行模型转换,生成一条 KubeVele Workflow,KubeVela Workflow 在执行时,每个步骤都是 IaC 化的,底层实现是 CUE 语言。这些步骤有的会去调用 业务微服务 API,有的则会直接与底层 Kubernetes 资源进行交付。而步骤间也可以进行数据传递。如果调用出错了,可以通过步骤的条件判断,来进行错误处理。
  3. 基于db 和事件驱动实现。对第二点的泛化。

Pets vs Cattle 以及数据中心时代

本小节内容来自 《Container-Networking-Docker-Kubernetes》笔记

DevOps Concepts: Pets vs Cattle

想让服务可靠,有两种方式:把机器搞可靠;部署多个实例。

  特点 详情 Examples
Pets scale up you trait the machines as individuals,you gave each (virtual)machine a name. when a machine gets ill you nurse it back to health and manually redeploy the app. mainframes, solitary servers, load balancers and firewalls, database systems, and so on.
Cattle scale out your machines are anonymous;they are all identical,they have numbers rather than names, and apps are automatically deployed onto any and each of the machines. when one of the machines gets ill, you don’t worry about it immediately web server arrays, no-sql clusters, queuing cluster, search cluster, caching reverse proxy cluster, multi-master datastores like Cassandra, big-data cluster solutions, and so on.

PS:the Cloud Age, virtualized servers that are programmable through a web interface。

with the cattle approach to managing infrastructure,you don’t manually allocate certain machines for running an application.Instead,you leave it up to an orchestrator to manage the life cycle of your containers. 一个服务部署多个(几十个/上百个)实例带来许多挑战:如何部署?如何发现?挂了怎么办(总不能还靠人工)?通常依靠一个资源管理和调度平台辅助管理,如何选用和部署这个调度平台?从 “Evolution of Cattle” 的视角来看待 运维技术的演进。

  描述 technologies 部署cattle service需要什么 备注
Iron Age 物理机   Robust change configuration tools like Puppet (2005), CFEngine 3 (2008), and Chef  
The First Cloud Age IaaS that virtualized the entire infrastructure (networks, storage, memory, cpu) into programmable resources. Amazon Web Services (2006), Microsoft Azure (2010), Google Cloud Platform push-based orchestration tools like Salt Stack (2011), Ansible (2012), and Terraform (2014).  
The Second Cloud Age virtualize aspects of the infrastructure,This allows applications to be segregated into their own isolated environment without the need to virtualize hardware, which in turn duplicates the operating system per application. OpenVZ (2005), Linux Containers or LXC (2008), and Docker (2015). A new set of technologies evolved to allocate resources for containers and schedule these containers across a cluster of servers:Apache Mesos (2009), Kubernetes (2014), Nomad (2015), Swarm Immutable Production(应用的每一次更改都是重新部署,所以本身是Immutable),disposable containers are configured at deployment. 容器在部署的时候被配置

PaaS

阮志敏谈平台即服务PaaS

《左耳听风》笔记

《深入剖析kubernetes》笔记

基本可以总结出如下几点:

  1. PaaS 由IPaaS 和 APaaS 组成

    • IPaaS提供服务编排、调度、监控、发现、弹性伸缩等,使得服务本身可以可靠 和 高性能运行。
    • APaaS提供消息队列、分布式计算、存储、缓存等中间件,一个是为服务提供存储等基本资源;一个是为服务之间 提供交互手段,毕竟不像单机进程或线程通信那么方便了。
    • APaaS 需要 IPaaS 提供支持,因为消息队列、分布式计算等本身也是一种服务
  2. 多租户弹性是PaaS区别于传统应用平台的本质特性

    • 多租户,一个软件系统可以同时被多个实体所使用,每个实体之间是逻辑隔离、互不影响的。
    • 弹性(Elasticity)是指一个软件系统可以根据自身需求动态的增加、释放其所使用的计算资源。

多租户有如下几种实现方式:

  1. Shared-Nothing
  2. Shared-Hardware,共享物理机,即以拟机是弹性资源调度和隔离的最小单位
  3. Shared-OS,共享操作系统,进程是弹性资源调度和隔离的最小单位
  4. Shared-Everything,基于元数据模型以共享一切资源

不准确的说,可以认为PaaS 是一个基于集群的操作系统,在这个操作系统中:

  1. “程序”文件如何表示。因为在分布式环境下,还涉及到”程序”文件分发的问题。
  2. “进程”如何体现
  3. “磁盘”如何体现,“进程”如何访问“磁盘”
  4. “进程”之间如何通信

结合上文、docker + k8s,会对这几个问题有一些体会。

自己的理解

与IaaS对比起来,可以看作是服务化层次 不同的问题。

办一个酒席有哪些事情

  1. 原材料,菜、烟、酒
  2. 桌椅板凳等
  3. 知客
  4. 传菜员、厨师、刷碗等

农村酒席的演变

  1. 自己去菜市场买菜、去批发市场买酒、去请厨子、联系帮忙的、去租座椅板凳,资源都在,被动的等你去取用。
  2. 出现承包队,自带桌椅板凳、厨师、传菜员等,但仍需要你根据购物清单来购买原料
  3. 在酒店办酒席,你只需告知菜单即可,八大菜系、酒席档次、大厅装修(有没有投影等)均可以指定。

IAAS,一个物理机或者一堆物理机/虚拟机,能给你提供什么?运行服务所需的基本资源。IaaS只关注解决基础资源云化问题,解决的主要是IT问题。类似的只是解决了你村里有没有(有多大)一个菜市场、批发市场的问题,但买菜的事儿还是要你自己干。

PaaS 则类似于 在酒店办酒席

  1. 资源可以共用,包括物理资源,比如厨师、服务员、大厅等;软性资源,上菜次序、接待经验等,酒店可以同时接待多家客户的酒席。
  2. 一些要素参数化(学名叫服务化的能力供应),比如你指定川菜即可,不用亲自购买相关的原料。
  3. 动态调配,比如你临时加一桌,则酒店在全局范围内为你调配资源,无需你再去菜市场、批发市场跑一圈
  4. 要素监控,比如由酒店确保食物卫生,大厅的投影没有故障,足够的传菜员等。

这其中,承包队的作用便是:用户教育。先找一个点切入,再扩展至全局。 因为没有任何一家公司上来就按照完整的paas 来搭建运维体系。

运维的同学都知道,一般公司内的服务器会分为 应用集群、数据集群等,分别用来跑业务应用 和 大数据组件(比如hadoop、spark)等。为何呢?一个是物理机配置不一样;一个是依赖服务不一样,比如应用集群每台主机都会配一个日志采集监控agent,数据集群每台主机也有类似的agent,但因为业务属性不一样,监控的侧重点不一样,所以agent 逻辑不一样。进而,应用集群的服务 不可以随便部署在 数据集群的机器上。容器云之后,服务可以随意编排和移动, 那么物理机就单纯是提供计算了, 服务是否部署在某个机器上 只跟这个机器是否空闲有关,跟机器的划分(应用集群还是大数据集群)无关了。这个技术在阿里已经落地了数据中心日均 CPU 利用率 45% 的运行之道–阿里巴巴规模化混部技术演进

《Paas实现与运维管理》 笔记

对计算、网络和存储三大资源的管理就是运维,将运维需求进行整理,将这部分工作标准化、自动化,才能对上提供服务自API接口,集合配置管理和服务管理构建一个完备的PaaS平台。PaaS是技术实现与管理规约的双层结合。

paas,对于运维人员来说,就是将管理的内容从一系列的硬件物理机(装系统,zabbix监控等)转换为维护一个pass平台正常运行。对于开发来说,部署,从一个通知运维的过程(比较大的项目,或许还要写一个文档,盯着运维一起干),变成了自己到pass平台上提交等。

运维需求

  1. 软件配置

    “进程”这个概念是人们抽象出来的,并没有一个客观的实体与之对应(比如block对应一个存储区域)。观察linux的进程结构体,可以看到,它包含了运算所需要一系列资源的指针(比如文件描述符)。同理,一个软件配置,包括程序、文档,运行环境等

  2. 服务部署,决定将一个服务部署在哪台机器上。

    这个机器是否符合服务的要求(cpu,内存),有依赖的服务是否要部署在一起等

  3. 服务发现
  4. 监控恢复

资源的提供方式要提供一定的标准

  资源分配的表现形式  
计算 将原始任务拆分,子任务并行化  
存储 将分散的存储空间聚合成一个逻辑上的、可不断扩展的大存储  
网络 服务的互联与隔离、防火墙策略等  

docker

我们从paas这个大概念下来理解docker的小概念。docker有以下特性特别适合干这个事

  1. 代码和环境相结合,以image的形式存在。代码通过docker registry + docker pull的形式,在各个host中流动
  2. 以容器的方式运行。其实你细看下公司tomcat的配置,大多数时候每个项目一个tomcat,tomcat配置最大jvm内存等,也是以容器的方式存在并运行。而容器的管理与监控,要比直接管理(增删改查)和监控一个tomcat进程方便。