《Kubernetes与云原生应用》专栏是InfoQ向轻元科技首席架构师王昕约稿的系列 文章。本专栏包含8篇内容,将会从介绍和分析Kubernetes系统以及云原生应用 入手,逐步推出基于Kubernetes的容器设计模式实践案例,希望对计划应用Kubernetes的朋友有所帮助。本文是该专栏的第七篇。

  1. Kubernetes系统架构与设计理念
  2. 云原生应用的设计理念与挑战
  3. Kubernetes与云原生应用的容器设计模式
  4. Kubernetes容器设计模式实践案例-单节点多容器模式
  5. Kubernetes容器设计模式实践案例-多节点选举模式
  6. Kubernetes容器设计模式实践案例-工作队列模式
  7. Kubernetes容器设计模式实践案例-分散收集模式
  8. 云原生应用的容器设计模式综述与展望

Kubernetes与容器设计模式

目前Kubernetes社区推出的容器设计模式主要分为三大类:

第一类,单容器管理模式;

第二类,单节点多容器模式;

第三类,多节点多容器模式;

一类比一类更复杂。根据复杂性的不同,本系列文章给出不同篇幅的实践案例介绍。云计算跟分布式系统是一个事物的两种解读:云计算是面子,分布式系统是里子。云计算给用户刻画出的是方便的、弹性的、自动化的随时随地可以得到的信息处理服务;而后台,需要云平台背后的研发和运维工程师创建维护好一个复杂的分布式系统。

本系列文章所推出的容器设计模式,旨在将分布式系统,特别是将分布式应用模式化,简化分布式系统的创建和维护。本文将介绍容器设计模式的最后一种,分散收集模式。这是最复杂的一种,但也是最具通用意义的一种模式。分散收集模式先将服务扇出到多个微服务实例上做独立处理,再将所有处理结果扇入到一个逻辑根微服实例上作合并,以此来完成对一个复杂问题的处理;这和数学和计算机算法中的分治法非常相似。这一模式对利用k8s平台运行分布式系统有普遍应用价值。

分散收集模式

分散收集模式利用分布式系统弹性计算能力的容器设计模式。在这一模式中,计算服务的使用者,即服务的客户端,将初始计算请求发送给一个“根计算节点”。根计算节点对计算任务做出分割,将任务分割成大量的小计算任务,然后将小计算任务分配给大量计算服务器进行分布式平行计算 。每个计算服务器都计算初始计算任务的一小块,将计算结果返回给根计算节点。根计算节点将所有计算结果合并起来,组成一个针对初始计算任务的一个统一的结果,返回给申请计算任务的客户端。

这一系统中的分布式服务器非常适合用容器技术来实现,具体到K8s系统中,就是一个K8s的Pod;具体到Docker系统中,就是一个Docker容器。利用容器快速部署启动和运行时开销特别小的特点,任务可以被分到很多小服务器上并行处理,这些容器形成的小服务器跟其他任务共同使用基础设施计算节点的能力。

一个典型的分散收集模式的分布式系统如图Fig01所示。根节点接受到来自客户端的服务请求,将服务请求分配给不同的业务模块分散处理,处理结果收集到根节点,经过一定的汇聚合并运算,产生一个合并的结果交付给客户端。

Fig01 分散收集模式示意图

本文中案例的代码 本文中使用的代码在Github仓库:https://github.com/xwangqingyuan/metaparticle 本文中使用的代码主要以metapaticle项目为基础:https://github.com/brendandburns/metaparticle 本文作者在此基础上增加了用于演示scatter gather容器模式的案例,在https://github.com/xwangqingyuan/metaparticle/tree/master/examples目录下。

分布式计算模式项目Metapaticle

Metapaticle项目的目的在开发并展示一种基础设施即代码的编程模式,力图将基础设施管理逻辑和功能运算逻辑以同一种语言实现在同一短小精干的程序中。

在分布式计算系统中,不仅功能性计算的逻辑是重要的,对计算系统的逻辑拓扑结构的控制也是重要的。大家可以想象,依靠流行大数据分析框架Hadoop MapReduce,Spark,Storm和Flink等进行分布式大数据运算,代码中往往包含逻辑拓扑结构的逻辑。

在以往的分布式计算特别是云计算体系中,大多将基础设施管理的逻辑由配置文件和自动化运维工具来配置,而功能运算逻辑由通用的编程语言来控制。这一模式也比较符合过去基础设施管理逻辑和功能运算逻辑的特点

