Kubernates简介

2023-05-16

Kubernates简介

应用程序的开发部署变化

从单体应用到微服务

单体应用的缺点

  • 由多个彼此耦合的组件组成,开发、部署、管理必须以同一个实体进行,即使对某个组件的小修改也需要重新部署整个应用

  • 组件之间没有严格的边界定义,相互依赖,随着功能的丰富,导致系统日趋复杂,整体质量严重下降

  • 运行单体应用,需要一台能为整个单体应用提供足够资源的高性能服务器

  • 为应对不断增长的系统负荷,我们需要不断增加CPU、内存等做垂直扩展,但成本会越来越高,并且会有瓶颈

  • 增加更多运行应用程序服务器做水平扩展,但可能会需要做比较大的修改,有时甚至不可行,如果某个组件不能扩展,则整个应用不能扩展

微服务应用的优势

  • 复杂的大型单体应用拆分为小的可独立部署的微服务,微服务之间通过类似HTTP的同步通信协议通信或者通过类似AMQP这样的异步通信协议通信,每个微服务可以使用合适的语言开发

  • 改动一个微服务不需要改动或重新部署其它微服务

  • 单体系统扩容需要对整个系统,如果其中存在部分不能扩容,则可以把应用拆分成多个微服务。对于微服务而言,我们可以针对需要更多资源的服务进行扩容,而其它服务仍然保持不变。我们通常可以将能扩容的服务进行水平扩容,不能扩容的组件进行垂直扩展

微服务应用的缺点

  • 随着微服务规模的扩展,微服务数量急剧增加,部署相关的决定会变得越来越困难,不仅组件部署的组合数在增加,组件间依赖的组合数也在增加

  • 部署者需要正确的配置所有的微服务来使其作为一个单一系统能正确工作,当微服务增加时,配置工作变得冗杂并且易错

  • 跨多个进程和主机的业务代码调试变得更加困难,问题难以定位

  • 由于微服务自建的独立性,导致不同微服务很有可能是不同团队开发,因此整个系统中,对同一个库的不同版本需求是不能避免的,这对于运维人员来说是困难的,因为需要在同一个主机上部署的组件数量越大,满足这些组件的所有需求就越难

提供一致的环境

从开发到产品交付,整个流程中,我们会有很多的环境,我们总是希望不同环境是保持一致的,但现实是不同环境之间存在巨大差异,并且各个主机之间也存在差异。并且主机的环境也不是固定不变的。这些差异包括硬件到操作系统再到安装的可用库上。并且运维人员和开发人员所关注的点也不同。开发人员只关心自己负责应用的功能。而运维人员更关注多个产品的运行维护及系统环境的更新,不同产品之间依赖的组件库也可能会有冲突

为减少到生成环境才暴露的问题,我们总是希望让应用运行的开发环境和生成环境是一样的,包括操作系统、库、系统配置、网络环境等,并且也不会随时间的推移而发生变化。最好是新部署的其它应用产品对之前已有的产品不会造成任何影响

持续交付:DevOps+无运维

在之前,开发团队只负责创建应用并交付运维团队,运维团队则负责部署应用并使之持续运行。但现在会让开发团队负责产品的开发、部署、运维整个生命周期这种实践被称为DevOps

DevOps持续交付的优点

  • 让开发者在生成环境中运行应用,使对用户的需求和问题,及运维团队维护应用面临的困难有更好的理解

  • 开发者趋向于将应用尽快发布上线,通过收集用户反馈来对应用做进一步优化开发,快速响应用户变化

  • 开发人员需要能自己部署应用上线,不需要交付给运维人员。但部署需要具备对数据中心和底层设备及硬件架构的理解,但开发人员通常不知道也不愿意去知道

让擅长的人做擅长的事

开发人员:擅长创造新的功能、提升用户体验,但不擅长更新系统,维护系统及网络等工作

运维人员:擅长管理系统硬件设备、系统安全、使用率等。但不擅长处理所有应用组件之间的内部依赖关系,操作系统、基础设施改变对应用程序的影响

NoOps: 理想情况下开发人员部署应用程序本身,不关注也不需要知道基础设施的任何情况,无需和运维团队交涉

Kubernetes能让我们上面的愿景成为现实。通过对基础设施抽象,成一个K8S平台,用户部署、运行应用程序,只需要通过K8S即可,不需要系统管理员任何帮助。而系统管理人员也能专注于底层基础设施的正常运转而无需关注之上的应用程序

容器技术

