自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

8小时_公共号:图解源码

公共号: 图解源码, 微信: baxiaoshi2020

  • 博客(49)
  • 收藏
  • 关注

原创 如何利用事件溯源思想实现分布式任务编排的容错?

在做分布式系统集成的时候,当一个功能涉及到多个平台的时候,通常面对的问题都是如果失败了怎么办?今天就给大家分享一个新思路-基于事件溯源实现分布式协调我们的挑战在进行正式开始之前我们需要先介绍下我们的场景是什么,要解决的问题是什么。场景在应用管理平台建设中需要整合内部的多个平台,比如容器、虚机、监控、发布、cmdb、负载等多个平台,每个平台都只负责某一部分功能,但是比如我们要做一个虚机扩容、灰度发布等通常就需要操作多个平台;如果是全部都是基于k8s的可能还好一点,但是对于一些公司这种平台建设早于容器平

2021-03-16 09:15:28 187

原创 如何利用事件溯源思想实现分布式任务编排的容错?

在做分布式系统集成的时候,当一个功能涉及到多个平台的时候,通常面对的问题都是如果失败了怎么办?今天就给大家分享一个新思路-基于事件溯源实现分布式协调我们的挑战在进行正式开始之前我们需要先介绍下我们的场景是什么,要解决的问题是什么。场景在应用管理平台建设中需要整合内部的多个平台,比如容器、虚机、监控、发布、cmdb、负载等多个平台,每个平台都只负责某一部分功能,但是比如我们要做一个虚机扩容、灰度发布等通常就需要操作多个平台;如果是全部都是基于k8s的可能还好一点,但是对于一些公司这种平台建设早于容器平

2021-03-16 09:13:58 219

原创 如何利用开源框架实现运维编排

在日常的工作中通常会组合几个系统的相关功能共同完成某个业务场景,这时候通常在一般的微服务中就需要使用分布式事务来解决,或者通过本文说的编排的方式来解决,本文算是这个系列的入门篇,主要是介绍下笔者在实际工作中的尝试,后续会持续更新一些内部的原理与更好玩的生产实践1.背景在接手的运维平台中之前的设计是在一个大的controller将完成某个业务场景的代码全部写在一起,然后中间为了兼容各种之前的平台和场景的问题,充斥着大量的if else以及硬编码,导致出了问题需要就要人为介入排查,扩展性、健壮性几乎为零,

2021-01-17 11:19:17 503

原创 基于云原生CloudEvent实现服务目录

基于事件驱动的系统架构在日常的平台开发中早已司空见惯,通过消息队列进行事件的发送,然后分别构建对应的生产者和消费者。不过在传统的业务开发模式不同的事件会有不同的格式,不同的生产者生成出的事件格式也各不相同,消费者能消费的格式也是千差万别,本质上事件、生产者、消费者还是耦合的。那如何解决该问题呢?那就是我们今天要聊的CloudEvent。CloudEvent简介从官网的CloudEvents描述中我们可以看出,CloudEvent本质上就是一个描述事件数据的规范。所以对于CloudEvents的学习有的

2021-01-17 11:18:42 629

原创 图解Knative核心组件Serving基础设计

最近闲下来,打算把Knative的核心组件Serving给学习下,会继续采用k8s源码学习的方式,管中窥豹以小击大,学习serving的主要目标: 可观测性基础设施、自动伸缩、流量管理等核心组件的设计与实现,今天先简单臆测下,感兴趣的同学, 一起来学习吧1. 基于云原生的单体应用构建大多数公司的服务可能都已经经过单体、SOA演进到了当下流行的微服务架构,微服务给我们带来了独立演进、扩容、协作、...

2020-04-24 14:39:42 1092

原创 基于k8s的容器云Paas平台概要设计

