Kubernetes 承担两个角色。

  • 支撑应用运行的集群。
  • 编排器。

集群角色的 Kubernetes

作为集群,包含若干节点与控制平面。控制平面对外提供 API,对内负责节点的任务分配与调度,并持久化存储节点状态,应用服务运行在节点上。
控制节点提供了全部特性,例如自动扩缩容等功能。工作节点执行应用代码。

编排器角色的 Kubernetes

编排器,是指包含了应用部署与管理的系统。Kubernetes 负责将应用组织并保持顺畅运行,当出现特定事件或变化,也会做出响应。这里提到的行为,就称为编排。

Kubernetes 如何工作的

一个或多个主节点与若干工作节点,构成 Kubernetes 集群。用户将自己的 App 打包并部署到 Kubernetes 集群。主节点负责管理集群,关注调度决策、监控集群、响应事件等工作,主节点也称作控制平面。工作节点负责运行用户的 App,它也称为数据平面,它跟主节点有汇报关系,并监控任务运行。

Kubernetes 运行可以简单分为以下过程。

  • 语言实现应用,采用微服务架构。
  • 微服务打包为容器。
  • 容器集成到 Pod。
  • 使用更高层的控制面板将 Pod 在集群中部署。

Kubernetes 通过声明式管理应用。意思是用户通过 YAML 文件来描述部署的应用如何运行于管理,将这些包含预期的 YAML 文件交给 Kubernetes,Kubernetes 来完成即可。

Kubernetes 主节点

主节点,组成控制平面。在生产环境,它需要高可用部署,一般建议 3 或 5个副本。下面快速了解组成主节点的各个服务组件。

API Server

负责集群中所有组件通信。访问它必须经过授权于认证。

集群存储

在控制平面中,只有集群存储是有状态的(会持久化的意思),存储集群的配置与状态。Kubernetes 底层用 etcd。etcd 认为一致性比可用性更加重要。对于所有分布式数据库,写操作性的一致性至关重要。etcd 使用 Raft 一致性算法解决这个问题。

Controller 管理器

Controller 管理器实现了控制循环,完成集群监控与事件响应。它负责创建 controller。一般控制循环包括:工作节点 controller、终端 controller 以及副本 controller。集群监控目的是保证集群当前状态与期望状态相匹配。集群监控基础逻辑大致如下:

  • 获取期望状态。
  • 观察当前状态。
  • 判断差异。
  • 变更消除差异点。

调度器

调度器职责是监听 API Server 来启动工作任务,并分配合适的节点。它的核心是排序系统,该系统有评分机制,将工作分配到分数最高的节点来运行任务。调度器确定可以执行任务的节点后,还会再进行前置校验,例如该节点是否仍然存在、分配的任务需要的端口当前选择的工作节点是否可以访问等,如果无法通过,该节点会被直接忽略,如果调度器最后无法找到合适的工作节点,则当前任务无法被调度,并被标记为暂停状态。
需要特别注意,调度器不负责运行任务,只为任务负责分配合适的工作节点

云 controller 管理器

集成公有云服务。

小结

Kubernetes 主节点运行控制平面服务。

Kubernetes 工作节点

工作节点是集群的工作者,负责如下 3 件事。

  • 监听 API Server 分派的新任务。
  • 执行任务。
  • 通过 API Server 回复执行结果。
    下面快速了解组成工作节点的各个服务组件。

Kubelet

工作节点的核心部分。新工作节点加入节点后,Kubelet 会被部署到新节点(先有工作节点还是先有 Kubelet 暂时不清楚),然后 Kubelet 将当前节点注册到集群中。它还有一个职责,监听 API Server 分配的任务,监听到就执行该任务,并维护一个与控制平面的通信频道。

容器运行时

工作节点需要通过它来获取、启动、停止执行任务依赖的容器,它负责容器管理与运行逻辑。

Kube-proxy

负责本地集群网络,保障 Pod 间的网络路由与负载均衡。