上次talk show我们介绍了Docker,它具有轻量级,易操作,易部署等优点。
Why Kubernetes?
下图是一个真实的Docker脚本。
这个脚本用于构建一个镜像,脚本要提前运行生成镜像。一般的shell脚本是处理一个任务。下图是在开发环境里运用Docker的示意图。
软件工程师用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的架构分类
其中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单元。
多个image协同工作,比如下图三个。在Kubernetes里资源的最小单位是Pod。它里面可以有多个image单元,但至少有一个image。
在集群里有多个Pod。Pod是在机器上。Node里可以有多个Pod。
外界用户发送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里的命令行。
下图显示的是Scheduler Reschedule的过程。如图有三台机器,两个Pod。第一列表示正常情况。第二列表示Pod2出现问题。第三四列是两种可能的情况,一种是在Node3上重新开启一个Pod,另一种是在Node1上重新开启一个Pod。
相同的例子。当Pod不够用时,要Scale Pod。下图第二三列是可能的情况。
下面是具体的例子。代码在下图的github连接里。
首先运行Kubernetes一个包里的脚本。设置一个环境变量Kubernetes=AWS,在AWS上部署服务。把配置文件放在AWS上。
下图是运行成功时的界面。
具体代码详见github。
下图是一个典型datapipe的架构。Nginx和WebServer是数据的入口,存到Kafka里。此外需要一些辅助服务,比如MySQL等。数据处理完后存到Kafka里。用Hive或者Drill分析数据。Zookeeper负责监控。这种典型的大公司架构非常复杂。虽然性能很好,但是非常耗费人力。对这个架构进行改善,如下图。
蓝色方框用Kubernetes实现,绿色方框用第三方的云服务实现。同时增加很多服务,比如Graphite等等。架构使用者主要负责监控。
下图是CICD的实现
图中有两个github,一个存Kubernetes的配置文件,另一个存application。开发人员将源代码pull到本地进行开发。使用Docker的运行环境。开发完后将改动push到github。Jenkins负责监控。它会触发Build脚本。下面是Test,最后Push回Docker-hub,部署到Kubernetes。同时集群更新image。
注:本文系2月24日晚太阁技术秀一起聊聊Kubernetes的技术总结,作者为Shaoke Xu
更多精彩内容, 请扫描下面二维码,关注微信公众账号“论码农的自我修养”