关于Kubernetes的一些零碎想法
关于Kubernetes的一些零碎想法
容器集群管理系统与容器编排系统
很多使用Kubernetes的企业可能没有认识到Kubernetes最重要的特点。许多企业将其视为一种容器集群管理系统(container management system),只使用其管理容器的能力。然而,这种看法是大错特错的。如果只是想管理容器,Mesos可能在这方面甚至比Kubernetes做得更好。甚至只需将OpenStack的driver从虚拟机换成容器,就可以实现管理容器,而无需进行任何更改。甚至自行开发一个容器管理系统,也比引入Kubernetes来得简单,因为引入Kubernetes无疑增加了整个系统的复杂度。
实际上,Kubernetes在某种程度上甚至是借鉴了Mesos的设计,而Mesos本身则是借鉴了Google的Borg。相较之下,Yarn则是雅虎推出的半吊子产品,其集群资源管理和分布式计算框架之间的层次划分并不十分明确,对容器和GPU的支持直到2018年才开始,并且它并不支持镜像部署。这一切源于Yarn诞生较早,大约在2005年左右,当时还没有计算存储分离和不可变基础设施等概念。
Kubernetes作为容器编排系统
Kubernetes的创始人并不是将其描述为容器集群管理系统,而是称其为容器编排系统(container orchestration system)。在我接触Kubernetes之前,我曾参与IaaS虚拟机集群管理系统的开发,并接触过像Yarn这样的大数据计算任务集群管理系统。我在大学实习时还涉足了Hadoop相关工作,当时只是简单地编写HiveQL,主要是做数仓方面的工作,对于Yarn的设计并不了解。但后来我自学了Yarn,认为Yarn是较好的资源管理和调度系统。
然而,当我逐渐熟悉Kubernetes时,我第一反应并不是容器、镜像、集群资源管理和调度等方面,这些方面实际上Mesos做得更出色且更早(kubelet很多代码还是参考自Mesos)。真正让Kubernetes出色的地方在于其开放式API,自定义资源的能力,控制器模式和原生的调度和编排功能。这使得我相信统一基础设施是有可能实现的!在我看来,Yarn(或者Mesos)实际上只是一个普通的集群资源管理系统。虽然大家都说没有银弹,就像编程语言一样,没有绝对的银弹,但我认 为Kubernetes是分布式时代最接近银弹的一枚。
我曾在单机上实现过一些多进程的Pipeline小程序,发现Kubernetes中的Pod其实就是在集群之上抽象出来的进程。你不需要关注集群中的物理节点,你只需要关注如何创建、监听和编排这些Pod,就像以前在单机上写的编排程序一样。这是我对Kubernetes思想的第一个理解,它抽象出了基本概念和接口,就像操作系统的基本概念和系统调用一样,而操作系统的接口几乎三十年来都没有变化,这正是它设计的先进之处。
在分布式系统中,有一个不可回避的话题,即在多台机器上运行代码,而不是在单个机器上。因此,所有的分布式系统都需要一个简单的接口来实现这个功能。无论是无状态应用,有状态应用,只要你的服务涉及到多台实例,你都会面对运维、部署、发布、弹性,而这恰恰是Kubernetes给出的统一标准答案,Kubernetes现在也正在的成为了事实的标准。
Yarn看到Kubernetes攻占了微服务的地盘后,甚至试图进军AI和大数据的领域。因此,在2019年左右,Yarn开始支持Docker容器和镜像。需要注意的是,Yarn中的NodeManager虽然通过分配Container的形式来为应用分配资源,但之前的Container只是Yarn中的一种资源抽象,并不是Docker,而是直接使用Cgroup隔离,启动JVM虚拟机进程,并没有镜像这些概念。很可惜,Yarn只强调资源分配和隔离,而不强调不可变基础设施,并且确实已经老态龙钟;因此,之前的Yarn无法在一个集群中运行不同版本的MapReduce或Spark。而在Kubernetes上,每一个Spark App就是一个小型集群(从最简单的Deployment集群到有状态的StatefulSet集群,再到更加复杂的大型分布式应用集群),且这些App可以采用不同的镜像版本,而Kubernetes恰恰就特别擅长和适合用来维护管理一个个小型应用集群。Kubernetes抽象程度大于Yarn,这就是为什么Yarn可以运行在Kubernetes上而不能反过来。
云原生调度和资源管理
目前大多数分布式计算框架(如Spark和MapReduce)都具有自己的集群资源管理和调度功能。在Kubernetes出现之前,大多数企业要么自行开发这些功能,要么选择使用Yarn和Mesos。然而,Yarn和Mesos并不属于云原生调度。
个人而言,我更偏爱全面采用Kubernetes的做法,而不是采用二层甚至三层的调度。将Kubernetes视为IaaS仅用于机器分配,然后部署Yarn或Mesos,由它们自行管理集群,我认为这种做法非常鸡肋,完全没有摆脱传统的IaaS思维,实际上你只是提供了一台机器,完全可以不使用Kubernetes这么复杂的系统来实现容器交付。这样的问题在于,每个Yarn集群只能看到自己的资源视角,并不知道整个基础设施的资源情况,而Yarn本身对MapReduce App的调度,就没有全局资源视角。
如果去掉中间层的Yarn和Mesos,让Kubernetes直接调度Spark、MapReduce App,其实就会轻松很多,所谓中间商赚差价,过多的中间层也会消耗过多的人力和资源。不过这主要不是技术问题,而是风险、人力、时间、成本和部门问题。
面向终态和控制器模式
Kubernetes中到处都是控制器模式和面向终态的设计。对大多数公司来说(除了Google之外),这是一种非常激进的设计,以至于许多公司要么不使用它,要么不敢使用它。当然,Kubernetes的这种声明式设计并非独创,许多编程语言和框架都支持声明式编程。
Kubernetes的控制器模式和面向终态的代码我很少写,这类代码对程序员的能力要求确实很高。编写控制器最重要的是对差异的控制和理解,需要非常严密的逻辑。这是因为这些代码不是过程式的,它们是面向终态的代码。许多人可能不理解这之间的差异,我自己开始也不是很理解,毕竟我的水平有限。虽然说表面上看,控制器很容易写,主要原因在于面临的场景还不够复杂。
举个例子,编程语言中经常会涉及两个概念:Imperative(命令式)和Declarative(声明式)。Imperative描述如何执行(How),而Declarative描述的是要执行什么(What)。 这两个概念不仅存在于编程语言中,目前的AI框架如TensorFlow和MXNet等都支持声明式编程。如果您有使用过这些框架的经验,就会知道,编写代码后,它的执行并不是按顺序一行一行开始执行的,而是将代码翻译成计算图来执行。从某种意义上说,SQL也是一种声明式语言。
因此,大家常说Kubernetes的API是声明式的,这是什么意思呢?
这并不是说Kubernetes的API使用了非HTTP/RPC的协议,而是指它的API是声明式的。它只描述结果和终态,而不描述过程。过程交给谁了?交给Kubernetes中的控制器模式了。与前面提到的编程语言和AI框架类比,就是您编写的YAML文件被Kubernetes解析后,会以控制器模式的形式生效。举个例子,如果您的Deployment需要5个Pod,那么Kubernetes就会像一个机器人一样,始终保持5个Pod的状态。如果您将Pod数量更改为7,Kubernetes会自动调整到7个Pod。一切都按照您的指示执行。
实际上,声明式编程只是人们迈向智能化的重要一步,而不是表示没有代码。它只是将复杂性交给平台和框架处理,Kubernetes的控制器模式和面向终态的设计,则是彻底解放运维,朝着自动化和智能化的方向迈进。这对于一个平台的能力保障要求就比较高。本质上这是一种能力的转移,当机器有能力帮助你实现的时候,你就可以解放双手去做更多更高级的事情。
不可变基础设施
不可变基础设施是什么意思?
镜像让不可变成为可能,镜像使得一次编译,到处运行成为可能。镜像让发布部署变得非常方便。在传统基于虚拟机的IaaS架构中,CI/CD流程可能是通过包部署的,即代码构建后,将其下载到要发布的机器上(虚拟机或裸金属物理机),然后进行部署运行。
然而,基于Kubernetes的基础设施可以在CI/CD流程中首先将代码打包成镜像(如Docker镜像),然后使用Kubernetes的资源(如Deployment)来更新镜像,进行滚动更新以实现部署。如果您的服务有状态,自定义控制器还可以实现精细化的部署控制。
应用交付模型
现在大家都吹嘘以应用为中心的云原生概念,其目标是推进应用交付。请注意,这是应用交付,而不是容器交付。这可能是一场困难的旅程,因为从交付机器到交付应用,研发和运维人员需要进行心智的升级。为什么我说这是心智升级?我们传统的研发人员都习惯于将应用视为机器,无论他们当前使用的是容器、虚拟机还是物理机,他们的脑海中总是有机器的概念。在开发、测试和部署应用时,他们总是需要机器。
实际上,更抽象地说,我们不需要机器。开发人员在开发时,只需要一个代码编辑器,测试时只需要控制台输出日志和调试代码,部署服务只是需要将代码和环境批量复制,运行时只需可观测性指标(logging、tracing、metric),运维和弹性扩容只需要系统自动根据算法参数调整。您可能会发现,实际上不需要机器的概念。就像消费者购买个人电脑时不是为了机器本身,而是为了使用上面的软件应用一样。开发者购买服务器是为了更快、更灵活、更便捷的调试、部署和运行服务。
然而,由于许多基础设施在这方面尚未完善,如果此时完全摈弃机器的概念,只是让开发人员描述他们的需求以交付一个应用程序,那么当应用出现问题时,开发人员将无从下手。这也是Serverless目前推进较为困难的地方。
Serverless是当前最前卫的应用交付方式,其实也没有太多统一答案,该模式最大的好处是利好创业公司,特别是规模体量不大的早期创业者,围绕Serverless交付应用的创业公司不胜枚举,目标就是为开发者提供非常方便的开发、部署体验,都在不同层次上和方向(微服务、AI、大数据)进一步简化服务开发、部署、弹性、运维能力,解放开发者。
比如以Google CloudRun 为代表的Serverless模型,是一种既没有放弃镜像概念,也结合了Serverless按量计费,随时弹性的优点的Serverless交付模型。国内也有模仿者,比如 阿里云Serverless Kubernetes、腾讯云华为云超级虚拟节点等,一些创业公司搞的Serverless部署开发,都属于这类服务。这是一种在Kubernetes之上往前衍生的一小步Serverless。这种模式更灵活也更能够被开发者接受。
另一个更高阶段的Serverless就是我们熟悉的云函数,Serverless Function,开发者只需要编写函数,事件驱动的方式触发函数调用,就可以完成某些功能模块。这个应用交付模型就更加激进,其实云函数不会完全替代容器镜像交付,它只能算一个场景补充,主要原因在于,大量的应用编写并不是云函数能够完全覆盖的,所谓越是高级,必然失去灵活性,就是这个道理。
本文由 mdnice 多平台发布
相关文章:

