Kubernetes(K8s)原先来自于谷歌内部的小组提案,在2000年后,谷歌先后开发了Borg、Omega和Kubernetes这三个容器管理系统。
第一个在谷歌被开发出来的统一的容器管理系统,称之为“Borg”,它管理着长时间运行的生产服务和批处理服务。这两类任务之前是由两个分离开的系统来管理的:Babysitter和Global Work Queue。Borg将这两种应用所用的机器统一成一个池子,这样得以提高资源利用率,进而降低成本。
第二个容器管理系统Omega,则是Borg的延申,它的出现是出于提升Borg生态系统软件工程的愿望。
第三个容器管理系统是Kubernetes,也就是现在说的K8s,那么为什么K8s能够获得业界的认可,并且成为新一代的容器管理系统呢?
容器兴盛的开始
相信大家一定听过Docker,这个在2013 年推出,以码头货柜命名的容器,强调 build, ship and run 的观念, Docker 的轻量虚拟化的技术及易于移植的特性,非常利于现代云端服务的开发及部署。相对来说,传统的虚拟机需要追求高规格,且在基础设施和运维(Ops)上需要花费非常多的工夫和心力。以下是传统虚拟机器与Docker 容器所做的比较。
当开发运维时,最希望的就是在部署后持续监控,当服务器流量过头的时候,可以实现自动扩展;当流量很低迷时,可以自动缩减服务器。除此之外,最重要的是,当一台服务器挂点后,希望可以自动修复,而且随时必须保持服务实例的个数。以上很多功能 Docker 都可以帮您做到,并利用容器来提供服务。这样的服务型态被称作CaaS(Container as a Service),看起来一切都很美好。但是Docker 容器不是万能,在容器/服务个数越来越复杂的情况下,如何管理丛集和服务的生命周期,将会是各家容器编排管理(orchestration) 的能力。其中Google 的Kubernetes 就是一个十分精良的容器编排管理工具。
传统一体化架构到微服务架构的转移
随着应用的发展,程序变得越来越复杂,传统一体化架构 (Monolithic Architecture) 的服务会造成巨大的不便,比如说:1.新增功能与测试放在一起,使得程序十分复杂;2.开发和利用新语言和新框架的效率低;3.安全性低,所有的模块构建在一个process里,一旦出现bug 可能牵一发而动全身。
而微服务 (microservices) 架构正好解决了这样的问题,将每一个具有商业逻辑的服务独立出来,例如不再将所有资料都写入同一个资料库,而是每个单独的服务都有一个最适合自己本身结构的资料库。好处是让每个服务都可以用最适合自己的语言、资料库来开发。从下图可以看到,乘客管理、Web UI、金流等都是一个独立出来的微服务,而每个服务都开放了 REST API 实行客户端或者服务之间的沟通。在实作上,每一个商业功能/服务都可能是一台 VM 或者一个容器。
Kubernetes 特别适合微服务这样的架构。将数个容器组合起来成一个服务(Service,注:Service 是 K8S 的专有名词,下面会介绍),Kubernetes 也提供了良好的服务发现(Service discovery)机制,让每个服务彼此可以通信。最重要的是 K8S 强大的编程可以自动扩展服务,甚至还可以对大规模的容器作滚动更新 (Rolling update) 以及回滚机制 (Rolling back/Undo),更可以整合 CI/CD 等 DevOps 的工具,绝对让您用最小的力气管理最庞大的系统。
Kubernetes的架构独特在哪里?
刚刚提到Kubernetes 特别适合微服务架构,这又是为什么呢?Kubernetes 与 Docker在结构上有何区别呢?
K8s的结构如下:
Kubernetes 中的 master-nodes 架构
Kubernetes属于分布式系统,包括了Master、Node、Clusters。
Master是大管家;
Node是主要工作的节点,上面运行了许多容器,类似于一台虚拟机。Kubernetes 可操控高达 1,000 个 nodes 以上;
Clusters是Master和Node的集合。
再拆分来看Kubernetes的结构如下:
重点来说下Kubernetes区别于Docker的三个组成:
- Pod
- Service
- Deployments (Replication Controller)
1.Pod
容器是位于 pod 内部,一个 pod 包覆著一个以上的容器,这造成 K8S 与一般容器不同的操作概念。在 Docker 裡,Docker container 是最小单位,但在 K8S 可想作 pod 为最小单位。
Pod的特性如下:
1. Pod 拥有不确定的生命週期
2. Pod 内有一个让所有 container 共用的 Volume,这会与 Docker 不同
3. Pod 采取 shared IP,内部所有的容器皆使用同一个 Pod IP,这也与 Docker 不同
4. Pod 内的众多容器都会和 Pod 同生共死
2.Service
K8S的 Service 有它的独特方法,我们看看它的特性
1. 每个 Service 包含著一个以上的 pod
2. 每个 Service 有个独立且固定的 IP 地址 – Cluster IP
3. 客户端访问 Service 时,会经由上述提过的 proxy 来达到负载平衡、与各 pod 连结的结果
4. 利用标签选择器 (Label Selector),聪明地选择那些已贴上标签的 pod
3.Deployments
旧版的 K8S 使用了副本控制器 (Replication Controller) 的名词,在新版已经改成 Deployments 囉。Deployments 顾名思义掌控了部署 Kubernetes 服务的一切。它主要掌管了 Replica Set 的个数,而 Replica Set 的组成就是一个以上的 Pod。
1. Deployments 的设定档(底下以 YAML 格式为例),可以指定 replica,并保证在该 replica 的数量运作
2. Deployments 会检查 pod 的状态
3. Deployments 下可执行滚动更新
基于三个组成的特性,Kubernetes 与 Docker 区分开来,也更为适应现在的微服务架构,将不同的功能不同的代码区分开来,以确保其可靠性和开发效率。
目前Kubernetes已在容器管理系统上占据主导地位,成为业内公认的行业标准和未来趋势,虽然Google已在之前就将Kubernetes捐出来作为开源使用,但是由于谷歌多年在Kubernetes上的开发和应用,Google 的 k8s 托管服务,即Google Kubernetes Engine,却将 k8s 托管服务做到了极致,支持自动伸缩节点和调节,进一步实现云计算的无服务化。