程序员修神之路--kubernetes是微服务发展的必然产物

菜菜哥,我昨天又请假出去面试了

战况如何呀?

多数面试题回答的还行,但是最后让我介绍微服务和kubernetes的时候,挂了

话说微服务和kubernetes内容确实挺多的

那你给我大体介绍一下呗

可以呀,不过要请和coffee哦

◆◆

kubernetes介绍

◆◆

在很多项目的发展初期,都是小型或者大型的单体项目,部署在单台或者多台服务器上,以单个进程的方式来运行。这些项目随着需求的递增,发布周期逐渐增长,迭代速度明显下降。传统的发布方式是:开发人员将项目打包发给运维人员,运维人员进行部署、资源分配等操作。

随着软件行业架构方式的改变,这些大型的单体应用按照业务或者其他维度逐渐被分解为可独立运行的组件,我们称之为微服务。微服务彼此之间被独立开发、部署、升级、扩容,真正实现了大型应用的解耦工作。关于微服务的介绍,大家可以去撸一下菜菜之前的文章:

程序员修神之路--要想做好微服务架构,并非易事!!

程序员修神之路--为什么我会了SOA,你们还要逼我学微服务?

软件开发行业就是这样奇葩,每一个问题被解决之后总是伴随着另外的问题出现,就像程序员改bug,为什么总有改不完的bug,真的很令人头大!!!

微服务虽然解决了一些问题,但是随着微服务数量的增多,配置、管理、扩容、高可用等要求的实现变的越来越困难,包括运维团队如何更好的利用硬件资源并降低服务器成本,以及部署的自动化和故障处理等问题变得原来越棘手。

以上问题正是kubernetes要解决并且擅长的领域,它可以让开发者自主部署应用,自主控制迭代的频率,完全解放运维团队。而运维团队的工作重心从以往的服务器资源管理转移到了kubernetes的资源管理。kubernetes最厉害之处是对硬件基础设施进行了封装和抽象,使得开发人员完全不用去了解硬件的基础原理,不用去关注底层服务器。kubernetes内部把设置的服务器抽象为资源池,在部署应用的时候,它会自动给应用分配合适合理的服务器资源,并且能够保证这些应用能正常的和其他应用进行通信。一个kubernetes集群的大体结构如下:

那kubernetes有哪些具体优势呢?能说下不?

再加一杯coffee?

◆◆

kubernetes优势

◆◆

微服务虽好,但是数量多了就会有量带来的问题。随着系统组件的不断增长,这些组件的管理问题逐渐浮出水面。首先我们要明白kubernetes是一个软件系统,它依赖于linux容器的特性来管理组件(kubernetes和容器并非一个概念,请不要混淆)。通过kubernetes部署应用程序时候,你的集群无论包含多少个节点,对于kubernetes来说不会有什么差异,这完全得益于它对底层基础设置的抽象,使得数个节点运行的时候表现的好像一个节点一样。

自动扩容

在kubernetes系统中,它可以对每个应用进行实时的监控,并能根据策略来应对突发的流量做出反应。例如:在流量高峰期间,kubernetes可以根据各个节点的资源利用情况,进行自动的增加节点或者减少节点操作,这在以前的传统应用部署方式中是不容易做到的。

简化部署流程

以往的传统应用发布的时候,需要开发人员把项目打包,并检查项目的配置文件是否正确,然后发给运维人员,运维人员然后把线上的应用版本备份,然后停止服务进行更新。在kubernetes中,我们多数情况下只需要一条指令或者点击一个按钮,就可以把应用升级到最新版本,而且升级的过程中还可做做到不间断服务。当然整个的流程还涉及到容器的操作,本次这里不再做过多介绍。

但是这里有一个意外情况,如果kubernetes集群中存在不同架构CPU的服务器,而你的应用程序是针对特定CPU架构的软件,可能需要在kubernetes中指定节点去运行你的应用程

提高服务器资源的利用率

传统应用部署的时候,多数情况下总会把资源留有一定的比例来作为资源的缓冲,来应对流量的峰值,很少有人把单个服务器资源利用率提高到90%以上,从服务器故障的概率来说,服务器资源使用率在90%要比50%高很多,而且服务器一旦出现故障,都是运维人员来解决问题和背锅,所以传统的物理机或者虚拟机部署应用的方式,硬件的资源利用率相比较来说是比较低的。

