Controller在kubernetes中是一个比较重要的概念,本节教程会向大家讲解一下Controller的概念知识和不同种类的Controller应该在哪里使用和怎么使用。

Kubernetes 通常不会直接创建 Pod,而是通过 Controller 来管理 Pod 的。Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。

  1. ReplicaSet:实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,我们通常不需要直接使用 ReplicaSet。
    通过Deployment去使用ReplicaSet的话我们就不需要担心和其他机制的冲突(如:ReplicaSet不支持滚动更新,但是Deployment支持)。
  2. Deployment:这是在使用kubernetes时候,大家部署系统或者是服务经常使用的一种controller类型。因为我们可以通过它来使用ReplicaSet来为我们部署的应用进行副本的创建。
    一般在实际的运用中,大家用 Deployment 做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。
  3. 如何查看k8s的ingress控制器 k8s的controller_Pod

  4. DaemonSet :用于每个 Node 最多只运行一个 Pod 副本的场景。正如其名称所揭示的,DaemonSet 通常用于运行 daemon。当有Node加入集群时,也会为他们新增一个Pod,当有Node从集群中移除时,这个Pod同时也会回收。在删除DaemonSet的时候,会删除他创建的所有Pod。

使用DaemonSet的一些例子:
1.运行在集群存储的daemon,例如在每个node上运行的ceph;
2.在每个node上运行日志收集daemon,例如fluentd、logstash;
3.在每个node上运行的监控daemon,例如Prometheus Node Exporter。

  1. StatefuleSet :是为了解决有状态服务的问题(对应Deployment和ReplicaSet是为无状态服务而设计的)。能够保证 Pod 的每个副本在整个生命周期中名称是不变的。而其他 Controller 不提供这个功能,当某个 Pod 发生故障需要删除并重新启动时,Pod 的名称会发生变化。同时 StatefuleSet 会保证副本按照固定的顺序启动、更新或者删除。

应用的场景:
1.需要稳定的持久化存储;
2.需要稳定的网络标志(即Pod被重新调度时网络访问不变);
3.有序部署和有序扩展;
4.有序收缩和删除。

使用的服务有:MySQL集群、MongoDB集群、Akka集群、ZooKeeper集群等。

5.Job :批处理任务通常并行(或者串行)启动多个计算进程去处理一批工作项(work item),在处理完成后,整个批处理任务结束。适用于运行结束就删除的应用。而其他 Controller 中的 Pod 通常是长期持续运行。

6.CronJob:相应的,kubernetes为我们提供定时进行的批处理任务,解决了某些批处理任务需要定时反复执行的问题