Kubernetes 核心概念之2.0 Controller 控制器
官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/
什么是 Controller
你的应用以容器的形式在 Pods 中运行;但是直接管理单个 Pod 的工作量将会非常繁琐。例如,如果一个 Pod 失败了,你可能希望运行一个新的 Pod 来替换它。Kubernetes 可以为你完成这些操作。这个就是 Controller。
Controller 是在集群上管理和运行 Pod 的对象。
Pod 和 Controller 的关系
Pod 是 Kubernetes 中最小的可调度和可管理的单元,Pod 可以由单个或多个容器组成,它们共享存储、网络,并在同一主机上运行。。Pod 拥有独立的 IP 地址和卷,可以提供应用程序的运行环境。然而,Pod 的生命周期相对较短,当不再需要时,它可以被删除或重新创建。
Controller 用于管理 Pod 的副本和更新策略。它可以确保指定数量的 Pod 副本运行,并在故障或升级时自动进行滚动更新,还可以弹性伸缩。
Pod 和 Controller 之间是通过 label 标签来建立关系,同时 Controller 又被称为控制器工作负载。
Controller 种类
无状态应用 Deployment
- 认为 Pod 都是一样的,不具备与其他实例有不同的关系。
- 没有顺序要求。
- 不考虑应用在哪个 node 上运行。
- 能够进行随意伸缩和扩展。
Deployment(也间接包括 ReplicaSet)是在集群上运行应用的最常见方式。Deployment 适合在集群上管理无状态应用工作负载,其中 Deployment 中的任何 Pod 都是可互换的,可以在需要时进行替换。(Deployment 替代原来的 ReplicationController API)。
有状态应用 Statefulset
- 数据不完全一致。
- 每个 Pod 独立的,保持 Pod 启动顺序和唯一性。
- 唯一的网络标识符,持久存储。
- 有序,比如 MySQL 中的主从。
StatefulSet 允许你管理一个或多个运行相同应用代码、但具有不同身份标识的 Pod。 StatefulSet 与 Deployment 不同。Deployment 中的 Pod 预期是可互换的。StatefulSet 最常见的用途是能够建立其 Pod 与其持久化存储之间的关联。例如,你可以运行一个将每个 Pod 关联到 PersistentVolume 的 StatefulSet。如果该 StatefulSet 中的一个 Pod 失败了,Kubernetes 将创建一个新的 Pod,并连接到相同的 PersistentVolume。
守护进程 DaemonSet
DaemonSet 定义了在特定节点上提供本地设施的 Pod,例如允许该节点上的容器访问存储系统的驱动。当必须在合适的节点上运行某种驱动或其他节点级别的服务时,你可以使用 DaemonSet。DaemonSet 中的每个 Pod 执行类似于经典 Unix/POSIX 服务器上的系统守护进程的角色。DaemonSet 可能对集群的操作至关重要,例如作为插件让该节点访问集群网络,也可能帮助你管理节点,或者提供增强正在运行的容器平台所需的、不太重要的设施。
你可以在集群的每个节点上运行 DaemonSets(及其 Pod),或者仅在某个子集上运行(例如,只在安装了 GPU 的节点上安装 GPU 加速驱动)。
离线任务 Job CronJob
你可以使用 Job 和/或 CronJob 定义一次性任务和定时任务。Job 表示一次性任务,而每个 CronJob 可以根据排期表重复执行。