Kubernetes Pod调度基础
- pod控制器
- 复制控制器(RC)
(为pod做副本)
- 复制集(RS)集合(set)
(为pod做副本),是一个基于集合的标签选择器
与复制控制器最大的不同就是在标签与选择器方面
-
- APIServer支持两种标签选择器
- 基于等式的标签选择器
- 在这种选择方式下可以使用=、==、!=三种操作符来进行选择,前两个的含义是一样的,都代表相等,第三种代表不等。选择条件可以通过,叠加,例如date=day1,name!=build 代表选择 date 值为 day1 且 name 值不为 build 的对象。
- 基于集合的标签选择器
- 这种选择器可以同时选择一组对象。支持的操作符有:in、notin、exists。具体的使用方法为:选择 date 包含有值为 day1、day2、day3 的标签:date in(day1,day2,day3)选择 name 值不为 build、pipline 的标签:name notin(build,pipline)选择所有包含 test 的标签:test。选择所有不包含 test的标签:!test基于集合的标签选择器也支持使用“,”分隔以同时叠加选择,相同意义上的选择条件在这两种选择方式之间是等价的。
- 基于等式的标签选择器
- APIServer支持两种标签选择器
- 无状态集 deployment(部署):是复制集的管理者
- 滚动更新(不影响当正在进行的应用程序)——》附带回滚
- 修改副本数量(扩缩容)
- 服务器本身不存储任何信息
- 没有特殊状态的服务,服务器对请求进行无差别处理
- 特点:
- 数据方面:不会在本地持久化存储数据,多个实例共享相同的持久化数据
- 结果方面:多个服务实例对于同一个用户请求的响应结果是完全一致的
- 关系方面:服务实例之间没有依赖关系
- 影响方面:在k8s控制器中动态启动或停止无状态服务的pod并不会对其他pod产生影响
- 示例:nginx实例,Tomcat实例、Web应用
- 有状态集(STS)
- 容器数据持久化保持
- 常用于部署有状态的且需要有序启动的应用程序,例如Elasticsearch集群、MongoDB集群、RabbitMQ集群、Redis集群、Kafka集群、Zookeeper集群
- 特征:
- 数据方面:需要持久化存储、例如分布式数据库
- 结果方面:实例之间,请求结果可能不一致
- 关系方面:分布式节点之间有依赖关系、例如主从关系
- 影响方面:k8s停止分布式集群中任何一个实例,都有可能会导致数据丢失或者集群崩溃
(stateful管理有状态的应用,pod有以下特征)
1、唯一性:每个pod被分配一个唯一序列号
2、顺序性:pod启动、更新、销毁都是按顺序进行
3、稳定的网络标识:pod主机名、DNS地址不会随着pod重新调度而发生变化
4、稳定的持久化存储:pod被重新调度后,仍然能挂载原有的PV,保证了数据的完整性和一致性
- 守护进程集(DS)
- 有时候我们需要在每个 Kubernetes 节点或符合条件的节点上都部署某个应用,那么就可以使用 Kubernetes 的 DaemonSet 调度 Pod。Daemonset 确保全部(或符合条件)的节点上运行一个Pod 副本。当有新的节点加入集群时,也会为他们新增一个 Pod,当节点从集群中移除时,这些 Pod会被回收,删除 Daemonset将会删除它创建的所有的 Pod。
- 计划任务
无状态集和有状态集之间的区别:
无状态服务
服务不依赖自身的状态,实例的状态数据可以维护在内存中。
任何一个请求都可以被任意一个实例处理。
不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。
在一个封闭的系统中,只存在一个数据闭环。
通常存在于单体架构的集群中。
有状态服务
服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。
一个请求只能被某个节点(或者同等状态下的节点)处理。
存储状态数据,实例的拓展需要整个系统参与状态的迁移。
在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。
通常存在于分布式架构中。
pod调度命令
- 创建一个资源对象类型为复制控制器的pod
- 复制控制器的yaml文件内容
- 查看创建的pod详细信息
- 删除其中一个副本(指定要删除的副本的名称)
- 由于yaml文件中指定的pod的副本数量是3个,只删除其中一个,删除之后会自动生成一个新的pod的副本
- 删除整个pod(指定pod的yaml文件)
- 创建一个资源对象类型为复制集的pod
- 复制集的yaml文件的内容
- 查看、删除方法一如既往
- 创建一个无状态集(deployment),
- 查看deployment状态
- 使用rollout查看deployment创建过程
- 更新deployment的pod的镜像版本
- 使用命令行更新
-
- 在线编辑
- 更新完镜像版本之后,有生成新的
- 使用describe查看跟新的详细信息
- 查看deployment历史更新操作
- 查看特定某一次的更新操作
- 回滚到某一次的版本
(后面不跟回滚到的某一次,默认是回滚到上一次的版本)
- 调整pod的副本数量
- 创建有状态集statefulset控制器
- 查看集群状态
- 查看statefulset状态
- 查看pod信息
- 扩展集群数量,并查看结果
- 非级联删除
删除 statefulset 有两种方式:级联删除和非级联删除。
使用非级联方式删除Statefulset 时,Statefulset 的 Pod 不会被删除。使用级联方式删除Statefulset 时,statefulset 和它的 Pod 都会被删除。
-
- 非级联删除
-
- 级联删除(直接删除指定文件)
- 创建守护进程集daemonset
- 先创建一个dev的命名空间
-
- 根据yaml文件创建daemonset
-
- 查看daemonset详细信息
-
- 查看pod所在节点(要加上命名空间)
-
- 删除daemonset守护进程集
- 创建计划任务CronJob
- 创建cronjob
-
- 查看cronjob
-
- 查看生成的pod(由于设定的是每分钟执行一次,所以结果要等一分钟之后才有)
-
- 查看生成的pod
-
- 查看pod生成的日志
-
- 删除cronjob计划任务