说到容器化就免不了说Docker, 毫无疑问,DocKer成了近些年来最火热,甚至最具颠覆性的技术之一。百度Docker,看到Docker官网几个醒目的大字“Build, Ship, and Run Any App, Anywhere”,由此我们想到上世纪90年代Java发布的时候,每一家公司都表示了极大的兴趣,直到他们意识到Java实际上对他们自有的平台其实是一种巨大威胁。Java的愿景是“Write Once,Run Anywhere”, 而Docker提出了“Build once,Run anywhere,Configure once,Run anything”。很大程度上,二者都对某些公司形成了潜在的威胁。尽管我们目前还看不到具体的一些公司针对可能的威胁采取的应对措施,但未来是谁也无法保证类似Java或VMware的历史不会重演。
Docker技术的简要综述:
Docker利用了一些Linux核心工具,比如cGruops、Namespace、SELinux和AUFS等技术,对进程进行封装隔离。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。起初Docker只是LXC容器管理子系统的前端,但它在0.9版本中引入了libcontainer,从 1.11 开始,则进一步演进为使用runC和containerd。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
Docker和虚拟机对比
虚拟机:
简单说虚拟机(VM)是将一台服务器变成多台服务器的物理硬件的抽象。管理程序允许多台虚拟机在单台机器上运行。每个VM都包含一个操作系统的完整副本,一个或多个应用程序,必需的二进制文件和库 - 占用的空间很大。VM启动缓慢。
Docker:
Docker使用的阶段
Docker自2013年来非常火热来,随着需求的变化分为两个阶段
第一阶段:Docker还是当初的Docker
是Docker对一个(或一组)进程的封装,一个容器需要绑定宿主机的端口来向宿主机之外的网络提供服务,为了避免端口冲突,对于需要暴露端口的容器,Docker会随机绑定一个宿主机端口,这个时候就需要服务发现来帮助不同机器上的服务来进行通信了。可能更适用是单一个的程序或者程序关联性很小的应用,随着系统慢慢的庞大就会暴露出问题。
第二阶段:开源的容器集群管理系统
常见的开源容器集群管理系统有Kubernetes,Swarm和Mesos 。随着Docker官方宣布支持Kubernetes,Kubernetes大有统一容器天下之势,所以我们主要讲一下kubernetes。
Kubernetes是Docker生态圈里的重要一员,Google开源的容器集群管理系统,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
Kubernetes优势:
- 容器编排
- 轻量级
- 开源
- 弹性伸缩
- 负载均衡
讲诉Container在kubernetes的大致过程,用户通过kubectl提交需要运行的docker Container(pod),apiserver负责etcd存储的所有操作,且只有apiserver才直接操作etcd集群,scheduler扫描分配主机,kubelet找到需要跑的Container在当前Node中运行,用户提交RC描述,replication contorller监视集群中的pod并保持pod数量,用户提交service描述文件,由kube proxy负责具体工作流量转发。如下图:
一个kuberbetes集群是由分布式存储(etcd)、服务节点(Minion,etcd现在称为Node)和控制节点(Master)构成的。所有的集群状态都保存在etcd中,Master节点上则运行集群的管理控制模块。Node节点是真正运行应用容器的主机节点,在每个Minion节点上都会运行一个Kubelet代理,控制该节点上的容器、镜像和存储卷等。
kuberbetes组件,如图:
Pod
Pod是Kubernetes调度的基本单位,Pod 安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。
service
Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口。借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签来选取服务后端,一般配合Replication Controller或者Deployment来保证后端容器的正常运行。
Replication Controller
ReplicationController(也简称为rc)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而异常多出来的容器也会自动回收。ReplicationController的典型应用场景包括确保健康Pod的数量、弹性伸缩、滚动升级以及应用多版本发布跟踪等。
apiserver
kube-apiserver是Kubernetes最重要的核心组件之一,主要提供以下的功能
- 提供集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更等
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
scheduler
scheduler负责分配调度Pod到集群内的节点上,它监听apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点。
调度器需要充分考虑诸多的因素:
- 公平调度
- 资源高效利用
- 数据本地化
- 内部负载干扰
- 服务质量
Controller Manager
Controller Manager是Kubernetes的大脑,它通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态。
Kubelet
每个节点上都运行一个kubelet服务进程,默认监听10250端口,接收并执行master发来的指令,管理Pod及Pod中的容器。每个kubelet进程会在API Server上注册节点自身信息,定期向master节点汇报节点的资源使用情况,并通过cAdvisor监控节点和容器的资源。
proxy
每台机器上都运行一个kube-proxy服务,它监听API server中service和endpoint的变化情况,并通过iptables等来为服务配置负载均衡。
应用部署架构图:
主要讲一下Gkube
容器控制程序,由Jenkins job通过 Execute shell 调用,主要功能是管理kubernetes集群,创建,删除,变更,查看pod(docker)容器。python3.4编写,调用kubernetes etcd glusterfs的API进行资源管理。主要逻辑是当job进行调用后查询etcd是否有该job对应的docker信息,如果有则移交给代码更新脚本,如果没有则创建一个容器,并初始化部署环境,然后发布代码。