而kubernetes对集群的管理由于抽象了底层硬件设施,所以已经将应用程序和基础设施分离开来。当你告诉kubernetes运行你 应用程序时,它会根据程序的资源需求和集群内每隔节点的可用资源情况选择合适的节点来运行。而且通过容器的技术,可以让应用程序在任何时间迁移到集群中的任何机器上。而对于服务器选择的最优的组合,kubernetes比人工做的更好,它会根据集群中每台服务器的负载情况来把硬件利用率提高到最高。

自动修复

在传统的应用架构中,如果一台服务器发生故障,那么这台服务器上的应用将会全部down掉,多数情况下需要运维人员去处理,这也是为什么运维人员需要7*24小时随时待命的一个重要原因。相信你也曾看到过因为半夜故障运维人员骂娘的情景。在kubernetes中,它监视并管理着所有的节点和应用,在节点出现故障的时候,kubernetes可以自动将该节点上的应用迁移到其他健康节点,并将故障节点在资源池中排除。如果你的kubernetes集群基础设施有足够的备用资源来支撑系统的正常运行,运维人员完全可以拖延到正常的工作时间再处理故障,让程序员和运维人员过一下965的工作节奏。

这点有点像Actor模型的设计理论,提倡的是任其崩溃原理。

一致的运行环境

无论你是开发还是运维人员,在传统的部署方案中,总会有运行环境差异性的烦恼,这样的差异性大到每个服务器的差异,小到开发环境、仿真环境、生产环境,而且每个环境的服务器都会随着时间的推移而变化。我相信你一定遇到过开发环境程序运行正常,生产环境却异常的情况。这种差异性不仅仅是因为生产环境由运维团队管理,开发环境由开发者管理,更重要的这两组人对系统的要求是不同的,运维团队会对线上生产环境定时的打补丁,做安全监测等操作,而开发者可能根本就不会吊这些问题。除此之外,应用系统依赖的第三方库可能在开发、仿真、生产环境中版本不同,这样的问题反正我是遇到过。

而kubernetes采用的容器技术,在把应用打包的时候,运行环境也一起被打入包中,这就保证了相同版本的容器包(镜像)在任何服务器上都有相同的运行环境

kubernetes原来有这么优势,那我得好好学学了

虽然kubernetes优势很多,但是入门门槛比较高,而且在个别情况下反而不合适

kubernetes要求开发人员对容器技术和网络知识有一定了解,所以是否采用kubernetes要根据团队的综合技能和项目斟酌使用,并不是所有项目采用kubernetes都有利

END

●程序员修神之路--有状态的服务其实可以做更多的事情

●程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁

●程序员修神之路--设计一套RPC框架并非易事

●程序员过关斩将--要想获取我的用户信息,就得按照规矩来

●程序员过关斩将--更加优雅的Token认证方式JWT

●程序员过关斩将--cookie和session的关系其实很简单

●程序员修神之路--用NOSql给高并发系统加速

●程序员修神之路--高并发系统设计负载均衡架构

●程序员修神之路--做好分库分表其实很难之一(继续送书)

●程序员修神之路--做好分库分表其实很难之二(送书继续)

●程序员过关斩将--你为什么还在用存储过程?

●程序员过关斩将--小小的分页引发的加班血案

●程序员修神之路--问世间异步为何物?

●程序员修神之路--提高网站的吞吐量????

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础知识——Java数组详解

数组是一种数据结构,用来存储同一类型值的集合,可以存储基本数据类型和类。 数组的大小是固定的,通过一个整型下标(从0开始)可以访问数组中的每个值。此外,Java会对数组进行边界检查,如果发现有…

.NET core3.0 使用Jwt保护api