关于Kubernetes的一些零碎想法
关于Kubernetes的一些零碎想法 容器集群管理系统与容器编排系统 很多使用Kubernetes的企业可能没有认识到Kubernetes最重要的特点。许多企业将其视为一种容器集群管理系统(container management system),只使用其管理容器的能力。然而&#x…...

C—数据的储存(下)
文章目录 前言🌟一、练习一下🌏1.例一🌏2.例二🌏3.例三🌏4.例四 🌟二、浮点型在内存中的储存🌏1.浮点数🌏2.浮点数存储💫(1).二进制浮点数&#x…...

「软件测试面试干货」2023年软件测试面试题大全(持续更新)附答案..
先卖个关子,如果你是面试官,你希望招一个什么样的人进来? 如果这个问题搞明白了,那么可以说测试岗位的面试,就变得非常轻松了。 按照一般的惯例,面试官都会让你自我介绍,介绍你的项目经验&…...

YOLOv2论文对比总结
1、高分辨率图片效果提升 2、Anchor 3、Loss函数 4、小目标友好...

数据中心机房机柜配电新模式的探讨与选型
安科瑞 华楠 摘 要:对数据中心机房列头柜配电方式特征和问题进行深入研究,分析机房末端配电安全性及可用性,主要阐述了数据中心机房机柜配电新模式。 关键词:数据中心;机房机柜;配电模式 1 原始配电方案 …...