基于K8s的容器云Paas平台应该是每个使用k8s的公司必须要做的一件事,今天我们尝试以应用为中心,采用搭积木的方式完成一个最小版本的容器云Paas平台的设计,Let's Go1. 基础功能我们期望是实现一个尽可能自助的服务,所以里面先不考虑一些诸如审批,之类的操作,在此部分我们要完成应用从打包到上线的关键流程1.1 镜像打包研发编写好代码,此时就要进行代码的生产环境部署,而部署的...

2020-04-13 21:09:43 2041

原创 Pod创建流程代码版本[kubelet篇]

在k8s的面试中Pod的创建流程是一个常问的问题,而kubelet则无疑重中之重,之前也写过一篇Pod的运行,不过没有涉及到具体的代码,本文尝试用代码的方式,来复数整个核心的流程,同时为了方便记忆,又将整个过程分为:准备、配置、清理、构建运行四个阶段,让我们一起来看下吧, 文末有大图总结​2. 准备阶段当获取到Pod添加的事件的时候,首先会进行一些基础的工作,我吧这个过程称为准备阶段,准备阶段...

2020-04-12 22:52:20 493

原创 图解kubernetes命令执行核心实现

K8s中的命令执行由apiserver、kubelet、cri、docker等组件共同完成, 其中最复杂的就是协议切换以及各种流拷贝相关,让我们一起来看下关键实现,虽然代码比较多,但是不会开发应该也能看懂,祝你好运1. 基础概念K8s中的命令执行中有很多协议相关的处理, 我们先一起看下这些协议处理相关的基础概念1.1 Http协议中的Connection与UpgradeHTTP/1.1中...

2020-04-08 12:40:50 1234 1

原创 图解kubernetes控制器HPA横向伸缩的关键实现

HPA是k8s中横向伸缩的实现,里面有很多可以借鉴的思想,比如延迟队列、时间序列窗口、变更事件机制、稳定性考量等关键机制, 让我们一起来学习下大佬们的关键实现1. 基础概念HorizontalPodAutoscaler(后面简称HPA)作为通用横向扩容的实现,有很多关键的机制,这里我们先来看下这些关键的的机制的目标1.1 横向扩容实现机制HPA控制器实现机制主要是通过informer获取...

2020-04-06 14:23:25 1318

原创 图解kubernetes控制器Deployment核心机制

Deployment是k8s中部署更新的关键实现,今天我们一起初探下其关键机制包括: 暂停、回滚、扩缩容、更新策略的实现1. 基础概念Deployment本质上其实只是一种部署策略,在了解其实现之前,先简单介绍一下部署系统里面常见的概念,Deployment里面的各种参数和设计其实也都是围绕着这些展开的1.1 ReplicaSetDeployment本身并不直接操作Pod,每当其更新的时...

2020-04-02 17:21:28 1285

原创 图解kubernetes批处理Job控制器的关键设计