在同一台机器上运行的不同应用,可能需要不同的、存在冲突的依赖版本,或者其它不同的环境需求。当只是少数的大应用时,我们可以通过在同一台主机上部署多个虚拟机来隔离不同应用的不同需求。但当大的单体服务微服务化后,急剧增加的微服务将不能再使用虚拟机方式隔离部署,因为虚拟机不仅运行应用进程,还有额外的系统进程,这将浪费掉大量硬件资源,并且每个虚拟机单独配置管理也加大了运维人员的负担

Linux容器技术

随着微服务数量的增加,同一台主机上部署多个微服务正在转向使用Linux容器技术。同一台主机上可以运行多个容器,每个容器提供隔离的不同的环境,但相对于虚拟机,其消耗的资源要小很多

容器中的进程实际上是在宿主主机的操作系统上运行,但和其它进程是隔离的,就像只有容器中的进程在操作系统上运行。通过容器技术部署应用不会有其它进程的额外开销,资源的消耗都是应用产生的。但由于都是使用的同一个系统内核,会有安全隐患

Linux容器隔离机制

容器隔离通过两个机制实现:

  • Linux命名空间:通过命名空间可以使进程只能看到自己的系统视图(文件、进程、网络接口、主机名等)

  • Linux控制组(cgroups):通过控制组可以限制进程使用的资源(CPU、内存、网络带宽等)

Linux命名空间

默认Linux只有一个命名空间,所有系统资源都属于这个命名空间。但我们可以创建其它命名空间,并且命名空间是有类型的,一个进程可以属于每个类型的一个命名空间,分派给进程不同类型的命名空间,进程将只能看到改种类型命名空间限制的资源,命名空间分类如下

  • Mount(挂载)

  • Process ID (pid)

  • Network (net)

  • Inter-process communicaion(ipd)

  • UTS

  • User ID (user)

Linux控制组

cgroups是一个Linux内核功能,被用来限制一个进程或一组进程的资源使用,不能超过分配的量

Docker容器平台

容器技术已经出现了很久,但随着Docker容器平台的出现,容器技术才得到普遍应用。Docker是第一个使容器能在不同机器上移植的系统。Docker简化了打包应用的流程,也简化了打包库和依赖,并且可以打包整个操作系统的文件系统,并且可以被运行在任何其它运行Docker的机器上

镜像层

Docker容器镜像是分层的,由多层构建而成,能在多个镜像之间共享和征用。如果已经下载的镜像包含了后面下载镜像的某些层,那后面下载的镜像就无需再下载这些层。通常情况下我们制作镜像是都是基于某个基础镜像制作,而我们也可以自己制作的镜像也有可能会被其它镜像依赖构建,因此不同的镜像可能使用相同的父镜像。由于镜像的分层使得镜像的分发效率得到提升

镜像分层也有助于减少镜像的存储空间。每一层仅会被存储一次。基于相同基础镜像被创建的两个容器,能读到相同的文件,但如果某个容器写入了某些文件,另一个容器无法看见这些变化。因此虽然是共享相同的文件,但彼此又是隔离的。因为容器镜像是只读的,当容器运行时一个新的可写层在镜像之上被创建,容器中进程写入位于底层的文件时,此文件的一个拷贝在顶层被创建,进程写的是拷贝

容器镜像可移植性限制

理论上说一个镜像能运行在任何一个运行Docker的机器上,但实际上存在如下两个限制

  • 内核版本:运行在一台机器上的所有容器共享主机的Linux内核。如果一个容器化应用需要一个特定的Linux内核版本,但所要运行的目标主机内核版本不匹配或没有相同的内核模块可用,则不能在其上运行

  • 硬件架构:在特定硬件架构上编译的容器应用,只能在有相同硬件架构的机器上运行。不能期望一个在x86架构上编译的应用容器镜像,又能在ARM架构的机器上运行

Kubernetes

随着可部署组件的增长,管理这些组件的部署将变的越来越困难。我们需要一种更好的方式来管理和部署这些组件。而Kubernetes就是这样的软件系统,其可以管理数以千计的主机,并对这些基础设施抽象,提供统一的操作入口。用户可以通过Kubernetes部署、管理组件,而不用关心组件会部署到那个主机上,并且通过Linux的容器技术,实现部署应用的隔离性。Kubernetes成了云"操作系统"在这里插入图片描述

Kubernetes集群架构

在硬件上一个Kubernetes集群由多个节点组成,这些节点可以分成如下两类

  • 主节点:控制和管理整个集群系统的控制面板

  • 工作节点:运行用户实际应用
    在这里插入图片描述

控制面板