Redis未授权访问漏洞
前言 传统数据库都是持久化存储到硬盘中,所以执行某些业务时传统数据库并不是很理想。redis等数据存储在内存中的数据库就应允而生了。基于内存的Redis读速度是110000次/s,写速度是81000次/s 。但是基于内存的缺点就是断电即失,如果服务器产生了意外…...

Python 各种进制转换
def binary_to_decimal(binary_number):#2进制转换成10进制return int(binary_number, 2) def hex_to_decimal(binary_number):#hexadecimal #16进制转换成10进制return int(binary_number, 16) def octal_to_decimal(binary_number):#8进制转换成10进制return int(binary_numb…...

关于K8s的Pod的详解(一)
关于K8s的Pod的详解(一) Pod和API server的通信加快Pod启动更改Pod的资源Pod 的持久卷的单个访问模式Pod 拓扑分布约束Pod 拓扑分布中的最小域数 Pod 作为k8s创建,调度,管理的基本单位。由上级的Controller对Node上安装的Kubelet发…...

Vue3通透教程【十六】TS编译配置
文章目录 🌟 写在前面🌟 初始化配置文件⭐ target⭐ module⭐ lib⭐ types/node⭐ include⭐ outDir🌟 写在最后 🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更…...

OpenCV系列__chapter2
这里写目录标题 1 图像加减乘除位运算1.1 加法 img cv2.add(img1, img2)1.2 减法 img cv2.subtract(img1, img2)1.3 乘法 img cv2.multiply(img1, img2)1.4 除法 img cv2.divide(img1, img2)1.5 位运算 cv2.bitwise_and() 2 图像增强2.1 线性变换2.2 非线性变换 3 图像几何…...

Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
目录 Chat GPT是什么 初学者怎么使用Chat GPT 使用Chat GPT需要注意什么 一些简单的prompt示例 Chat GPT是什么 Chat GPT是由OpenAI开发的一种大型语言模型,它基于GPT(Generative Pre-trained Transformer)架构。GPT是一种基于深度学习的…...

