这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」 之前了解了k8s到底是什么,接下来看看k8s的组成。
statefulSet
statefulSet主要解决的是有状态服务的问题. docker主要面对的是无状态服务。
服务的分类:
1. 无状态服务: 踢出去过段时间放回来, 依然能正常工作. 比如LVS调度器, APACHE(http服务)
为什么apache是无状态服务呢? 因为apache中的数据可以通过共享服务来完成. 对于组件本身他不需要数据, 也没有数据的更新. 所以, apache被定义到无状态服务里面.
docker: 对于docker来说, 他更适合运行的是无状态服务.
2. 有状态服务: 踢出集群后过段时间再放回来, 就不能正常工作了, 这样的服务就是有状态服务. 比如: 数据库DBMS, 因为有很大一部分数据缺失了.
Kubernetes的一个难点就是必须要攻克有状态服务. 那么, 有状态服务, 有些数据需要持久化, 需要保存起来, 这时,我们就会引入存储的概念.
主要解决的是有状态服务的问题. docker主要面对的是无状态服务, 无状态服务的含义时, 没有对应的存储需要实时的保留. 或者是把他摘出来, 经过一段时间以后, 放回去依然能够工作. 典型的无状态服务有哪些呢? 比如: apache服务, LVS服务(负载均衡调度器) . 典型的有状态服务有哪些呢?mysql, mongodb, 他们需要实时的对数据进行更新和存储. 把他抽离出集群,再放回来就没办法工作了. statefulSet就是为了解决有状态服务而诞生的. Deployment 和 ReplicaSet是无状态服务
statefulset的应用场景包括:
1>稳定的持久化存储.
即Pod重新调度后还是能访问到相同的持久化数据. 基于PVC来实现.
Pod重新调度指的是Pod死亡以后, 我们会在调度回来。也就是创建一个新的Pod,创建的这个新的Pod取代原来的Pod的时候, 他的存储依然是之前的存储, 并不会变, 并且里面的数据也不会丢失.
2> 稳定的网络标识:
即Pod重新调度后,其PodName和HostName是不变的,也就是说之前的Pod叫什么, 现在Pod就叫什么. 之前的主机名是什么,现在的主机名还是哪个。 基于Headless Service(即没有Cluster IP 的Service)来实现。
3> 有序部署.
有序部署分为扩展和回收两个阶段.
- 有序扩展. 即Pod是有顺序的, 再部署或扩展的时候, 要依据定义的顺序一次进行(即从0到n-1, 在下一个pod运行之前, 所有之前的Pod必须都是Running和Ready的标志), 基于init Containars实现
只有当前一个Pod处于running和ready的状态, 第二个才可以被创建. 为什么需要这样部署呢? 原因是, 我们构建一个集群化, 比如集群里有nginx, apache, mysql. 我们的启动顺序是先启mysql, 再启apache, 再启nginx, 因为他们之间是有依赖关系的. nginx依赖apache, apache依赖mysql. 这就是有序部署.
4> 有序收缩, 有序删除
回收也是一样的是有序的, 不同的是, 他是逆序回收. 从n-1开始, 一直到0.
vi. DaemonSet:
确保全部(或一些)Node上运行一个Pod的副本. 当有Pod加入集群时, 也会为他们增加一个Pod副本, 当有Pod从集群移除时, Pod副本也会被回收,删除DeamonSet会删除对应的所有的Pod.
- 这里说的是确保全部或者一些,为什么会是一些呢?这是因为,我们可以在node上打污点,打上污点的node是不被调度的。所以,在DaemonSet运行的时候,打了污点的node是不会被创建的。默认情况下,所有node都会被运行。每个pod只会创建一个副本。
使用DaemonSet的典型用法:
- 运行集群存储daemon, 例如在每个Node上运行glusterd, ceph.
- 在每个节点上运行日志收集daemon, 例如fluentd, logstash.
- 在每个节点上运行监控daemon, 例如Prometheus, Node Exporter.
只要有需求,每个node上都可以运行一个守护进程,去帮我们做一些事情,这个时候就可以使用DaemonSet
vii. Job, CronJob
-
Job是负责批处理的任务. 仅执行一次的任务, 它保证批处理任务的一个或多个Pod成功结束
比如: 我想备份数据库, 备份代码可以放在Pod里, 我们将其放到Job里去执行,脚本是可以正常执行正常工作。直接在linux操作, 到时间就可以把脚本运行, 执行出来. linux操作系统执行不也是一样的么?
一方面封装成pod, 我们可以重复利用;
另一方面,如果脚本执行意外退出,是没办法重复执行的,job如果判断当前脚本不是正常退出,她会重新执行一遍脚本.直到正常退出为止,并且还可以设置政策退出的次数.
-
CronJob管理基于时间的Pob, 在特定的时间可以执行
即
》在给定的时间点只运行一次
》周期性的再交给时间点运行