控制面板用于控制集群并使集群能正常运行。其包含多个组件,这些组件既可以运行在单个主节点上,也可以通过副本运行在多个主节点上,实现高可用。他们不会运行用户的应用程序,只用于控制集群状态。包含的组件如下

  • Kubernetes API服务器:提供HTTP API,以供用户、集群中的不同组件和集群外的组件交互,并切可以通过API查询、操作Kubernetes API中的对象

  • Scheduler调度器:调度用户应用(pod)到适合的节点

  • Controller Manager控制器管理器:守护进程,永无休止的循环,用于调节系统状态,每个控制器是一个控制回路,通过API服务器监视集群的共享状态,并尝试更改以将当前状态转为期望状态。自带的控制器包括副本控制器、节点控制器、命名空间控制器、服务账号控制器等

  • etcd键值存储:一个可靠的分布式数据存储,能持久化存储集群配置

工作节点

运行容器化应用的机器。运行、监控和管理应用服务的任务由下面组件完成

  • Docker、rtk或其他的容器类型

  • Kubelet:与API服务器通信,管理所在节点的容器,在每个节点上运行

  • Kubernetes Service Proxy(kube-proxy):负责组件之间的负载均衡网络流量,在每个节点上运行

Kubernetes中运行应用

要在Kubernetes中运行应用,我们需要进行如下步骤

  • 基于应用制作镜像,并将镜像推到镜像仓库

  • 编写Kubernetes部署应用所需的描述文件,通过声明式的配置,描述Kubernetes需要使用什么镜像及其他配置需求来创建Pod部署应用容器

  • 将声明式的描述文件发布到Kubernetes,Kubernetes将按用户的期望配置,完成应用的部署

从声明式文件到运行的应用容器

在这里插入图片描述
API服务器处理应用声明式描述时,调度器根据描述的资源需求,及每个节点未分配资源情况,调度指定组的容器(pod)到可用的工作节点上。节点上的Kubelets将告诉Docker拉取镜像运行容器

保持容器运行

Kubernetes会不断确认应用程序的部署状态是否与用户描述文件期望的状态一致,如果不一致,会不断尝试将部署状态调整到一致。例如用户描述文件中需要运行5个应用实例,如果运行的应用实例容器没有达到5个,Kubernetes将启动新的应用容器,直到达到5个。当工作节点死亡或丢失时也会在其它可用节点上重新补齐丢失掉的应用容器

Kubernetes带来的价值

简化应用程序部署

Kubernetes将所有工作节点抽象为一个部署平台,开发人员可以基于Kubernetes方便的部署应用,而无需关注底层基础设施。当然对于关注节点基础设施的应用Kubernetes也提供了方便的属性,可以设置应用在具有某些特性的节点上运行。例如某个应用程序需要在SSD基础设施的节点上运行,可以通过给节点打上SSD的标签,用户在应用程序的描述文件中指定在具有SSD标签的节点上运行,Kubernetes在调度应用程序pod时将只会调度到SSD标签的节点上

硬件利用率更高

通过声明式的描述文件,可以告诉kubernetes应用需要的资源限制,kubernetes可以根据应用的资源限制及节点剩余资源情况、节点特性做出最优调度

健康检查与自修复

Kubernetes监控应用程序和节点,当节点出现故障时,会自动将应用重新调度到其它可用节点

自动扩缩容

借助kubernetes的HPA资源,自动根据应用CPU利用率、内存使用情况及自定义的指标进行自动扩容缩容,即能节约资源消耗,也能在高峰时自动扩容保持高可用

升级回滚

Kubernetes提供了升级回滚的机制,当发布的新版本有问题时可以自动回滚。当遇到新版本有问题时我们也可以方便的回滚到历史版本。

统一的环境

应用程序开发环境和正式环境是一样的,这样更利于我们尽早发现问题,解决问题的代价也最小。越往后面发现的问题解决的代价也越大

提供统一的解决方案