hcip mgre与rip实验
要求: 1.toop搭建 2.IP地址规划 R1g 0/0/1 192.168.1.1 24 s 4/0/0 188.0.0.2 24 t:10.0.0.1 24R2 s 4/0/0 188.0.0.1 24 s 4/0/1 188.0.1.1 24 s 3/0/0 188.0.2.1 24 loop0 8.8.8.8 24 t:10.0.0.2 24 R3g…...

骨传导耳机对身体有没有别的危害?骨传导耳机有什么好处?
骨传导耳机对身体有没有别的危害? 在此之前,我们先了解一下骨传导的原理:骨传导就跟它的名字一样通过骨头传声,主要是借助头部颅骨传递到听觉中枢,这种传播方式省略了直接接触耳道和耳膜。打个比方,就是我们…...

c++11/c++98动态规划入门第5课,经典DP问题 --- 区间
第1题 取数问题 查看测评数据信息 有一排N个数,你和小明2个人玩游戏,每个人轮流从2端取数,每次可以从左或右取,不能从中间取。你取的所有的数的和是你的得分,小明取的所有的数的和是小明的得分。如果你先取&#x…...

vue中重新获取数据导致页面加长,要求在页面更新之后浏览器滚动条滚动到之前浏览记录的位置。以及获取当前页面中是哪个元素产生滚动条的方法。
目前的页面样式为: 代码是: <section id"detailSection"><el-tableref"multipleTable":data"logDetailList"style"width: 650px;margin:20px auto;"id"dialogDetail":show-header"fals…...

【深度学习】日常笔记14
对神经网络模型参数的初始化方案对保持数值稳定性有很重要的作用。初始化⽅案的选择可以与⾮线性激活函数的选择有趣的结合在⼀起。 突然有感触:做习题和模拟考研就分别是训练集和验证集,考研不就是最后的测试集() p168的↓的解释…...

