Kubernetes 是来自 Google 云平台的开源容器集群管理系统。基于 Docker 构建一个容器的调度服务。该系统可以自动在一个容器集群中选择一个工作容器供使用。其核心概念是 Container Pod。
首先,为什么要用Kubernetes? 使用一个工具先要梳理下使用这个工具的目标,我们不是为了工具而用工具。
Kubernetes的目标用一张被很多人引用过的图来说明最好:
Kubernetes 的目标是让你可以像管理牲畜一样管理你的服务,而不是像宠物一样,同时提高资源的利用率,让码农关注在应用开发本身,高可用的事情就交给 Kubernetes吧。这个图本来是openstack提出的,但纯粹IaaS层的解决方案实现不了这个目标,于是有了Kubernetes。
Kubernetes和Borg系出同门,基本是Borg的开源改进版本,引用Google Borg论文里的说法:
it (1) hides the details of resource management and failure handling so its users can focus on application development instead; (2) operates with very high reliability and availability, and supports applica- tions that do the same; and (3) lets us run workloads across tens of thousands of machines effectively
我们如何验证是否达到这个目标了呢?
随机关掉一台机器,看你的服务能否正常
减少的应用实例能否自动迁移并恢复到其他节点
服务能否随着流量进行自动伸缩
我们从一个简单的多层应用的架构改进来探讨下:
说明:
my
SQL应该是一主多从的架构,这里为了简单进行了省略
service后面也会依赖数据库等资源,这里为了简单进行了省略
箭头表示调用和依赖关系
具体分析一下为了达到我们的目标,需要做到改进:
Loadbalancer 要调用后端应用服务节点,后端应用服务节点挂了或者迁移增加节点,都要变更Loadbalancer的配置。这样明显达不到目标,于是计划将 Loadbalancer改造成Smart Loadbalancer,通过服务发现机制,应用实例启动或者销毁时自动注册到一个配置中心 (etcd/zookeeper),Loadbalancer监听应用配置的变化自动修改自己的配置。
Web应用对后端资源的依赖,比如Mysql和Memcached,对应资源的ip一般是写到配置文件的。资源节点变更或者增加都要变更应用配置。
Mysql计划该成域名访问方式,而不是ip。为了避免dns变更时的延迟问题,需要在内网架设私有dns。高可用采用MHA方案,然后配合服务发现机制自动修改dns。
Memcached计划参照couc
HBase的方式,通过服务发现机制,使用SmartClient,客户端应用监听配置中心的节点变化。难点可能在于对Memcached的改造(可以参考couchbase)。另外也可以通过增加一层代理的机制实现。
应 用节点迁移时依赖的系统和基础库不一样如何处理?部署方式不一样如何处理?磁盘路径,监听端口等冲突怎么办?这个可以通过Docker这样的容器技术,将 应用部署运行的方式进行标准化,操作系统和基础库的依赖允许应用自定义,对磁盘路径以及端口的依赖通过Docker运行参数动态注入,而不需要变更应用配 置。Docker的自定义变量以及参数,需要提供标准化的配置文件。
服务迁移问题 每种服务都需要一个master调度中心,来监控实例状态,确定要不要进行迁移,负责统一调度。并且每个服务器节点上要有个agent来执行具体的操作,监控该节点上的应用。另外还要提供接口以及工具去操作。
网络以及端口冲突的问题比较麻烦 需要引入类似SDN的解决方案。
内存,cpu,以及磁盘等硬件资源,原来的习惯是购买服务器的时候就根据服务器的上的应用类型进行规划,如果应用和硬件解耦,这种方式需要淘汰。但必须有一种调度机制让应用迁移的时候可进行筛选。
总结一下,通过分析得出,要达到目标,关键是解耦,应用进程和资源(包括 cpu,内存,磁盘,网络)的解耦,服务依赖关系的解耦。
我们上面的改造机制基本是按照个案进行设计,Kubernetes的则是要提供一套全面通用的机制。
然后,我们看看Kubernetes对以上问题的解决方案:
先上一张Kubernetes官方的架构图