k8s控制器
一、Pod控制器及其功用
Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,确保以一定的数量和副本可以运行,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。
二、pod控制器有多种类型
1、ReplicaSet: 代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
ReplicaSet主要三个组件组成:
(1)用户期望的pod副本数量
(2)标签选择器,判断哪个pod归自己管理
(3)当现存的pod数量不足,会根据pod资源模板进行新建
帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是借助于使用Deployment。
2、Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。
ReplicaSet 与Deployment 这两个资源对象逐步替换之前RC的作用。
3、DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
特性:服务是无状态的
服务必须是守护进程
4、StatefulSet:管理有状态应用
5、Job:只要完成就立即退出,不需要重启或重建
6、Cronjob:周期性任务控制,不需要持续后台运行
三、Pod与控制器之间的关系
Pod和控制器之间的关系是通过Label和Label Selector建立的。
每个Pod都可以定义一组Label,而控制器则使用Label Selector来选择和管理这些Pod。
例如,一个Deployment可以定义一个Label Selector来选择具有特定Label的Pod,并管理这些Pod的副本数量、滚动更新等。
四、具体实验
4.1、Deployment
应用场景:web服务
部署无状态应用
管理Pod和ReplicaSet
具有上线部署、副本设定、滚动升级、回滚等功能
提供声明式更新,例如只更新一个新的image
示例:
vim nginx-deployment.yaml
apiVersion: apps/v1 # 指定使用的Kubernetes API版本
kind: Deployment # 声明这是一个Deployment资源
metadata:name: nginx-deployment # Deployment的名称labels: # 为Deployment添加标签,方便后续筛选和管理app: nginx-bq1 # 标签的键为app,值为nginx-bq1
spec:replicas: 3 # 指定要运行的Pod副本数量selector: # 定义Pod选择器,用于匹配哪些Pod应该被该Deployment管理matchLabels:app: nginx-bq1 # 选择器使用的标签键和值,与Pod模板中的标签一致template: # 定义Pod模板,用于创建Podmetadata:labels:app: nginx-bq1 # Pod的标签,与选择器中的标签一致,确保Deployment能够正确管理这些Podspec:containers: # Pod中容器的列表- name: nginx # 容器的名称image: nginx:1.15.4 # 容器使用的镜像,这里使用的是nginx的1.15.4版本ports:- containerPort: 80 # 容器暴露的端口,这里暴露的是80端口
kubectl create -f nginx-deployment.yaml
kubectl get pods,deploy,rs
查看控制器配置
kubectl edit deployment/nginx-deployment
查看历史版本
kubectl rollout history deployment/nginx-deployment
4.2、SatefulSet
部署有状态应用
- 常见的应用场景:数据库(主从复制)
需要三个条件
1、启动顺序
2、pod有独立的存储
3、IP地址有独立的变化
StatefulSet 运行一组 Pod,并为每个 Pod 保留一个稳定的标识。 这可用于管理需要持久化存储(2),稳定唯一网络标识(3)的应用。↓
StatefulSet 为它们的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建的, 但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
尽管 StatefulSet 中的单个 Pod 仍可能出现故障, 但持久的 Pod 标识符使得将现有卷与替换已失败 Pod 的新 Pod 相匹配变得更加容易。在这里可以使用存储卷为工作负载提供持久存储
- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
- 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(无头模式,即没有Cluster IP的Service)来实现有序部署,
- 有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现有序收缩,有序删除(即从N-1到0)
总结一下
- 给定 Pod 的存储必须由pv provisioner 基于所请求的 storage class