摘要:本文演示如何向有效用户提供jwt,以及如何在webapi中使用该token通过JwtBearerMiddleware中间件对用户进行身份认证。认证和授权区别?首先我们要弄清楚认证(Authentication)和授权(Authorization&#…

Java ArrayList的实现原理详解

ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解。 (Java1.8源码:http://docs.oracle.com/javase/8/docs/api/) 一、ArrayList实现原理总结 ArrayList的实现原…

.NET开发者的机遇与Web Blazor基础(有彩蛋)

一.唠唠WebAssembly的发展历程目前有很多支持WebAssembly的项目,但发展最快的是Blazor,这是一个构建单页面的.NET技术,目前已经从Preview版本升级到了beta版本,微软计划在2020年5月发布Blazor的第一个版本。Blazor是什么&#xff…

Java LinkedList的实现原理详解

LinkedList是Java List类型的集合类的一种实现,此外,LinkedList还实现了Deque接口。本文基于Java1.8,对于LinkedList的实现原理做一下详细讲解。 (Java1.8源码:http://docs.oracle.com/javase/8/docs/api/&#xff09…

知乎高赞:中国有哪些不错的开源软件产品?

点击蓝字“dotNET匠人”关注我哟加个“星标★”,每日 7:15,好文必达!在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?”事实上,还不少呢~…

Java LinkedList双向链表源码分析

LinkedList就传说中的双向链表了。是List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方…

容器日志管理 (2) 开源日志管理方案 ELK/EFK

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。上一篇《容器日志管理(1)》中介绍了Docker自带的logs子命令以及其Logging driver,本篇将会介绍一个流行的开源日志管理方案ELK/EFK…

Java ArrayList、LinkedList和Vector的使用及性能分析

第1部分 List概括 List 是一个接口,它继承于Collection的接口。它代表着有序的队列。 AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。 AbstractSequentialList 是一个抽象类…

关于Scrum起源,读这一篇论文就足够啦!《新新产品开发游戏》

关于Scrum的起源,我们经常会提到1986年发表在HBR上的一篇论文,《The New New Product Development Game》,今天我们把它重新翻译,一起重温为何Scrum会如此设置3355?为何会用橄榄球的术语来代表Scrum?The Ne…

Java HashMap的实现原理详解

HashMap是Java Map类型的集合类中最常使用的,本文基于Java1.8,对于HashMap的实现原理做一下详细讲解。 (Java1.8源码:http://docs.oracle.com/javase/8/docs/api/) 一、HashMap实现原理总结 HashMap的实现原理总结如下…

ASP.NET Core快速入门(第5章:认证与授权)--学习笔记

点击蓝字关注我们课程链接:http://video.jessetalk.cn/course/explore良心课程,大家一起来学习哈!任务31:课时介绍1.Cookie-based认证与授权2.Cookie-based认证实现3.Jwt认证与授权介绍4.Jwt认证与授权实现5.Jwt认证与授权6.Role …

Java HashSet的实现原理详解

HashSet是Java Map类型的集合类中最常使用的,本文基于Java1.8,对于HashSet的实现原理做一下详细讲解。 (Java1.8源码:http://docs.oracle.com/javase/8/docs/api/) 一、HashSet实现原理总结 HashSet的实现原理总结如下…

asp.net mvc 自定义 pager 封装与优化

asp.net mvc 自定义 pager 封装与优化Intro之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自定义分页 pager 越来越容易扩展了…

Java LinkedHashMap的实现原理详解

1. LinkedHashSet概述: LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此实现与HashSet的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序…

.net core 中通过 PostConfigure 验证 Options 参数

.net core 中通过 PostConfigure 验证 Options 参数Intro在 .net core 中配置项推荐用 Options 来实现,有一些参数可能必须是用由用户来配置,不能直接写成默认值的参数,这样就需要就 Options 中的参数做一些校验,否则程序内部可能…

Spring配置错误java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataS

在对Spring数据源dataSource配置之后,运行程序出现如下错误: java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy 原因是项目没有导入spring-jdbc的jar包。 如果使用maven,可以直接在pom…

.NET做人脸识别并分类

前言在游乐场、玻璃天桥、滑雪场等娱乐场所,经常能看到有摄影师在拍照片,令这些经营者发愁的一件事就是照片太多了,客户在成千上万张照片中找到自己可不是件容易的事。在一次游玩等活动或家庭聚会也同理,太多了照片导致挑选十分困…

Java连接Mysql数据库警告:Establishing SSL connection without server's identity verification is not recommend

Java使用mysql-jdbc连接MySQL出现如下警告: Establishing SSL connection without servers identity verification is not recommended. According to MySQL 5.5.45, 5.6.26 and 5.7.6 requirements SSL connection must be established by default if explicit opt…

.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端

.NET Core ❤ gRPC千呼万唤的 .NET Core 3.0 终于在 9 月份正式发布,在它的众多新特性中,除了性能得到了大大提高,比较受关注的应该是 ASP.NET Core 3.0 对 gRPC 的集成了。它的源码托管在 grpc-dotnet 这个 Github 库中,由微软 .…