Kubernetes 的API对象大体可分为工作负载(Workload)、发现和负载均衡(Discovery& LB)、配置和存储(Config &Storage)、集群(Cluster)以及元数据(Metadata)五个类别。

K8S-API.png

1、工作负载(Workload)

以下被称为 Pod 控制器。

Deployment

用途

Deployment 适用于部署无状态应用。无状态应用是指不需要保存客户状态的应用,这种类型的应用每个实例之间是相互独立的。

特点

  • 声明式更新: 通过声明所需的状态来更新应用,Kubernetes 会自动将当前状态转变为所声明的目标状态。
  • 滚动更新(Rolling updates): 在更新版本时,逐步替换旧版本的 Pod ,而不是同时删除旧版本,从而实现零停机更新。
  • 回滚(Rollbacks): 支持将 Deployment 回滚到之前的版本。
  • 扩缩容操作: 可以轻松地增加或减少应用的副本数量。

StatefulSet

用途

StatefulSet 是为了满足有状态应用的需求而设计的,比如需要持久化存储数据的数据库应用。

特点

  • 稳定的持久化存储: 即使容器重启,数据也不会丢失。
  • 唯一网络标识符: 每个 Pod 都有一个固定的 hostname 和网络标识。
  • 有序部署和扩缩容: Pod 的创建和删除是有序的,保证部署和扩缩容的平滑性。

DaemonSet

用途

DaemonSet 确保所有或某些节点上都运行指定的 Pod 副本。这对于集群监控、日志收集等跨节点的服务特别有用。

特点

  • 节点自动化管理: 当有节点加入集群时,DaemonSet 会自动在节点上添加 Pod ;当节点被移除时,对应的 Pod 也会被清理。

ReplicaSet

用途

ReplicaSet 的目的是在任何时间点都保持一定数量的 Pod 副本正在运行。

特点

  • 保持副本数量: 根据定义确保运行指定数量的 Pod 副本。
  • 被Deployment管理: 通常不直接使用 ReplicaSet ,而是通过 Deployment 来创建和管理。

Job

用途

Job 用于执行一次性任务,任务完成后,Job 会保持完成状态。

特点

  • 一次性任务: 任务完成后,Pod 不会再被重启。
  • 任务完成状态: 完成的任务会保留下来,直到被删除,便于日后检查日志和结果。

CronJob

用途

CronJob 用于管理基于时间的 Job ,类似于在 Kubernetes 环境中运行的定时任务。

特点

  • 定时执行: 可以指定执行时间和频率。
  • 自动管理: 自动创建和删除Job,根据预定的调度策略执行任务。

ReplicationController

用途

ReplicationController 是较早的资源类型,用于保持 Pod 的副本数量。目前已被 ReplicaSet 取代。

特点

  • 副本数量管理: 确保有指定数量的 Pod 副本运行。
  • 向后兼容: 尽管被 ReplicaSet 取代,但为了向后兼容仍然存在。



2、发现和负载均衡(Discovery& LB)

在Kubernetes集群中,管理网络流量和服务暴露是至关重要的任务。

Service

概述

Service 是 Kubernetes 中的一个抽象概念,它通过定义一个选择器来选择一组具有相同标签的 Pod,这些 Pod 提供了相同的服务功能。 Service 为这组 Pod 提供了一个统一的访问接口,实现了负载均衡和服务发现。

工作原理

  • 标签选择器(Label Selector): 使用标签选择器来识别属于其下的Pod,作为服务的后端处理单元。
  • 稳定的IP地址和端口: 每个Service都有一个固定的IP地址和端口,客户端通过这个地址和端口与服务交互。
  • 负载均衡: Service 负责将请求代理 / 路由到后端的Pod,并进行负载均衡。
  • API Service 监视: Service 持续监视标签选择器匹配到的后端Pod对象,并实时跟踪这些对象的变化。

Endpoint

概述