提供了DNS查询、服务发现等支持,配合Istio更是可以做到无侵入的实现熔断、限流等特性,而无需用户编写业务代码实现

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernates简介 的相关文章

  • 利用String类制作简单的网络爬虫

    网络爬虫 网络爬虫 xff08 又被称为网页蜘蛛 xff0c 网络机器人 xff0c 在FOAF社区中间 xff0c 更经常的称为网页追逐者 xff09 xff0c 是一种按照一定的规则 xff0c 自动地抓取万维网信息的程序或者脚本 另外
  • 令人头大的单片机延时----这里转一篇关于延时函数的文章看看

    标题 xff1a 转 关于nop 函数 2011 02 11 23 49 29 nop函数可以用来延时 xff0c 请问1个NOP延时多少时间 xff0c 怎么计算 xff1f 附一段说明 xff1a void nop void A NOP
  • Java----File类详解

    File类 Java中所有的目录都被当成File 对待 xff0c 它直接处理文件和文件系统 也就是说 xff0c File类没有指定信息怎样从文件读取或向文件存储 xff1b 它描述了文件本身的属性 File对象用来获取或处理与磁盘文件相
  • UEditor在JavaWeb中的应用

    富文本编辑器 xff08 UEditor xff09 在平时开发Java Web项目的时候 xff0c 往往会使用第三方插件来帮助我们更快的实现功能 这里教大家使用百度开源的富文本编辑器 xff08 UEditor xff09 来帮助我们更
  • DataTables入门

    DataTable是什么 xff1f Datatables是一款jquery表格插件 它是一个高度灵活的工具 xff0c 可以将任何HTML表格添加高级的交互功能 分页 xff0c 即时搜索和排序几乎支持任何数据源 xff1a DOM xf
  • Redis-cli客户端的使用

    启动Redis客户端 进入src目录启动Redis客户端 xff08 前提是先启动Redis Server xff09 redis span class hljs keyword cli span 测试存储数据 span class hlj
  • Node.js简介

    Node js概述 Node js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 Node js 使用了一个事件驱动 非阻塞式 I O 的模型 xff0c 使其轻量又高效Node js 的包管理器 npm xff0
  • 安装Node.js

    Node js安装包及源码下载地址为 xff1a https nodejs org en download Node js 历史版本下载地址 xff1a https nodejs org dist Window 上安装Node js 32
  • 使用Node.js快速创建web服务

    步骤一 引入 required 模块 span class hljs keyword var span http 61 span class hljs built in require span span class hljs string
  • okhttpUtil信任所有证书

    使用okhttp调用https信任所有证书工具类 请求示例 xff1a 结果 xff1a Caused by span class token operator span javax span class token punctuation
  • 从实际性能剖析,为什么MEMS激光雷达才是未来主流?

    车规级激光雷达的技术路线之争 xff0c 似乎已经逐渐明朗 高工智能汽车 注意到 xff0c 目前 xff0c 包括Innoviz以及国内一径科技 速腾聚创等越来越多的厂商先后推出了车规级MEMS激光雷达 另外 xff0c 需要特别注意的是
  • C++之STL

    定义 STL xff08 Standard Template Library xff09 xff0c 即标准模板库 xff0c 是一个具有工业强度的 xff0c 高效的C 43 43 程序库 它被容纳于C 43 43 标准程序库 xff08
  • C语言之strpbrk函数

    该函数的头文件为 include lt string h gt xff0c 其作用是比较字符串str1和str2中是否有相同的字符 xff0c 如果有 xff0c 则返回该字符在str1中的最先出现的位置的指针 其函数原型如下 xff1a
  • Vb.NET与VB6.0的区别

    Visual Basic NET是Microsoft Visual Studio NET套件中主要组成部分之一 NET版本的Visual Basic增加了更多特性 xff0c 而且演化为完全面向对象 xff08 就像C 43 43 xff0
  • STM32学习--GPIO(寄存器)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 一 GPIO是什么 xff1f 二 引脚GPIO的输入输入框图输入模式作用 GPIO的输入输入框图输入模式作用 GPIO特性GP
  • c#找到网站中的照片

    c 下载图片 一 过程截图 开始 xff1a 正在下载 下载结束 下载成功了 xff01 xff01 xff01 二 代码实例 代码如下 xff08 示例 xff09 xff1a public delegate span class tok
  • linux同时连接有线无线上网问题

    起因 xff1a linux同时连接有线和无线网时 xff0c 希望用有线连内网组网 xff0c 如OAI EPC组网 xff0c 用无线访问外网 xff0c 但是默认会优先用有线 解决 xff1a 所以设置限制 xff0c 只允许目标地址

