容器时代的编排工具
docker 三剑客
docker compose:单机容器编排工具
docker swarm:集群容器编排工具
docker machine: 主机快速加入 swarm 集群的预处理工具
Mesos+Marathon
Mesos是一个分布式计算框架,为数据中心提供计算资源的动态分配。Marathon是基于Mesos的私有PaaS,它实现了Mesos的Framework。Marathon实现了服务发现和负载平衡、为部署提供REST API服务、授权和SSL、配置约束等功能。
如果将Mesos类比为操作系统的内核,负责资源调度。则Marathon可以类比为服务管理系统,比如init,systemd或upstart等系统,用来管理应用的状态信息。Marathon将应用程序部署为长时间运行的Mesos任务。
kubernetes
Kubernetes是一个自动化,容器化应用程序部署扩展和管理的开放源代码系统。Kubernetes由Google根据他们在生产中运行容器的经验使用称为Borg的内部集群管理系统(有时简称Omega), Kubernetes的体系结构依赖于这种经验。
特性
- 自动装箱
- 自我修复
- 水平扩展
- 服务发现和负载均衡
- 自动发布和回滚
- 密钥和配置管理
- 存储编排
Kubernetes概念
Master-Node 模型
Kubernetes 底层的物理架构中是 Master/Node 模型。为了高可用,Master 的数量至少应该有3个,Node 节点数不限量。etcd 至少需要3个,用于保存集群信息。彼此通过 http 或 https 协议通信。
Master 上的3个核心组件:
- API server:用于接受、解析、处理用户对k8s 集群的请求,集群信息存储在共享存储
etcd
中 - Scheduler:调度器,调度容器创建请求。检查每个 node 中可用的计算资源,并根据请求选择合适的 node 创建容器,先预选再优选;
- Controller-Manager**:**控制器管理器,周期性探测各控制器的健康状态
Node 上的核心组件:
- kubelet:与Master 的 API 交互的核心组件,可以确保该 node 上的容器是处于正确运行状态的;
- 容器引擎:docker
- kube-proxy:管理 service,与 API 通信,告知本地 pod 和 service 的变更信息
pod
在Kubernetes 集群中,pod 是 k8s 调度的原子单元。一般来说,一个 pod 只运行一个容器,即使运行多个容器,也只有一个主容器。同一个 pod 中的容器共享同一个网络名称空间(NETWORK、UTS、IPC)和存储卷,另外,PID,USER和Mount 互相隔离。
管理员或 K8S 控制器通过附加在 pod 上的标签(label)来识别不同的 pod。通过标签选择器(selector),选择符合条件的资源对象。
pod 分类
- 自主式 Pod:无法实现全局 pod 调度
控制器管理的 Pod(pod 控制器)
- ReplicationController:副本式 pod,精准控制 pod 副本的数量,另应用于应用的滚动更新和回滚
- ReplicaSet:副本级控制器,与 Deployment 控制器配合使用
- Deployment:无状态副本级控制器
- StatfulSet:有状态副本级控制器,HPA(水平 pod 自动伸缩控制器) 是它的二级控制器
- DaemonSet:每个 node 运行一个副本
- Job:作业控制器
- Ctonjob:周期性提交作业控制器
service
pod 有生命周期,当一个 pod 生命周期结束后,在另外一个 node 上创建了新的 pod,此时无法知晓新 pod 的信息。kubernetes 为每一组提供相同服务的 pod 和客户端之间添加了一个固定的中间层,这个中间层称为 service。service 能为客户端提供一个稳定的访问入口,service 将客户端请求代理至后端 pod,service 通过 pod 标签识别 pod。
service 本质是 iptables 的 DNAT 规则,在 k8s 1.11版本之后,把 iptables 规则变更为 ipvs 规则来提高效率。service 的名称可以被解析为 IP 地址,需要 k8s 的附件 dns pod。网络和通信
k8s中存在三种网络和三类通信:
3种网络
节点网络:集群中物理网卡所在的网络
- 集群网络:服务 service 的网络
- pod 网络:
3类通信
- 同一 pod 内的多个容器间通信:loopback
- 各 pod 之间的通信:通过叠加网络(overlay Network )直接通信
- pod 与 service之间的通信:通过 docker bridge0访问,并进行 IP 地址转换
K8S自身不提供网络管理功能, 通过 CNI(容器网络接口) 插件体系接入第三方网络解决方案,常见的插件有:
- flannel:仅支持网络配置,叠加网络,配置简单
- calico:支持网络配置和网络策略,3层隧道网络,配置复杂
- canel:flannel 和 calico 的组合,使用 flannel 提供网络配置、使用 calico 提供网络策略
名称空间
k8s 作为一个集群,在这个集群中,通过名称空间隔离一类 pod,这个名称空间不是网络边界,而是管理边界。不同的名称空间依然在同一个 pod 网络中。**