Docker编排三剑客
Docker Compose:是对docker命令的封装,用于组装多容器的单机编排工具,可以在swarm集群中部署分布式应用
Docker Machine:是一个简化Docker安装的命令行工具,通过一个简单的命令就可以在相应的平台上安装Docker,一个Docker Machine就是一个Docker host主机和经过配置的Docker client的结合体。
Docker Swarm:是Docker社区原生支持Docker集群的工具,可以把多个Docker主机组成系统转换成单一的虚拟Docker主机
分为管理结点和工作结点- 管理节点:用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。
- 工作节点:是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。也可以通过配置让服务只运行在管理节点。
Kubernetes介绍
- 基于容器技术,Kubernetes可以方便的进行集群应用的部署、扩容、缩容、自愈机制、服务发现、负载均衡、日志、监控等功能,大大减少日常运维的工作量。
- Kubernetes所有的操作都可以通过Kubernetes API来进行,通过API来操作Kubernetes中的对象,包括Pod、Service、Volume、Namespace等等。
Kubernetes架构
- Kubernetes借鉴了Borg的设计理念,比如Pod、Service、Labels和单Pod单IP等。Kubernetes的整体架构跟Borg非常像,如下图所示:

Master主控组件
- etcd:etcd保存了整个集群的状态
- kube-apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
- kube-controller-manager:负责维护集群状态,比如故障检测、自动扩展、滚动更新等。
- kube-scheduler:负责集群资源的调度,按照预定的调度策略将集群资源调度到相应的节点上。
Node组件
- kubelet:和master节点进行通信,负责维护容器的生命周期,同时也负责Volume和网络的管理
- kubeproxy:一种网络代理,将Kubernetes的网络服务代理到每个节点上。如为Service提供cluster内部的服务发现和负载均衡
- docker:容器引擎
Add-ons组件:除了核心组件,还有一些推荐的Add-ons
- kube-dns:负责为整个集群提供DNS服务
- Ingress Controller:为服务提供外网入口
- Heapster:提供资源监控
- Dashboard:提供GUI
- Federation:提供跨可用区的集群
- Fluentd-elasticsearch:提供集群日志采集、存储和查询
- Kubenets对象
Kubernetes 包含若干抽象的对象用来表示系统状态,包括:已部署的容器化应用和负载、与它们相关的网络和磁盘资源以及有关集群正在运行的其他操作的信息。这些抽象使用 Kubernetes API 对象来表示。
每个API对象都有3大类属性
1、元数据metadata:用来标书API对象,每个对象都至少有3个元数据(namespace,name,uuid),还有各种各样的标签Labels用来表示和匹配不同的对象。
2、规范spec:描述了用户期望k8s集群中的分布式系统打到的理想状态
3、状态status:描述了系统实际当前达到的状态
常见的API对象有以下几种:
- Kubenets对象
Cluster:Cluster是计算、存储、网络资源的集合,kubernetes利用这些资源运行各种基于容器的应用
- Master:主要负责集群的调度,既决定应用应该放在哪里运行,为了实现高可用,应该运行多个Master
- Node:Node的职责是运行容器应用,Node由Master管理,Node监控并汇报容器的状态,并根据Master的要求管理同期的生命周期。
Pod:在节点上包含一组容器或卷,同一个Pod中的容器共享同一个网络命名空间,可以使用localhost、lo接口互相通信,Pod是无状态的,不是持续性实体。存在以下问题
- 如何持久化数据:kubernetes提供了Volume卷的概念,Pod通过挂载Volume实现持久化
- 多容器的创建:可以手动创建多个容器,也可以使用Replication Controller使用Pod模板创建出多份拷贝
- Pod重启后的IP变化:Pod在删除重启后IP会发生变化,那么客户端如何访问Pod中容器呢,Kubernetes提供了Service,Service是Kubernetes生成的一层抽象,Service通过Label标签和DNS来找到Pod组,从而自动获取Pod的IP。
Service:在Kubernetes中,服务是一种抽象出来的对象,定义了Pods的逻辑和访问他们的策略,服务所针对的Pod集合通常由选择器确定
- 现在,假定有2个后台Pod,并且定义后台Service的名称为‘backend-service’,lable选择器为(tier=backend, app=myapp)backendservice 的Service会完成如下两件重要的事情:
会为Service创建一个本地集群的DNS入口,因此前端Pod只需要DNS查找主机名为 ‘backend-service’,就能够解析出前端应用程序可用的IP地址。
- 现在前端已经得到了后台服务的IP地址,但是它应该访问2个后台Pod的哪一个呢?Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个(如下面的动画所示)。通过每个Node上运行的代理(kube-proxy)完成
Volume
Namespace
Controller:K8S通常不会直接创建Pod,而是通过Controller来管理Pod的,Controller中定义了Pod的部署要求。Kubernetes提供了多种控制器的对象,控制器基于基本对象构建并提供额外功能,Pod控制器具体包括
- ReplicationController:可实现符合用户预订目标的自动扩缩容的控制器,如容器的跌倒更新、回退
- Deployment:负责管理无状态的Pod集,是最常用的Controller,可以管理Pod的多个副本,并确保Pod按照期望的状态运行。
- StatefulSet:负责管理有状态的Pod集
- DaemonSet:运行集群上的守护程序
- Job:运行作业,用于运行结束就删除的应用
- NameSpace:名称空间是为K8S集群提供虚拟的隔离作用,初始有默认default和系统名称空间kube-system,除此之外,还可以创建新的名称空间满足需要