Endpoint 是用来记录Service对应的所有Pod的访问地址(IP地址和端口)的资源对象。它根据Service的标签选择器自动创建和更新,记录存储在etcd中。

工作原理

  • 自动创建: 创建Service时,其关联的Endpoint对象会自动创建。
  • 动态更新: Endpoint记录会实时更新,以反映后端Pod的变化。
  • 存储位置: 信息存储在etcd中,供Kubernetes的各个组件访问。

Ingress

概述

Ingress 是用于暴露服务到集群外部的资源对象,允许通过一个统一的入口来管理外部访问集群内部服务的规则。

工作原理

  • 七层负载均衡器: 通常由七层负载均衡器(如 NGINX、HAProxy、Envoy、Traefik 等)实现,理解HTTP协议,提供细粒度的流量控制。
  • 统一入口: 提供一个统一的入口点来管理对集群内多个服务的访问。
  • 高级路由: 通过Ingress规则,可以基于请求的URL路径或主机名进行流量路由。



3、配置和存储(Config &Storage)

在Kubernetes中,存储和配置的管理对于构建和维护健壮应用至关重要。

Volume(存储卷)

概述

Kubernetes中的Volume是一个被Pod中的容器所共享的目录,它是一个或多个文件的封装,其生命周期与Pod相同,允许数据在容器重启时保持,并可以被Pod中的所有容器访问。

特点和用途

  • 数据持久化: 即使容器停止运行,Volume中的数据也不会丢失。
  • 支持多种存储类型: 支持多种类型的存储卷,包括本地存储、网络存储(如NFS、GlusterFS、CEPH)和云存储(如AWS EBS、GCE Persistent Disk)。
  • 共享和重用: 一个Volume可以被Pod中的多个容器挂载和访问。

CSI(容器存储接口)

概述

CSI是一种标准化的接口,允许Kubernetes连接到各种第三方存储提供者,从而使得部署和使用新的存储系统变得更加容易和灵活。

特点和用途

  • 扩展性: 开发者可以创建自定义存储解决方案,无需修改Kubernetes核心代码。
  • 标准化: 提供了一个通用的接口,用于挂载卸载卷、动态配置卷等操作。
  • 支持多种存储解决方案: 接入各种存储技术,如块存储、文件系统、对象存储等。

ConfigMap

概述

ConfigMap是用于存储配置信息的Kubernetes对象,它允许开发者将配置与容器镜像分离,从而增加应用部署和更新的灵活性。

特点和用途

  • 配置解耦: 应用配置可以从容器镜像中分离,便于管理和更新。
  • 动态配置: 应用在运行时可以访问ConfigMap中的配置,支持动态调整配置。
  • 共享配置: ConfigMap可以被集群中的多个Pod共享。

Secret

概述

Secret用于存储敏感信息,如密码、OAuth令牌和ssh密钥,与ConfigMap类似,但用于更安全的信息管理。

特点和用途

  • 数据加密: 在etcd中加密存储Secret中的数据。
  • 限制访问: 通过Kubernetes的权限控制来限制对Secret的访问。
  • 环境变量和卷挂载: 以环境变量或挂载到Pod的文件系统中的方式使用Secret。

DownwardAPI

概述

DownwardAPI允许Pod通过字段引用和环境变量来访问关于自身的信息,如节点的名称、Pod的名称和命名空间等。

特点和用途

  • 自我意识: 容器可以获取关于自己的运行环境信息。
  • 无需修改应用: 应用无需被修改即可访问它们运行的环境信息。
  • 动态应用配置: 根据Pod的环境信息动态调整应用行为。



4、集群(Cluster)

Kubernetes中的资源管理和访问控制是通过一系列抽象和实体来实现的,这包括Namespace、Node、Role、ClusterRole、RoleBinding和ClusterRoleBinding。

Namespace

概述

Namespace 提供了一种隔离和组织集群内资源的方法,让资源在逻辑上分组,便于管理和访问控制。

