容器编排

容器编排的主要工作是:

  1. 在集群节点上创建和部署容器实例。
  2. 容器的资源管理,即把容器部署在有足够运行资源的节点上,或者当这个节点的资源超出限额时可以将容器转移到别的节点上。
  3. 监控容器以及集群节点的运行状况,以便在容器或者节点出现故障时进行重启或重新编排。
  4. 在集群内对容器进行扩容或收缩。
  5. 为容器提供网络映射服务。在集群内为容器提供负载均衡服务。

尽管有好几种容器编排工具存在,例如docker swarm,apache mesos,但是毫无疑问,Kubernetes是目前最流行的一款集群管理及容器编排工具。

k8s核心概念

主要组件如下。

控制平面组件(Control Plane Components)

控制平面的组件以前叫主节点,可能为了政治正确,去掉了master改为了这个词。它主要负责对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的 replicas 字段时,启动新的 pod)。
控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,通常会在同一个主机上启动所有控制平面组件,并且不会在此机器上运行用户容器。
控制平面组建包括:

  • kube-apiserver
    apiserver是 Kubernetes 控制面的组件, 对外暴露了 Kubernetes API。
    Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平伸缩,也就是说,它可通过部署多个实例进行伸缩,以平衡流量。
  • etcd
    etcd 是兼具一致性和高可用性的键值数据库,用来保存 Kubernetes 所有集群数据的后台数据库。
  • kube-scheduler
    控制平面组件,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。
    调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
  • kube-controller-manager
    在主节点上运行 控制器 的组件。
    从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。
    这些控制器包括:
    • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
    • 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod
    • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
    • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
  • cloud-controller-manager
    云控制器管理器是指嵌入特定云的控制逻辑的控制平面组件。

Node 组件

节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

  • kubelet
    一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。
    kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。
  • kube-proxy
    kube-proxy 维护节点网络并执行通信转发。
  • 容器运行时(Container Runtime)
    容器运行环境是负责运行容器的软件。Kubernetes 支持多个容器运行环境: Docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)。
  • 插件(Addons)
    插件使用 Kubernetes 资源(DaemonSet、 Deployment等)实现集群功能。 因为这些插件提供集群级别的功能,插件中命名空间域的资源属于 kube-system命名空间。
    • DNS
      尽管其他插件都并非严格意义上的必需组件,但几乎所有 Kubernetes 集群都应该 有集群 DNS, 因为很多示例都需要 DNS 服务。
      集群 DNS 是一个 DNS 服务器,和环境中的其他 DNS 服务器一起工作,它为 Kubernetes 服务提供 DNS 记录。
      Kubernetes 启动的容器自动将此 DNS 服务器包含在其 DNS 搜索列表中。
    • Web 界面(仪表盘)
      Dashboard 是Kubernetes 集群的通用的、基于 Web 的用户界面。 它使用户可以管理集群中运行的应用程序以及集群本身并进行故障排除。
    • 容器资源监控
      容器资源监控 将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。
  • 集群层面日志
    集群层面日志 机制负责将容器的日志数据 保存到一个集中的日志存储中,该存储能够提供搜索和浏览接口。
    Kubernetes从诞生开始就支持Docker运行时,但它并不是Kubernetes唯一支持的容器运行时。事实上,Kubernetes社区已经推出了一个将不同容器运行时集成到Kubernetes的通用方法。事实证明,接口是一种很好的软件模式,可以协调两个不同的系统,因此,Kubernetes社区创建了容器运行时接口(Container Runtime Interface,CRI)。CRI的存在避免了把特定的容器运行时“硬编码”进Kubernetes的代码中,这样也就避免了一旦容器运行时发生变化时就需要修改Kubernetes代码的麻烦。
    CRI的做法是定义了一组规范,这组规范描述了一个容器运行时应该实现哪些功能才能与CRI兼容。CRI所描述的这些功能可以满足pod中容器的整个生命周期(启动、停止、暂停、终止、删除)的管理以及容器镜像的管理(例如,从容器注册服务器下载镜像),同时还包括了一些辅助功能,如日志和指标的收集以及网络通信。