news banner

  • 容器化技术的流行

容器是近年来非常盛行的技术,相关代表产品有docker、rkt等。简单而言,容器类似一个沙盒(Sandbox),每个沙盒执行一个应用(或者说是微服务Microservice),各个微服务可以用自己喜好的程序语言开发,不同的沙盒相互隔离,容器之间也可以建立沟通机制。对本机资源的要求远远低于虚拟机(Virtual Machine),更多细节请参考另一篇部落格文章”容器技术革命:Docker”

 

  • 认识Kubernetes

Kubernetes

Kubernetes是Google开源项目之中容器丛集架构管理系统,Google 于2015年释出Kubernetes(简称K8S),Kubernetes可以说是同容器Docker一起发展起来的,它提供应用部署、轻量级、维护、扩展机制等功能,他建构在容器技术之上,例如下图:

万物之本,最底层是操作系统Linux,而Docker容器建构在操作系统上,Kubernetes又建构在Docker之上,也因此为这些Docker所起的容器提供管理的功能,就像这些独立容器个体之中的导航!非常巧的是Kubernetes官方的logo就是船陀,其字本意是古希腊语陀手的意思,我想这大概是命名的由来。Kubernetes也利用Google在容器技术上的实战经验,同时吸收Docker社群的最佳实践,已成为云端服务的重要陀手!

利用Kubernetes可以方便的管理跨机器执行容器化的应用,主要的功能大概如下:

  1. 1.使用容器(例如:Docker)对应用程序包装、实例化、隔离、运行。
  2. 2.以丛集的方式执行、管理本机或是跨机器之间的容器。
  3. 3.解决跨机器容器之间的通讯问题
  4. 4.Kubernetes的自我修复能力,使得容器丛集总是运行在用户期望的状态

注:与Kubernetes齐名的是Mesos,它是一个成熟的架构,提供了同kubernetes类似的容器丛集管理方案,另一方面它正积极同Kubernetes进行整合,两者亦敌亦友的关系。

 

  • 为何需要Kubernetes?

在Kubernetes还未问世的时代,只有容器技术(例如:Docker),虽然每个容器中所执行的Microservice,彼此独立不受其它互相干扰,只须透过容器技术提供的私有网络做沟通即可。但有没有想过?如果在同一台主机,用户使用的需求随着时间也会越来越大,跑的服务、数据量等会越来越多,很快地就需要扩容。举个比较容易理解的养鱼理论,原本你只有六七条鱼时,只要一个小鱼缸就够了,但是过了一段时间,新生了三四十条小鱼,你现有的小鱼缸已经不够用了,传统的作法,你会再去买一个大鱼缸,把既有鱼缸的水草、沙子、饰品、打气机设备等,跟所有的鱼,重新搬移到新的鱼缸去,这是非常耗费功夫的。

现在换个方式思考,如果你新买的鱼缸可以和既有的鱼缸串起来,意即每个鱼缸之间有个通道,鱼就可以自动分散到不同的两个鱼缸,你也就省掉了搬移上面那系列设备的功夫了。

没错,Kubernetes就是为了多机的扩容而诞生的,提供良好的资源调度,换句话说,就是上面那些你养的鱼,可以自由游到比较不拥挤的鱼缸。

虽然Docker容器,现在也有提供Docker Swarm来提供多机的能力,但是功能上比起Kubernetes,可以说是小巫见大巫。

Kubernetes 2

注:Kubernetes虽然是多机架构,但是未尝不可跑在单机架构,只是多机架构的能力才是Kubernetes真正的强项。

 

  • Kubernetes的分布式架构

Kubernetes 3

Kubernetes属于分布式系统,其组件:

  1. 1.Master – 做为主节点,像是一个大管家,用于控制Kubernetes节点,所有任务分配都来自于此。
  2. 2.Node – 有的人称minion,主节点底下真正在做事的机器,每一台node上面可以运行许多容器,K8S可操控高达1,000个nodes以上

上图,每个蓝色方块就是一台主机,若是由master与node相互组成就是一个Kubernetes的丛集(Cluster),假设一个node挂掉,例如上图Node 1突然硬件故障无法继续提供服务,那么整个Kubernetes新产生的服务,会被Master分配到Node 2~Node N上,而不会造成用户使用服务的停摆。

那既有在Node 1的服务怎么办?Kubernetes会自己去计算,把Node 1负责的服务迁移到Node 2~Node N,并且根据适合的算法挑选出负载最轻的node。

或许有人会问,那如果Master挂掉了,怎么办?Master就不能为分配工作给Node了!Kubernetes非常强大,既然node可以一个以上互相备援,比较大型生产环境的公司,master通常有一个以上,例如:Master1与Master2,不管是Master1或是Master坏掉其中一台,另外一台都可以互相备援,让用户的服务不停摆。

Kubernetes除了在多机发挥了它强大的功能,搭配分布式储存系统(例如:Gluster、Ceph、StorageOS等),更可以帮用户的数据做分布式的存储,让数据达到持久化与优化。

 

  • Kubernetes的最小颗粒 - Pod

相较于Docker里,Docker container是最小的单位,但在Kubernetes世界中,Pod是最小的部署单位,一个Pod是由一个或是多个以上的容器所组成,并且有下面几个特点:

  • l 共享同样的私有IP地址
  • l 共享储存空间(Volumes)
  • l Pod里面所有容器与Pod本身同生共死

如下示意图所表示,这个node启动了两个Pod,分别是Pod1与Pod2,每个Pod都是独立个体,互相不干扰,而每个Pod中有三个Docker container,而每个Docker container在分别去运行用户的服务

Kubernetes 4

 

  • 总结

以上是Kubernetes很基本的介绍,因为篇幅关系,只介绍核心组件之中Pod,其它核心组件Deployment、Service、Label、DaemonSet等,可以参考Kubernetes官方网站,有非常详细的介绍。

 

参考数据:

https://kubernetes.io/docs/home/

作者:德鸿科技 研发部 Andrew