【技术总结】一起聊聊Kubernetes

上次talk show我们介绍了Docker,它具有轻量级,易操作,易部署等优点。

Why Kubernetes?

下图是一个真实的Docker脚本。

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》 这个脚本用于构建一个镜像,脚本要提前运行生成镜像。一般的shell脚本是处理一个任务。下图是在开发环境里运用Docker的示意图。

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》 软件工程师用Docker file来构建Docker环境。Source code在Image外面。Image挂载在Container上面,App运行在这个环境中。因为Source code和运行环境没有关系,所以可以用任何IDE运行。运行结果将和任何人运行的都一样。Source code不能放在Docker里,否则一旦关闭Docker,source code也会消失。

举例来说,Mac里有个shell命令叫Date,可以返回当前日期。但这个命令在Linux里用法不同。如果程序里包含Date这个命令,就会出错。Docker能避免这个问题。

下图是真实环境下的Docker的架构分类

《【技术总结】一起聊聊Kubernetes》
其中HTTP server接到请求给Web Server处理。这几部分面临Deployment,Management和Maintenance方面的问题。Kubernetes能够解决这些问题。

What is Kubernetes?

Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,不只限于Docker,其主要特点如下:

1)Support multi-cloud platfform: AWS, Azure, Digital Ocean, GCE

当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平台,除此之外,也可以直接运行在物理机上。

2)Scale across hosts

以集群的方式运行、管理跨机器的容器。

3)Auto-scale/Manual Scale

可自动扩展。

4) Self-healing

Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态。

(reference from:Kubernetes系统架构简介)

可以说它的本质是一个Scheduler。它有两层实现,在Kubernetes里实现自动的增加减少,在后台AWS也可以自动增减。

下面举个例子。

最开始我们只有一个image。运行一个单一的Docker单元。

《【技术总结】一起聊聊Kubernetes》

多个image协同工作,比如下图三个。在Kubernetes里资源的最小单位是Pod。它里面可以有多个image单元,但至少有一个image。

《【技术总结】一起聊聊Kubernetes》

在集群里有多个Pod。Pod是在机器上。Node里可以有多个Pod。

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》

外界用户发送request,由Kubernetes里的Service去找到对应的服务。比如下图中Pod1和Pod3都是针对FrontEnd的服务。当用户需要FrontEnd的回应时,Service自动找到Pod1和Pod3。同时Service还有load balance的作用。我们的服务需要是无状态的。Service在master结点上。

Replication controller可以用来创建image。比如我们想创建两个BackEnd的Pod,可以由Replication controller进行,并且不用关心这下Pod所在的具体机器。如果一个Pod有问题,Replication controller会自动重新创建。Service是针对用户角度的一种抽象,Replication controller是针对资源的一种机制。

Master结点里包括Replication controller。还有Etcd,Rest API,Scheduler,Controller Manager。

Etcd是Key/value存储状态的一个系统,和zookeeper功能类似,存储所有的node的状态信息。

Rest API靠一个工作单元Kubelet来负责和各个node之间进行通信。

当Pod2坏了,Scheduler会重新开启一个BackEnd的Pod。负责调度Pod的启动时间,顺序。

Controller Manager和Replication controller同时工作,并管理它。

Kubernetes一个问题是如果master失败,则整个系统失败,没有backup。

以上是从用户的角度来分析。从软件工程师的角度来看,运用Kubectl进行操作,与集群对话。Kubectl就是一个命令行工具,类似AWS里的命令行。

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》

下图显示的是Scheduler Reschedule的过程。如图有三台机器,两个Pod。第一列表示正常情况。第二列表示Pod2出现问题。第三四列是两种可能的情况,一种是在Node3上重新开启一个Pod,另一种是在Node1上重新开启一个Pod。

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》

相同的例子。当Pod不够用时,要Scale Pod。下图第二三列是可能的情况。

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》

下面是具体的例子。代码在下图的github连接里。

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》 首先运行Kubernetes一个包里的脚本。设置一个环境变量Kubernetes=AWS,在AWS上部署服务。把配置文件放在AWS上。

下图是运行成功时的界面。

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》 具体代码详见github。

下图是一个典型datapipe的架构。Nginx和WebServer是数据的入口,存到Kafka里。此外需要一些辅助服务,比如MySQL等。数据处理完后存到Kafka里。用Hive或者Drill分析数据。Zookeeper负责监控。这种典型的大公司架构非常复杂。虽然性能很好,但是非常耗费人力。对这个架构进行改善,如下图。

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》

蓝色方框用Kubernetes实现,绿色方框用第三方的云服务实现。同时增加很多服务,比如Graphite等等。架构使用者主要负责监控。

下图是CICD的实现

《【技术总结】一起聊聊Kubernetes》
《【技术总结】一起聊聊Kubernetes》 图中有两个github,一个存Kubernetes的配置文件,另一个存application。开发人员将源代码pull到本地进行开发。使用Docker的运行环境。开发完后将改动push到github。Jenkins负责监控。它会触发Build脚本。下面是Test,最后Push回Docker-hub,部署到Kubernetes。同时集群更新image。

注:本文系2月24日晚太阁技术秀一起聊聊Kubernetes的技术总结,作者为Shaoke Xu

更多精彩内容, 请扫描下面二维码,关注微信公众账号“论码农的自我修养”

《【技术总结】一起聊聊Kubernetes》

    原文作者:Mingche Su
    原文地址: https://zhuanlan.zhihu.com/p/20612045#!
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