特点和用途

  • 隔离: 不同 Namespace 中的资源名称可以相同,但在同一个 Namespace 中资源名称必须唯一。
  • 默认 Namespace: 新创建的资源对象如果没有指定 Namespace,会默认隶属于 default Namespace。
  • 资源管理: 支持通过 Namespace 对资源进行分组管理,如资源使用量限制。

Node

概述

Node 是 Kubernetes 集群中的工作节点,可以是虚拟机或物理机器,运行集群工作负载。

特点和用途

  • 唯一标识符: 每个 Node 在当前集群中必须具有唯一的标识符。
  • 工作负载承载: 负责运行 Pod,提供应用程序和服务运行的环境。
  • 资源提供: 提供计算、存储和网络资源给 Pod。

Role

概述

Role 定义在 Namespace 级别的权限集合,由规则组成,指定在该 Namespace 中可以执行的操作。

特点和用途

  • 名称空间级别: 仅在声明它的 Namespace 内有效。
  • 权限集合: 定义 Namespace 内可执行的操作,如资源的创建、获取和删除。

ClusterRole

概述

ClusterRole 是集群级别的权限集合,由规则组成,指定可以执行的跨 Namespace 的操作或对全局资源的操作。

特点和用途

  • 集群级别: 权限可以跨 Namespace 生效。
  • 广泛权限: 定义对集群范围内资源的操作权限,如节点管理、监视和日志获取。

RoleBinding

概述

RoleBinding 将 Role 中定义的权限赋予给一个或一组用户,隶属于一个 Namespace,并且仅在该 Namespace 中作用。

特点和用途

  • 权限赋予: 将 Role 权限赋予给用户、组或服务账户。
  • 名称空间作用域: 仅在其所属 Namespace 内赋予权限。

ClusterRoleBinding

概述

ClusterRoleBinding 将 ClusterRole 中定义的权限赋予给一个或一组用户,作用于全局 Namespace。

特点和用途

  • 集群范围权限赋予: 将 ClusterRole 权限赋予给用户、组或服务账户,权限在整个集群范围内有效。
  • 支持全局和局部赋权: 主要用于赋予集群级别的权限,也可以用于在所有 Namespace 中赋予局部 Role 的权限。



5、元数据(Metadata)

Kubernetes提供了强大的机制来管理和自动化应用的伸缩、配置和资源限制。

HPA(Horizontal Pod Autoscaler)

概述

HPA,或水平Pod自动扩缩,自动调整工作负载类型资源(如Deployment、ReplicaSet)副本数量的资源对象,基于指定指标(CPU利用率、内存使用量或自定义指标)动态增减Pod副本数以应对负载变化。

特点和用途

  • 动态伸缩: 自动根据实时负载调整Pod数量,提高资源利用率和应用响应能力。
  • 指标监控: 支持内置指标(如CPU、内存利用率)和自定义指标。
  • 配置灵活: 用户定义伸缩策略,包括最小/最大Pod数量,触发伸缩的指标阈值。

PodTemplate

概述

PodTemplate是创建Pod资源的预设模板,定义了Pod的标签、容器规格、卷挂载等。经常被其他资源(如ReplicaSet、Deployment)用于生成具有相同配置的Pod副本。

特点和用途

  • 模板化配置: 定义一次Pod配置,在多处重复使用,确保配置一致性。
  • 保持一致性: 通过模板创建的Pod副本具有相同配置,保持部署一致性。
  • 简化资源定义: 在定义复杂工作负载资源时,引用PodTemplate简化定义过程。

LimitRange

概述

LimitRange是Namespace级别的策略对象,用于限制Namespace内资源的消耗。设置CPU、内存等资源的最小、最大、默认请求和默认限制,防止资源滥用,确保资源公平分配和高效使用。

特点和用途

  • 资源控制: 限制Namespace内资源使用,包括Pod、容器和持久化卷申领。
  • 预防资源滥用: 防止任一应用或用户占用过多资源,保障资源公平性。
  • 资源策略管理: 为资源设置最大/最小限制,帮助管理Namespace内资源消耗。