在过去,基础设施相对固定,变化较小,因此用来管理它的配置文件和自动化运维工具不需要支持太强大的动态逻辑功能;另一方面,过去大多数编程语言的抽象度和表达能力较底层,以命令式的编程范式为主;因此,功能运算逻辑和基础设施管理逻辑相距较远。即便如此,当开发人员开始运维自己的软件系统时,不可避免地将同时用两种语言分别管理基础设施和功能运算逻辑,往往给开发人员带来不舒服的感觉。

随着云计算特别是容器技术的流行,计算机系统的基础设施越来越动态,人们对基础设施管理控制的逻辑控能力要求越来越大。同时,随着计算机语言的发展,函数式编程,声明式语言越来越收到开发人员的熟悉;人们越来越倾向于使用高抽象度的、高表达力的函数式编程模式甚至声明式语言来快速地实现功能逻辑,使得很多应用功能逻辑的代码看上去越来越简单得像“配置文件”。这样,对基础设施管理逻辑控制能力的需求和对功能运算逻辑控制能力的需求似乎越来越接近了。

在这种背景下,metaparticle项目被设计用来探索将基础设施管理逻辑和功能运算逻辑以同一种编程语言来实现的模式。正像我们提到的,随着云计算和容器的发展,基础设施管理逻辑和功能运算逻辑越来越融合成一个整体的分布式计算任务。Metaparticle谋求的正是用同一种语言搞定一个整体的计算任务。

目前metaparticle主要支持javascript语言,主要是利用它的简单性和它对函数式编程的支持。当然,按照metaparticle的设计思想,未来Python,Scala,Swift这些较高级的语言都可是用来实现metaparticle的模式。Metaparticle的设计思想在于用同一种语言完成同一个分布式计算任务,但是并不会谋求限制到某一种特定语言。

Metaparticle项目还很初级,主要对我们的帮助还是试验和启发作用。Metaparticle支持3种分布式系统的服务模式:分散收集模式(Scatter/Gather)、分片模式(Shard)和水平扩展模式(Spread)。其中分散收集模式是更具通用性的一种模式,正好也是本系列文章中准备介绍的最后一种容器设计模式,也是最复杂的一种设计模式。本文中针对分散收集模式的演示案例,以metaparticle为基础,先要通过nodejs的包管理工具安装metaparticle模块,然后通过node来试验本文中的案例。

安装Metaparticle

本文中的演示案例以Metaparticle的Scatter/Gather模式为基础,要安装可参照文件https://github.com/xwangqingyuan/metaparticle/blob/master/README.md和https://github.com/xwangqingyuan/metaparticle/blob/master/examples/server1.md 要通过NPM安装Metaparticle,可以直接运行: $ npm install metaparticle 也可以下载代码后,通过本地代码安装: $ git clone https://github.com/xwangqingyuan/metaparticle.git$ npm install ./metaparticle/ 在安装过程中如果碰到缺少的nodejs module,直接用npm install即可。

通过分散收集计算正态分布(高斯分布)的统计特性

在本演示案例中,利用分散收集模式模拟展示一个正态分布的统计直方图。 计算高斯分布的示例代码文件scatter-gather-gaussian.js清单。

// Import the main library var mp = require(‘metaparticle’); // A simple function for calculating a Gaussian distributed value // from a uniform random value var gaussian = function (sigma, mean) { var u1 = 2 * Math.PI * Math.random(); var u2 = -2 * Math.log(Math.random()); var n = Math.sqrt(u2) * Math.cos(u1); return n * sigma + mean; };

// This function is executed on each leaf var leafFunction = function (data) { var result = { ‘n’: [] }; for (var i = 0; i < 100; i++) { result.n.push(gaussian(25, 100)); } return result; };

// This function is executed on each root var mergeFunction = function (responses) { var histogram = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (var i = 0; i < responses.length; i++) { for (var j = 0; j < responses[i].n.length; j++) { if (responses[i].n < 0 || responses[i].n > 200) { continue } var ix = Math.floor(responses[i].n[j] / 20); histogram[ix]++; } } return histogram; };

