DevOps的探索?(篇四)

262 阅读8分钟

上文传送门

juejin.cn/post/715067… DevOps的探索(篇三)

分布式

上文我们了解了Jenkins的工作原理及其使用方法,并且解决了如何高效真正地沟通开发团队,测试团队,运维团队。本文我们来探索一个问题,在团队中各个成员频繁的使用Jenkins来构建测试部署,是该依次排队,还是该通过什么方法来节省Jenkins服务器的压力?实际上,Jenkins已经有了对应的解决策略,那就是Master/Slave机制,下面就让我们来一起了解下Master/Slave机制的原理以及优缺点。

Master/Slave

Master/Slave相当于Server和agent的概念,Master提供web接口让用户来管理Job和Slave,Job可以运行在Master本机或者被分配到Slave上运行。一个Master可以关联多个Slave用来为不同的Job或相同的Job的不同配置来服务。Jenkins的Master/Slave机制除了可以并发的执行构建任务,加速构建以外。还可以用于分布式自动化测试,当自动化测试代码非常多或者是需要在多个浏览器上并行的时候,可以把测试代码划分到不同节点上运行,从而加速自动化测试的执行。

image.png

Master: Jenkins主服务器。主要是处理调度构建作业,把构建分发到Slave节点实际执行,监视Slave节点的状态。当然,aster节点在空闲时也会去执行任务。构建结果和构建产物最后还是传回到Master节点。

Slave: 执行机。执行Master分配的任务,并返回任务的进度和结果。

Master向Slave:管理slave,并分配调度任务;Slave向Master:反馈slave状态(空闲或忙碌),反馈任务进度和结果等。常用的Master和Slave节点通信连接的方式是SSH或JNLP。通过SSH或JNLP通信连接的区别在于,对于Slave Node是linux系统,通过SSH连接最为方便,但这个的前提是Master和Slave之前能进行SSH连接。JNLP连接有个好处就是不需Master和Slave之间能够SSH连接,只需能ping即可。Slave Node是windows的话,通过JNLP连接非常轻松,因为会有一些权限或者防火墙的原因,导致Master和Slave不能够SSH连接,但是,如果Master和Slave Node之间通过JNLP连接,在Node出现故障问题时,Master是无法操纵Node进行自动重启,需要用户手动查看日志并且重新启动并连接。

读到这里,大家应该对Jenkins的传统分布式有所了解。但是Master/Slave存在很多缺陷,Master节点发生单点故障时,整个流程都将瘫痪;每个Slave节点的配置环境不同,因为要完成不同语言的构建测试等自动化流程,这些不同的各个Slave节点的配置导致管理起来非常不方便,维护起来也是非常麻烦;资源分配也不是最优最均衡,会经常出现有的Slave节点要运行的job出现排队等待,而有的Slave节点处于空闲状态;会存在资源浪费问题,当Slave节点空闲时,并不会完全释放掉Slave节点资源。那么,这些问题该如何解决呢?由此我们引入一个解决方案,那就是k8s+docker+jenkins。下面我们一起来了解一下k8s。

k8s

image.png Kubernetes,也被称为K8s或Kube,是谷歌推出的业界最受欢迎的容器编排器。本文我们先简单了解下k8s的基本概念,以便于大家能清晰地明确k8s+docker+jenkins区别于jenkins传统的Master/Slave的优势。在开始学习k8s之前,让我们对容器,容器引擎和容器编排有一个基本的了解。

一个容器镜像是一个可运行的软件包,其中包含了一个完整的可执行程序,包括代码和运行时需要应用、系统库和全部重要设置的默认值。应用程序通过使用容器与底层的宿主机架构解耦。容器引擎允许你绑定和运行一个应用在一个容器里,这是一个松散隔离的环境。由于隔离性和安全性,你可以在一台主机上操作多个容器。容器引擎利用了操作系统的内核资源隔离特性,可以在同一个操作系统上运行多个容器。人们通常把容器引擎比作虚拟机(VMs)。容器编排与容器的生命周期管理相关,特别是在大型动态环境中。软件团队用容器编排器来控制和自动化容器管理的各种任务。容器编排器可以工作在使用容器的任何环境。它可以帮助你在多个环境中部署相同的程序,而不需要重新编写它。容器编排技术提供了一个控制容器和微服架构的框架。容器生命周期管理可以通过各种容器编排器解决方案来实现,Kubernetes、Docker Swarm和Apache Mesos是三种常见的解决方案/编排工具。与其他工具相比,K8s凭借其各种优势和功能特性在行业占据主导地位。

