Kubernetes API 主要由资源类型和控制器两部分组成,资源通常是声明为 JSON 或 YAML 格式并写入集群的对象,而控制器则在集群将资源存储完成后自动创建并启动。Kubernetes 把应用及辅助应用容器化和编排的各种组件均抽象成了 API 资源。
Kubernetes 系统的 API Server 基于 HTTP/HTTPS 协议接收并响应客户端的操作请求,它提供了一种“基于资源”的 RESTful 风格的编程接口,把集群各种组件都抽象成标准的 RESTful 资源,并支持通过标准的 HTTP 方法、以 JSON 为数据序列化方案进行资源管理操作。
以资源的主要功能作为分类标准,Kubernetes 的 API 对象大体可分为工作负载、发现与负载均衡、配置与存储、集群和元数据几个类别。它们基本都是围绕一个核心目的而设计:如何更好地运行和丰富 Pod 资源,从而为容器化应用提供更灵活和更完善的操作与管理组件。
应用程序分为无状态和有状态两种类型,无状态应用中的每个 Pod 实例均可被其他同类实例所取代,但有状态应用的每个 Pod 实例均有其独特性,必须单独标识和管理,因而它们分别由两种不同类型的 Pod 控制器进行管理。
ReplicationController:用于确保每个 Pod 副本在任一时刻均能满足目标数量,即它用于保证每个容器或容器组总是运行并可访问;它是上一代的无状态 Pod 应用控制器,建议读者使用新型控制器 Deployment 和 ReplicaSet 来取代它。
ReplicaSet:新一代 ReplicationController,它与 ReplicationController 唯一不同之处在于支持的标签选择器不同,ReplicationController 只支持“等值选择器”,而 ReplicaSet 还支持基于集合的选择器。
Deployment:用于管理无状态的持久化应用,例如 HTTP 服务等;它用于为 Pod 和 ReplicaSet 提供声明式更新,是构建在 ReplicaSet 之上的、更为高级的控制器。
StatefulSet:用于管理有状态的持久化应用,例如数据库服务程序;与 Deployment 的不同之处在于,StatefulSet 会为每个 Pod 创建一个独有的持久性标识符,并会确保各 Pod 间的顺序性。
DaemonSet:用于确保每个节点都运行了某 Pod 的一个副本,包括后来新增的节点;而节点移除将导致 Pod 回收;DaemonSet 常用于运行各类系统级守护进程,例如 kube-proxy 和 Flannel 网络插件,以及日志收集和临近系统的 Agent 应用,例如 fluentd、Logstash、Prometheus 的 Node Exporter 等。
Job:用于管理运行完成后即可终止的应用,例如批处理作业任务;Job 创建一个或多个 Pod,并确保其符合目标数量,直到应用完成而终止。
一个应用通常需要多个资源的支撑,例如用 Deployment 资源编排应用实例(Pod)、用 ConfigMap 和 Secret 资源保存应用配置、用 Service 或 Ingress 资源暴露服务、用 Volume 资源提供持久化存储等。