K8s中的批处理任务模块主要是由Job控制器完成,今天我们就来关注下其底层的关键设计,包括完成状态、并行模式、并行策略等关键机制1. 基础概念在聊k8s的任务模块的实现的时候,我们先看一下传统的任务系统的设计与实现,然后聊下基于k8s的基础的概念1.1 传统的任务系统设计传统的任务系统设计主要可以分为master(任务分配/故障感知/负载均衡)、Worker(任务执行/任务监控/任务管理...

2020-03-31 11:23:43 804

原创 图解kubernetes批处理Job控制器的关键设计

K8s中的批处理任务模块主要是由Job控制器完成,今天我们就来关注下其底层的关键设计,包括完成状态、并行模式、并行策略等关键机制1. 基础概念在聊k8s的任务模块的实现的时候,我们先看一下传统的任务系统的设计与实现,然后聊下基于k8s的基础的概念1.1 传统的任务系统设计传统的任务系统设计主要可以分为master(任务分配/故障感知/负载均衡)、Worker(任务执行/任务监控/任务管理...

2020-03-31 11:18:30 98

原创 图解kubernetes控制器StatefulSet核心实现原理

StatefulSet是k8s中有状态应用管理的标准实现,今天就一起来了解下其背后设计的场景与原理,从而了解其适用范围与场景1. 基础概念首先介绍有状态应用里面的需要考虑的一些基础的事情,然后在下一章我们再去看statefulSet的关键实现1.1 有状态与无状态在日常开发的应用中,通常可以分为两大类:有状态与无状态,比如web服务通常都是无状态的,web应用数据主要来自后端存储、缓存等...

2020-03-29 11:04:04 935

原创 图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习1. informer的本质1.1 设计目标之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以...

2020-03-09 16:51:31 790

原创 图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习1. informer的本质1.1 设计目标之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以...

2020-03-09 16:49:42 110

原创 图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习1. informer的本质1.1 设计目标之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以...

2020-03-09 16:41:45 94

原创 图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习1. informer的本质1.1 设计目标之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以...

2020-03-09 16:33:04 101

原创 图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习1. informer的本质1.1 设计目标之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以...

2020-03-09 16:31:46 135

原创 图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习1. informer的本质1.1 设计目标之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以...

2020-03-09 16:31:13 530

原创 图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习1. informer的本质1.1 设计目标之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以...

2020-03-09 16:21:30 105

原创 图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习1. informer的本质1.1 设计目标之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以...

2020-03-09 16:12:33 329

原创 图解kubernetes资源扩展机制实现(下)

昨天我们介绍了k8s中资源插件机制的核心关键组件,今天我们继续来看下各个组件是如何进行通信的,以及k8s中针对事件处理背后的关键设计1.PluginManagerPluginManager是一个上层组件,其内部包含了上篇文章中的关键组件,并且协调其内部数据流,而且还提供针对不同插件的具体的控制器1.1 核心数据结构核心结构里面其实就是按照数据流来进行设计的,首先需要一个感知插件desire...

2020-02-18 10:28:35 900

原创 图解kubernetes资源扩展机制实现(上)

k8s目前主要支持CPU和内存两种资源,为了支持用户需要按需分配的其他硬件类型的资源的调度分配,k8s实现了设备插件框架(device plugin framework)来用于其他硬件类型的资源集成,比如现在机器学习要使用GPU等资源,今天来看下其内部的关键实现1. 基础概念1.1 集成方式1.1.1 DaemonSet与服务当我们要集成本地硬件的资源的时候,我们可以在当前节点上通过Da...

2020-02-17 11:42:20 543 1

原创 图解kubernetes容器状态同步机制核心实现

在K8s中将Pod调度到某一台Node节点之后,后续的状态维护信息则是由对应机器上的kubelet进行维护,如何实时反馈本地运行状态,并通知apiserver则是设计的难点, 本节主要是通过感知Pod状态变化和探测状态改变两个流程来实际分析其核心数据结构,来了解内部设计1. 状态管理1.1 静态Pod静态Pod主要是指的那些不是通过感知apiserver创建的pod, 因为apiserver...

2020-02-13 11:29:03 1160

原创 图解kubernetes容器探活机制核心实现状态管理

k8s为实现容器探活worker的管理构建了一个Manager组件,该组件负责底层探活worker的管理,并且缓存当前的容器的状态,并对外同步容器的当前状态,今天我们就来分析下其部分核心组件1. 核心原理实现Manager缓存的状态主要是会被kubelet、状态组件消费,并且在Pod同步状态的时候,会通过当前Manager里面的探测状态来更新Pod的容器的就绪与启动状态的更新,让我们一起看看M...

2020-02-12 11:31:08 1340

原创 图解kubernetes容器探活机制核心实现

在k8s中通过kubelet拉起一个容器之后,用户可以指定探活的方式用于实现容器的健康性检查,目前支持TCP、Http和命令三种方式,今天介绍其整个探活模块的实现, 了解其周期性探测、计数器、延迟等设计的具体实现1. 探活的整体设计1.1 线程模型探活的线程模型设计相对简单一些,其通过worker来进行底层探活任务的执行,并通过Manager来负责worker的管理, 同时缓存探活的结果1...

2020-02-11 12:07:06 2506

原创 图解kubernetes容器运行时状态缓存数据结构

缓存和发布订阅都是后端开发中常用的手段,其中缓存主要是用于可丢失数据的暂存,发布订阅主要是用于消息传递,今天给大家介绍一个k8s中带有发布订阅的缓存实现,其目标是给定一个时间,只关注该时间后续的事件,主要是用于近实时状态数据的获取1. 业务背景在k8s中的kubelet中支持不同的容器运行时,为了缓存容器运行时当前所有可见的Pod/Container就构造了一个Cache结构,当一个事件发生后...

2020-02-10 11:41:37 841

原创 kubernetes用户态TCP代理实现

在k8s中针对service的访问通常基于kube proxy实现负载均衡,今天我们来探索下基于用户态的TCP代理组件的工业级实现核心设计, 其中包括随机端口生成器、TCP流复制等技术的核心实现1. 基础筑基今天主要是聊用户态的转发,而基于内核态的先不聊1.1 流量重定向流量重定向通常是指通过内核的netfilter来对数据包进行拦截,将其定向到我们指定的端口,实现对流量的劫持,从而针对流...

2020-02-07 11:17:21 1277

原创 分布式负载均衡算法之亲和性轮询原理

无论是在早期的负载均衡器中,还是当前微服务基于客户端的负载均衡中,都有一个最基础的轮询算法,即将请求平均分布给多台机器,今天聊聊在此基础上, kube proxy是如何实现亲和性轮询的核心数据结构. 了解亲和性策略实现,失败重试等机制1. 基础筑基1.1 Service与EndpointsService和Endpoint是kubernetes中的概念,其中Service代表一个服务,后面通常...

2020-02-06 20:39:35 1337

原创 图解kubernetes调度器核心实现原理大揭秘

kubernetes调度器之前已经分析过SchedulerCache、ScheduleAlgorithm、SchedulerExtender、Framework等核心数据结构,也分析了优选、调度、抢占流程的核心实现,本文是本系列目前打算的最后一章, 也是当前阶段对调度的学习的一个总结整个系列文档我已经已经更新到语雀上了地址是,谢谢大家分享加微信一起交流 https://www.yuque.com...

2020-02-04 12:24:17 1507

原创 图解kubernetes调度器framework核心数据结构

Framework是kubernetes扩展的第二种实现,相比SchedulerExtender基于远程独立Service的扩展,Framework核心则实现了一种基于扩展点的本地化的规范流程管理机制1. 扩展实现目标Framework的设计在官方文档中已经有明确的描述,当前还没有Stable, 本文目前基于1.18版本聊一聊除了官方描述外的实现的上的一些细节1.1 阶段扩展点目前官方主要...

2020-02-03 01:18:21 485

原创 图解kubernetes调度器SchedulerExtender扩展

在kubernetes的scheduler调度器的设计中为用户预留了两种扩展机制SchdulerExtender与Framework,本文主要浅谈一下SchdulerExtender的实现, 因为还有一篇Framework, 所以本文的k8s代码切到1.18版本1. 设计思路1.1 实现机制SchdulerExtender是kubernets外部扩展方式,用户可以根据需求独立构建调度服务,...

2020-02-01 21:06:08 1977

原创 图解kubernetes调度器抢占流程与算法设计

抢占调度是分布式调度中一种常见的设计,其核心目标是当不能为高优先级的任务分配资源的时候,会通过抢占低优先级的任务来进行高优先级的调度,本文主要学习k8s的抢占调度以及里面的一些有趣的算法1. 抢占调度设计1.1 抢占原理抢占调度原理其实很简单就是通过高优先级的pod抢占低优先级的pod资源,从而满足高优先pod的调度1.2 中断预算在kubernetes中为了保证服务尽可能的高可用,设计...

2020-01-20 10:55:40 948

原创 图解kubernetes服务打散算法的实现源码

在分布式调度中为了保证服务的高可用和容灾需求,通常都会讲服务在多个区域、机架、节点上平均分布,从而避免单点故障引起的服务不可用,在k8s中自然也实现了该算法即SelectorSpread, 本文就来学习下这个算法的底层实现细节1. 设计要点1.1 zone与nodezone即代表一个区域,node则是一个具体的节点,而该打散算法的目标就是将pod在zone和node之间进行打散操作1.2 ...

2020-01-18 13:54:46 1119

原创 图解kubernetes scheduler基于map/reduce模式实现优选阶段

优选阶段通过分map/reduce模式来实现多个node和多种算法的并行计算,并且通过基于二级索引来设计最终的存储结果,从而达到整个计算过程中的无锁设计,同时为了保证分配的随机性,针对同等优先级的采用了随机的方式来进行最终节点的分配,如果大家后续有类似的需求,不妨可以借鉴借鉴1. 设计基础1.1 两阶段: 单点与聚合在进行优选的时候,除了最后一次计算,在进行针对单个算法的计算的时候,会分为...

2020-01-17 16:43:36 908

原创 图解kubernetes调度器预选设计实现学习

Scheduler中在进行node选举的时候会首先进行一轮预选流程,即从当前集群中选择一批node节点,本文主要分析k8s在预选流程上一些优秀的筛选设计思想,欢迎大佬们指正1. 基础设计1.1 预选场景预选顾名思义就是从当前集群中的所有的node中,选择出满足当前pod资源和亲和性等需求的node节点,如何在集群中快速选择这样的节点,是个复杂的问题1.2 平均分布平均分布主要是通过让一...

2020-01-16 17:59:10 925

原创 图解kubernetes调度器ScheduleAlgorithm核心实现学习框架设计

ScheduleAlgorithm是一个接口负责为pod选择一个合适的node节点,本节主要解析如何实现一个可扩展、可配置的通用算法框架来实现通用调度,如何进行算法的统一注册和构建,如何进行metadata和调度流程上下文数据的传递1. 设计思考1.1 调度设计1.1.1 调度与抢占当接收到pod需要被调度后,默认首先调用schedule来进行正常的业务调度尝试从当前集群中选择一个合适的n...

2020-01-15 10:48:12 978

原创 图解kubernetes调度器SchedulerCache核心源码实现

SchedulerCache是kubernetes scheduler中负责本地数据缓存的核心数据结构, 其实现了Cache接口,负责存储从apiserver获取的数据,提供给Scheduler调度器获取Node的信息,然后由调度算法的决策pod的最终node节点,其中Snapshot和节点打散算法非常值得借鉴设计目标数据感知SchedulerCache的数据从apiserver通过网络感知...

2020-01-14 10:04:31 3447

原创 图解kubernetes调度器SchedulingQueue核心源码实现

SchedulingQueue是kubernetes scheduler中负责进行等待调度pod存储的对,Scheduler通过SchedulingQueue来获取当前系统中等待调度的Pod,本文主要讨论SchedulingQueue的设计与实现的各种实现, 了解探究其内部实现与底层源码,本系列代码基于kubernets1.1.6分析而来,图解主要位于第二部分SchedulingQueue设计...

2020-01-13 11:04:39 1075

原创 图解 kubernetes scheduler 架构设计系列-初步了解

资源调度基础scheudler是kubernetes中的核心组件,负责为用户声明的pod资源选择合适的node,同时保证集群资源的最大化利用,这里先介绍下资源调度系统设计里面的一些基础概念基础任务资源调度基础的任务资源调度通常包括三部分:角色类型功能nodenode负责具体任务的执行,同时对包汇报自己拥有的资源resource manager汇总当前集群中所有nod...

2020-01-09 17:15:37 1150

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除