K8s使部署和管理微服务架构应用程序变得很简单。它通过在集群之上形成一个抽象层来实现这一点,允许开发团队平滑地部署应用程序,而 K8s主要处理以下任务:

  • 控制和管理应用程序对资源的使用
  • 自动负载均衡应用程序的多个实例之间请求
  • 监控资源使用和资源限制,为了可以自动阻止应用消耗过多的资源并且可以再次恢复它们
  • 如果主机资源耗尽或主机死机,将应用程序实例从一台主机迁移到另一台主机是一个可行的选项
  • 当有新的主机加入集群时,新增加的额外资源可以被自动使用

k8s的架构:

image.png K8s是一个架构良好的分布式系统的例子。它将集群中的所有机器都视为单个资源池的一部分。K8s与其他成熟的分布式系统一样,有两层:头节点和工作节点。头节点或主节点由控制面和工作节点应用程序组成。一个K8s集群由许多头节点和工作节点组成。### 控制平面

控制平面是管理员和用户管理不同节点的地方。它通过HTTP调用接收命令或者连接到系统并且运行命令行脚本。顾名思义,它控制了K8s与应用程序的交互方式。

API 服务器

API 服务器为K8s集群提供了一个REST接口。 所有在pod上激活的服务和别的对象都是可以用可编程的方式与与终端进行交互。

调度器

调度器负责将任务分配给各个节点。它监控资源容量并保证工作节点的性能保持在可接受的范围内。

控制器管理器

K8s控制器管理器是管理K8s核心控制循环的服务。它负责确保集群的共享状态正常运行。

Etcd

K8s使用了Etcd,一个提供分布式键值存储的数据库,用来共享集群的整体状态的信息。

节点

节点是运行了pod的物理机或虚拟机。控制平面管理集群中的每个节点,该节点包含运行 pod所需的服务。

Pods

K8s pod 是K8s管理容器集的最小单位。 每个pod有一个分配给pod中的所有容器的单独的IP 地址。在pod中的容器内存和存储资源是共享的。

Kubelet

Kubelet是一个工作节点组件。它的任务是跟踪pod及其容器的运行状态。它与pod的YAML 或JSON描述文件相关。Kubelet检查 pod 规格并确定 pod 是否健康。

Kube代理

Kube代理是一个网络代理和负载均衡器,充当每个节点和API服务器之间的连接。它在集群中的每个节点上运行,并允许你从内部和外部连接到pod。

Kubectl

Kubectl是K8s的命令行工具。它用于部署应用程序、监控和控制集群资源以及查看日志。

k8s+jenkins的优势

服务高可用,当jenkins Master出现故障时,k8s会自动创建一个新的jenkins Master容器,并且将存储的容器中的数据信息分配给新创建的容器;动态伸缩,合理使用资源,每次运行job时,会自动创建一个slave,job完成后,slave自动注销并删除容器,资源自动释放而且k8s会根据每个资源的使用情况,动态分配slave到空闲的节点上创建,降低出现因某节点资源利用率高,还排队等待在该节点的情况;扩展性高,当k8s集群的资源严重不足而导致job排队等待时,可以很容易的添加一个kubernetes Node到集群中,从而实现扩展。

写在最后

DevOps,k8s,docker,jenkins的基本探索到这里就结束了,但是DevOps,k8s,docker,jenkins的强大却不止于此。敏捷开发的团队价值也不止于此,在软件行业迅猛发展和市场瞬息万变的当下,敏捷开发无疑更能够抢占市场先机,快速地满足用户需求,让管理者提高项目交付的成功率,让企业更快、更好、更简单、更有效地应对这个时代。

DevOps值得每个团队的深思