[JAVAee]synchronized关键字
目录 1.synchronized的特性 ①互斥性 ②可重入性 2.synchronized的使用示例 ①修饰普通方法 ②修饰静态方法 ③修饰代码块 1.synchronized的特性 ①互斥性 互斥性,就像是给门上锁了一样. 当A线程使用了被synchronized修饰的代码块并对其上锁,其他线程(B线程,C线程)想要使…...

Unity游戏源码分享-3d机器人推箱子游戏
Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏 工程地址:https://download.csdn.net/download/Highning0007/88098014...

SAAS部署模式
SAAS(Software as a Service)顾名思义,软件即服务的产品。 常见部署模式: 公有云:SAAS产品部署在公有云平台上,由SAAS提供商管理整个基础架构和应用程序。客户通过互联网访问和使用SAAS产品,无…...

11、PHP面向对象1
1、PHP的面向对象与其他语言类似,但也有不同。 PHP访问成员变量时,需要用“->”,而不能用“.”,访问成员函数时,需要用“->”,而不能用“.”。操作符“::”可以在没有任何声明实例的情况下访问类中的…...

实训笔记7.25
实训笔记7.25 7.25笔记一、MapReduce的特殊使用场景1.1 通过MapReduce程序实现多文件Join操作1.1.1 通过在Reduce端实现join操作1.1.2 通过在Map端实现join操作 1.2 MapReduce中的计数器的使用1.2.1 计数器使用两种方式 1.3 MapReduce实现数据清洗 二、MapReduce的OutputFormat…...

全方位对比 Postgres 和 MongoDB (2023 版)
本文为「数据库全方位对比系列」第二篇,该系列的首部作品为「全方位对比 Postgres 和 MySQL (2023 版)」 为何对比 Postgres 和 MongoDB 根据 2023 年 Stack Overflow 调研,Postgres 已经成为最受欢迎和渴望的数据库了。 MongoDB 曾连续 4 年 (2017 - …...

本地部署中文LLaMA模型实战教程,民间羊驼模型
羊驼实战系列索引 博文1:本地部署中文LLaMA模型实战教程,民间羊驼模型(本博客) 博文2:本地训练中文LLaMA模型实战教程,民间羊驼模型 博文3:精调训练中文LLaMA模型实战教程,民间羊驼模型 简介 LLaMA大部分是英文语料训练的,讲中文能力很弱。如果我们想微调训练自己的…...

全志F1C200S嵌入式驱动开发(spi-nor image制作)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 一般soc系统里面添加spi-nor flash芯片,特别是对linux soc来说,都是把它当成文件系统来使用的。spi-nor flash和spi-nand flash相比,虽然空间小了点,但是胜在稳定,这是很多工业…...

JSON格式Python,Java,PHP等封装图片识别商品数据API方法
淘宝是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取淘宝天猫图片识别商品数据,您可以通过开放平台的接口或者直接访问淘宝天猫商城的网页来获取图片识别商品数据。以下是两种常用方法的介绍&#…...

Vue应用案例
项目一:记事本 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8" /><title>title</title></head> <body><div id"app"><h2 >记事本</h2><input …...

GPT-3.5:ChatGPT的奇妙之处和革命性进步
🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~ἳ…...

【Hadoop 01】简介
目录 1 Hadoop 简介 2 下载并配置Hadoop 2.1 修改/etc/profile 2.2 修改hadoop-env.sh 2.3 修改core-site.xml 2.4 修改hdfs-site.xml 2.5 修改mapred-site.xml 2.6 修改yarn-site.xml 2.7 修改workers 2.8 修改start-dfs.sh、stop-dfs.sh 2.9 修改start-yarn.sh、s…...

【C++】开源:跨平台轻量日志库easyloggingpp
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍跨平台轻量日志库easyloggingpp。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&am…...

spring-websocket在SpringBoot(包含SpringSecurity)项目中的导入
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 🥭本文内容:spring-websocket在SpringBoot(包含SpringSecurity…...