随机推荐

  • WK2114(一个异步串口UART 扩展为4个串口UART)

    WK2114是UART接口的4通道UART器件 WK2114将一个标准3线异步串口 xff08 UART xff09 扩展成为4个增强 功能串口 xff08 UART xff09 主接口UART在数据传输时主接口的UART可以通过引脚配置为
  • sql解析:获取Select字段

    https blog csdn net github 26672553 article details 100048506 前面已经了解这个解析sql的第三方库 继续深入学习 比如我们要获取到select查询语句中的字段id name ag
  • go协程池

    编写代码实现了一个计算随机数的每个位置数字之和的程序 要求使用goroutine和channel构建生产者和消费者模式 可以指定启动的goroutine数量 woker pool模式 在工作中我们通常使用workerpool模式 控制gor
  • select多路复用

    在某些场景下我们需要同时从多个通道接收数据 通道在接收数据时 如果没有数据可以接收发生阻塞 你也许会写出代码使用遍历的方式来实现 span class token keyword for span span class token punc
  • 并发安全和锁

    有时候在Go代码中可能会存在多个goroutine同时操作一个资源 xff0c 这种情况会发生数据竞态问题 举例 xff1a var x int64 var wg sync WaitGroup func add for i 61 0 i l
  • 解决import torch 报错:Failed to load image Python extension: warn(f“Failed to load image Python extens

    配置yolov5 下载地址 xff1a torch 和 torchvision的 下载完之后发现import torch没问题 但是import torchvision报错了 查阅资料原来是版本对不上 7条消息 PyTorch碎片 xff1
  • Mac电脑 - “USB 10/100 LAN”的电缆可能未插好,或另一端的设备没有响应。

    Mac突然就无法上网了 有可能装个驱动就好了 xff0c 前提是确保你的网卡芯片是realtek的 解决方法 xff1a 下这个驱动 xff0c 就好了
  • show engine innodb status解读

    注 xff1a 以下内容为根据 高性能mysql第三版 和 mysql技术内幕innodb存储引擎 的innodb status部分的个人理解 xff0c 如果有错误 xff0c 还望指正 xff01 xff01 innodb存储引擎在sh
  • Vuex速学篇:(1)基本套路

    我们前面做了一个这样的页面 xff0c 为了增加我们的学习难度 xff0c 我们特意拆分成了不同的组件 我们知道 xff0c 我们在子组件里并不能直接对兄弟组件里的属性进行操作 xff0c 我们通过this emit 调用父组件的方法 xf
  • ElementUI案例演示:导航、布局、加载动画

    知识点 1 vue router之嵌套路由 http router vuejs org zh cn essentials nested routes html 2 element ui 导航组件 布局组件 加载动画 http element
  • ElementUI之表单验证、数据绑定、路由跳转

    1 新建表单组件el form vue span class hljs tag lt span class hljs title template span gt span span class hljs tag lt span class
  • vue-router: 嵌套路由

    模板抽离 我们已经学习过了Vue模板的另外定义形式 xff0c 使用 lt template gt lt template gt span class hljs comment lt 模板抽离出来 gt span span class hl
  • react.js的两种路由方式:HashRouter

    react js路由 初步 前面我们已经了解了react js其中一种路由方式 这种方式是利用 html5的 span class hljs escape 96 w span indow history span class hljs es
  • 入手python绘图包:matplotlib,画直线、画抛物线

    入手python绘图包 xff1a matplotlib 官方地址 xff1a http matplotlib org github地址 xff1a http github com matplotlib matplotlib 学习一款图形化
  • 使用CMake构建OpenCV项目

    上一篇文章中 xff0c 我们介绍了如何在ubuntu上安装配置OpenCV xff0c 这篇文章我们来对我们的安装进行测试 xff0c 并介绍如何用CMake工具快捷地构建OpenCV项目 项目结构 为了使整个项目更加条理 xff0c 我
  • Ubuntu连接不了网络的解决方法亲测可行经验

    突然发现Ubuntu连不上网络 xff0c 网络打问号或者右上角也没有网络图标 xff1b 楼主一般通过前两步就解决了 xff0c 大家自行查阅网络服务名称 xff0c OK直接进入正题 通过命令行方式重启网络 如果你使用的 Ubuntu
  • 解决 ImportError: C extension: No module named ‘pandas._libs.tslib‘ not built.

    yolo配置 报错 nvidia 64 nx yolov5 master python3 detect py Traceback most recent call last File 34 usr lib python3 dist pack
  • python subprocess获取stdout和stderr

    本文转载自http www firefoxbug com index php archives 2419 xff0c 如有版权问题请联系博主删除 用subprocess的时候 xff0c 怎么获取stdout和stderr xff1f 下面
  • 关于Libcurl双向认证请求https

    之前通过libcurl开发只是做http请求 xff0c 这次公司项目需要请求https xff0c 所以就研究了一下 xff0c 其实用libcurl做http请求是非常简单的 xff0c 所有底层实现都被封装到了libcurl里面 xf
  • Kubernates简介

    Kubernates简介 应用程序的开发部署变化 从单体应用到微服务 单体应用的缺点 由多个彼此耦合的组件组成 开发 部署 管理必须以同一个实体进行 即使对某个组件的小修改也需要重新部署整个应用 组件之间没有严格的边界定义 相互依赖 随着功