容器时代的编排工具

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 协议通信。
    image.png

Master 上的3个核心组件:

  1. API server:用于接受、解析、处理用户对k8s 集群的请求,集群信息存储在共享存储 etcd
  2. Scheduler:调度器,调度容器创建请求。检查每个 node 中可用的计算资源,并根据请求选择合适的 node 创建容器,先预选再优选;
  3. Controller-Manager**:**控制器管理器,周期性探测各控制器的健康状态

Node 上的核心组件:

  1. kubelet:与Master 的 API 交互的核心组件,可以确保该 node 上的容器是处于正确运行状态的;
  2. 容器引擎:docker
  3. 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。
      image.png

      网络和通信

      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 网络中。**
image.png