var svc = mp.service( // name of the service “histogram-service”, // library function that creates a scatter/gather service mp.scatter(10, leafFunction, mergeFunction)); // Expose the root service to the world svc.subservices.gather.expose = true; // And serve mp.serve();

在本例中,根服务器将计算任务分配给10个叶子服务器计算。方法mp.scatter用来调度整体的分布式计算。方法mp.scatter的第一个参数是分片的个数,第2个参数是叶子服务器的计算函数leafFunction,第3个参数是根服务器合并的计算函数mergeFunction。

在本例中,每个叶子节点都模拟一个方差为25,均值为100的正态分布随机变量。计算函数leafFunction用来产生100个随机变量,计算函数mergeFunction用来合并所有子节点的随机变量,统计这些随机变量的样本值处在不同区间的个数。

启动分散收集模式计算高斯分布的服务器端容器服务。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node scatter-gather-gaussian.jsbuilding image (this may take a bit)building image done.deploying

运行客户端程序发送请求计算统计结果。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node client.js histogram-service[0,4,55,139,296,284,160,53,9,0] 通过计算结果可以看到,正如一般正态分布所预期的一样,正态分布的主要样本个数集中在直方图中间的部分296和284,越向两边样本个数越少。

停止并删除分散收集模式的服务器端容器服务。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node scatter-gather-gaussian.js delete

通过分散收集计算均匀分布的统计特性

在本例中,每个叶子节点都模拟一个处于0到200之间的均匀分布的随机变量。计算函数leafFunction用来产生100个随机变量,计算函数mergeFunction用来合并所有子节点的随机变量,统计这些随机变量的样本值处在不同区间的个数。 计算均匀分布的示例代码文件scatter-gather-uniform.js清单。

// Import the main library var mp = require(‘metaparticle’); // A simple function to caculate a uniform integer var uniform = function (lower, upper) { return Math.round(lower + (upper-lower)*Math.random()); }; // This function is executed on each leaf var leafFunction = function (data) { var result = { ‘n’: [] }; for (var i = 0; i < 100; i++) { result.n.push(uniform(0, 200)); } return result; }; // This function is executed on each root var mergeFunction = function (responses) { var histogram = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (var i = 0; i < responses.length; i++) { for (var j = 0; j < 10; j++) { histogram[j] += responses[i].n[j]; } } return histogram; };

var svc = mp.service( // name of the service “histogram-service”, // library function that creates a scatter/gather service mp.scatter(10, leafFunction, mergeFunction)); // Expose the root service to the world svc.subservices.gather.expose = true; // And serve mp.serve();

启动分散收集模式计算均匀分布的服务器端容器服务。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node scatter-gather-uniform.js.jsbuilding image (this may take a bit)building image done.deploying

运行客户端程序发送请求计算统计结果。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node client.js histogram-service[1244,980,1066,961,679,1097,825,1021,719,911] 通过计算结果可以看到,正如一般均匀分布所预期的一样,均匀分布的主要样本个数在10个收集得到的样本区间分布比较均匀,围绕平均数1000上下波动。

停止并删除分散收集模式的服务器端容器服务。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node scatter-gather-uniform.js delete

通过分散收集计算整数中的数字出现频率

在本例中,利用分散收集模式,模拟统计一系列整数的10进制占位数字的统计特性。 在本例中,每个叶子节点都计算100个处于0到100之间的均匀分布的整数的所有占位数字的出现次数,例如56这个整数,有5和6两个数字,会给5和6这两个数字的次数分别增加1。计算函数leafFunction用来产生100个随机变量,并统计这100个随机变量的数字(0-9)出现次数,计算函数mergeFunction用来合并所有子节点的计算的出现次数,计算出总的出现次数。

计算整数中的数字出现频率的示例代码文件scatter-gather-count-digit.js清单。

// Import the main library var mp = require(‘metaparticle’); // A simple function to caculate a uniform integer var uniform = function (lower, upper) { return Math.round(lower + (upper-lower)*Math.random()); }; // This function is executed on each leaf var leafFunction = function (data) { var result = {‘n’: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}; for (var i = 0; i < 100; i++) { var num = uniform(0, 100); var str = “” + num; for (var j = 0; j < str.length; j++) { var digit = parseInt(str.charAt(j)); result.n[digit]++; } } return result; }; // This function is executed on each root var mergeFunction = function (responses) { var histogram = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (var i = 0; i < responses.length; i++) { for (var j = 0; j < 10; j++) { histogram[j] += responses[i].n[j]; } } return histogram; };

var svc = mp.service( // name of the service “histogram-service”, // library function that creates a scatter/gather service mp.scatter(10, leafFunction, mergeFunction)); // Expose the root service to the world svc.subservices.gather.expose = true; // And serve mp.serve();

启动分散收集模式计算高斯分布的服务器端容器服务。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node scatter-gather-count-digit.jsbuilding image (this may take a bit)building image done.deploying

运行客户端程序发送请求计算统计结果。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node client.js histogram-service[83,184,178,196,207,202,204,231,205,196] 通过计算结果可以看到,在所有数字中,1-9的数字出现频率是比较接近的,大概在200左右,而0作为数字出现频率是较低的,大概少100个左右,这是因为0不会作为首位数字出现。

停止并删除分散收集模式的服务器端容器服务。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node scatter-gather-count-digit.js delete

通过分散收集计算整数末尾数字的出现频率

在本例中,利用分散收集模式,模拟统计一系列整数的10进制末尾数字的出现。 在本例中,每个叶子节点都计算100个处于0到100之间的5的倍数的末尾数字的出现频率。计算函数leafFunction用来产生100个随机变量,并统计这100个随机变量的数字(0-9)出现次数,计算函数mergeFunction用来合并所有子节点的计算的出现次数,计算出总的出现次数。

计算高斯分布的示例代码文件scatter-gather-count-last-digit.js清单。

// Import the main library var mp = require(‘metaparticle’); // A simple function to caculate a uniform integer var uniform = function (lower, upper) { return Math.round(lower + (upper-lower)*Math.random()); }; // This function is executed on each leaf var leafFunction = function (data) { var result = {‘n’: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}; for (var i = 0; i < 100; i++) { var num = uniform(0, 20)*5; var str = “” + num; var digit = parseInt(str.charAt(str.length-1)); result.n[digit]++; } return result; }; // This function is executed on each root var mergeFunction = function (responses) { var histogram = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (var i = 0; i < responses.length; i++) { for (var j = 0; j < 10; j++) { histogram[j] += responses[i].n[j]; } } return histogram; };

var svc = mp.service( // name of the service “histogram-service”, // library function that creates a scatter/gather service mp.scatter(10, leafFunction, mergeFunction)); // Expose the root service to the world svc.subservices.gather.expose = true; // And serve mp.serve();

启动分散收集模式计算高斯分布的服务器端容器服务。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node scatter-gather-count-last-digit.jsbuilding image (this may take a bit)building image done.Deploying

运行客户端程序发送请求计算统计结果。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node client.js histogram-service[495,0,0,0,0,505,0,0,0,0] 通过计算结果可以看到,在所有数字中,0和5的作为末尾数字占据了所有出现次数,各占出现频率的一半,而其他数字不会作为末尾数字出现;这很显然,因为这里统计的所有整数都是5的倍数。

停止并删除分散收集模式的服务器端容器服务。 xwang@dev-xwang:/gitws/github.com/xwangqingyuan/metaparticle/examples$ node scatter-gather-count-last-digit.js delete

总结

本文主要介绍了K8s集群中,多节点容器模式中的分散收集模式。分散收集模式利用分布式系统弹性计算能力的容器设计模式。在这一模式中,计算服务的使用者,即服务的客户端,将初始计算请求发送给一个“根计算节点”。根计算节点对计算任务做出分割,将任务分割成大量的小计算任务,然后将小计算任务分配给大量计算服务器进行分布式平行计算 。每个计算服务器都计算初始计算任务的一小块,将计算结果返回给根计算节点。根计算节点将所有计算结果合并起来,组成一个针对初始计算任务的一个统一的结果,返回给申请计算任务的客户端。分散收集模式是本系列容器设计模式的最后一种,也是最复杂的和最有普遍应用价值的一种模式。

本文同时介绍了分布式计算模式项目Metapaticle,该项目的目的在开发并展示一种基础设施即代码的编程模式,力图将基础设施管理逻辑和功能运算逻辑以同一种语言实现在同一短小精干的程序中。依靠K8s集群强大的基础设施编排引擎和控制工具,以容器为基础实施的分布式应用可以获得强大的动态管理基础设施的能力,DevOps理念从流程管理上连通开发和运维,而Metapaticle则考虑从编程范式和编程语言上打通开发和运维,成为一种新的DevOps自动化工具。

本文转自中文社区-Kubernetes(K8s)容器设计模式实践案例 – 分散收集模式

Kubernetes(K8s)容器设计模式实践案例 – 分散收集模式相关推荐

  1. Kubernetes(K8s) —— 容器编排管理技术

    K8s 容器编排管理技术 第一章 是什么 1. 背景 2. 基础概念 Pod 控制器 Service 3. 架构 第二章 环境搭建与安装 1. 虚拟机集群搭建 命令批执行技巧 2. K8s相关软件安装 ...

  2. kubernetes(k8s)容器集群管理系统

    kubernetes 文章目录 kubernetes 什么是k8s? 为什么需要K8S? 多机编排管理容器 k8s的特性 Kubernetes集群架构与组件 核心组件 Master组件 Kube-ap ...

  3. kubernetes(K8S)容器部署,重新启动后,node节点提示notready无法正常工作。

    打开服务器,查看容器部署k8s组件节点是否正常. [root@k8s-master01 ~]# kubectl get pod -n kube-system NAME READY STATUS RES ...

  4. Springboot 使用管道设计模式 , 实践案例玩一玩

    前言 这段时间,学习群里大家讨论设计模式频率很高,可以看出来 日常搬砖 CRUD 已经让人从麻木到想脱离麻木,对代码有了些许追求. 当然也有还没放开的小伙(N重打码照顾兄弟),不敢参与讨论,但是私下还 ...

  5. 【设计模式实践系列】策略模式应用订单折扣方案

    策略模式 策略模式指的是一个类的行为或其算法可以在运行时更改,在不同的场景中,有不同的实现算法. 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情 ...

  6. 2021年最新 k8s安装部署步骤 kubernetes从入门到实践 K8S实战容器化迁移实战教程 K8S存储之Ceph分布式存储系统 K8S架构师实战指南

    2021年最新 k8s安装部署步骤 kubernetes从入门到实践 K8S实战容器化迁移实战教程 K8S存储之Ceph分布式存储系统 K8S架构师实战指南

  7. Spring Cloud Kubernetes容器化实践

    随着公司业务量和产品线的增加,项目越来越多,普通运维系统架构对整个软件研发生命周期的管理越来越难,效率低下,难以统一管理.近年来Docker统一了容器标准,对于软件开发流程产生了深远的影响,Docke ...

  8. Kubernetes 基于 EFK 技术栈的日志收集实践

    之前写过一篇文章介绍了容器环境下日志管理的原理机制:从 Docker 到 Kubernetes 日志管理机制详解,文章内容偏理论,本文在该理论的支撑下具体实践 Kubernetes 下基于 EFK 技 ...

  9. 从零开始入门 K8s| 详解 Pod 及容器设计模式

    作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 一.为什么需要 Pod 容器的基本概念 我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念,也是非常重要的一个原子调度单 ...

最新文章

  1. 代码重构之三种取代类型码(类、子类、状态对象或策略对象)的方式辨析
  2. Docker容器学习(一)
  3. P3690-[模板]Link Cut Tree(动态树)【Splay】
  4. java 字符串 1_java 字符串操作大全1
  5. 信息学奥赛一本通C++语言——1083:计算星期几
  6. c语言vco_VCO仿真的方法
  7. 1月全球Web服务器市场:Apache份额回升至41.64%
  8. 一个小故事来形容几个常用网络技术
  9. Android开发中的全屏背景显示方案
  10. 多媒体网络计算机室标准,10校园网、计算机教室、多媒体教室建设标准试行.docx...
  11. 高通WIFI模块QCA9377 调试
  12. 农村三资管理平台app_中科农村三资管理软件系统免费版
  13. SSM+广西壮族文化宣传网站 毕业设计-附源码230932
  14. Unity格子类三消游戏【物体下落】小细节(Unity萌新的备忘录)
  15. 阿里云发布企业云原生IT成本治理方案:五大能力加速企业 FinOps 进程
  16. 别被别人抢走了你的时间!
  17. 广州布料批发市场_广州布料批发市场介绍_广州布料批发市场分析
  18. CSS -- 实现DIV层背景颜色渐变 (兼容IE 火狐 谷歌浏览器)
  19. 【Redis】Redis介绍
  20. 取模、乘法和除法运算在CPU和GPU上的效率

热门文章

  1. Tomcat下conf下server.xml的文件配置信息
  2. Mysql 另类盲注中的一些技巧
  3. PXE BOOT DIY自己的网络启动工具集合
  4. Exchange 2010 OAB下载问题排错error 0x80200049
  5. 光伏组件清洗的7大注意事项
  6. Eureka与zookeeper
  7. @ResponseBody
  8. 自定义grains_module pillar
  9. Eclipse设置字体
  10. SQL字符串基本操作汇总