K8S中Pod控制器之ReplicaSet(RS)控制器

devtools/2025/1/21 14:57:01/

Pod控制器介绍

在Kubernetes中,Pod是最小的管理单元,用于运行容器。根据Pod的创建方式,可以将其分为两类:

  • 自主式Pod(Stateless Pods):这些Pod是直接由用户或管理员创建的,通常是通过直接使用kubectl run命令或通过YAML文件定义来创建的。这些Pod在创建后由Kubernetes直接管理,但它们的生命周期是独立的。这意味着如果这些Pod被删除,Kubernetes不会自动重建它们。自主式Pod通常用于运行短生命周期的任务或服务,例如批处理作业、数据迁移等。

  • 控制器创建的Pod(Managed Pods):这些Pod是由Kubernetes控制器创建和管理的。控制器是Kubernetes中的高级对象,它们负责根据定义的规则创建、更新和删除Pod。控制器创建的Pod通常是为了实现更复杂的应用部署和管理需求,例如部署、复制集(ReplicaSet)、状态集(StatefulSet)、DaemonSet等。这些Pod的生命周期是由控制器管理的,如果Pod被删除,控制器会根据其配置自动重建Pod,以确保集群中始终有足够数量的Pod在运行。

Pod控制器(Pod Controller)是Kubernetes中的一种对象,用于管理一组具有相同配置的Pod。Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

常见使用场景

Pod控制器用于管理一组Pod,确保它们按照预定的规则运行和扩展。以下是Kubernetes中常见的几种Pod控制器及其适用场景的整理:

  • ReplicationController:这是早期用于确保指定数量的Pod副本始终运行的控制器,但现在已经不推荐使用,其功能被ReplicaSet所替代。

  • ReplicaSet:用于保证Pod的副本数量维持在用户指定的数量。它支持Pod数量的扩缩容,以及Pod模板的更新,但不涉及应用状态的管理。

  • Deployment:是ReplicaSet的扩展,提供了应用的声明式更新能力。它允许用户定义应用的期望状态,自动处理Pod的创建、更新和删除,支持滚动更新和版本回退。

  • Horizontal Pod Autoscaler (HPA):根据CPU使用率或其他选择的度量指标自动扩展Pod的数量,适用于需要根据负载动态调整Pod数量的场景。

  • DaemonSet:确保在集群中的每个Node上都运行一个Pod的副本,通常用于运行集群存储、日志收集等守护进程类任务。

  • Job:用于运行批处理任务,即执行一次性任务。当Pod完成其工作后,Job控制器会负责清理这些Pod。

  • CronJob:用于周期性地创建Job对象,执行定时任务,类似于Unix中的crontab。

  • StatefulSet:用于管理有状态的服务,它为Pod提供了稳定的网络标识、顺序部署、缩放以及扩展和滚动更新的能力。

 Pod控制器分类

Kubernetes的控制器分为以下几类:

  • 无状态应用:由Deployment和ReplicaSet管理,适用于不需要持久化存储的应用。

  • 有状态应用:由StatefulSet管理,适用于需要持久化存储和有序部署的应用。

  • 守护型应用:由DaemonSet管理,适用于需要在所有或特定Node上运行的服务。

  • 批处理应用:由Job和CronJob管理,适用于执行一次性或周期性任务。

 Pod与控制器之间的关系

  • Pod与控制器之间的关系是,控制器是Kubernetes中用于管理一组Pod的高级对象,而Pod是Kubernetes中运行容器的最小单元。

  • 控制器通过定义一组标签选择器来跟踪和控制具有这些标签的Pod。

  • 当Pod因故障而终止时,控制器会根据定义的规则自动创建新的Pod来替换它,从而确保应用的持续运行和所需的副本数量

  • 此外,控制器还负责处理Pod的水平扩展、版本更新和滚动升级等运维任务,而Pod本身只负责运行容器化的应用。

  • 控制器为Pod提供了生命周期管理和运维自动化的框架。

image-20240511105927782

 ReplicaSet(RS)控制器

  • ReplicaSet(RS)是一种Kubernetes控制器,用于确保指定数量的Pod副本始终运行,从而提供高可用性和负载均衡。副本集通过监控和管理Pod的副本数量,自动进行Pod的创建、更新和删除,以维护用户定义的副本数量。

image-20240511110654582

 清单文件写法

---
apiVersion: apps/v1  # 版本号
kind: ReplicaSet  # 类型
metadata:    # 元数据name: rs-nginx  # rs名称namespace: default  # 所属命名空间labels:   # 标签controller: rs
spec:   # 详情描述replicas: 3  # 副本数量selector:    # 选择器,通过它指定该控制器管理哪些podmatchLabels:app: nginx-pod  # Labels匹配规则matchExpressions: # Expressions匹配规则- {key: app, operator: In, values: [nginx-pod]}  # Expressions匹配规则template:        # 模板,当副本数量不足时,会根据下面的模板创建pod副本metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80

创建ReplicaSet

[root@k8s-master ~]# kubectl apply -f pc-replicaset.yaml 
---
apiVersion: apps/v1   # 指定了API版本,这是ReplicaSet所使用的API版本
kind: ReplicaSet
metadata:name: pc-rsnamespace: test
spec:replicas: 3   # 指定了ReplicaSet应该确保在运行的Pod的数量。selector:     # 定义了哪些Pod应该被ReplicaSet管理matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1
replicaset.apps/pc-rs created
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
pc-rs-d46gm   0/1     ContainerCreating   0          14s   <none>   k8s-node2   <none>           <none>
pc-rs-fs2ml   0/1     ContainerCreating   0          14s   <none>   k8s-node1   <none>           <none>
pc-rs-xzm7s   0/1     ContainerCreating   0          14s   <none>   k8s-node1   <none>           <none>
[root@k8s-master ~]# kubectl get pod -n test -o wide -w
NAME          READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
pc-rs-d46gm   0/1     ContainerCreating   0          19s   <none>   k8s-node2   <none>           <none>
pc-rs-fs2ml   0/1     ContainerCreating   0          19s   <none>   k8s-node1   <none>           <none>
pc-rs-xzm7s   0/1     ContainerCreating   0          19s   <none>   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running             0          33s   10.244.36.71   k8s-node1   <none>           <none>
pc-rs-fs2ml   1/1     Running             0          33s   10.244.36.72   k8s-node1   <none>           <none>
^C[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS              RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-d46gm   0/1     ContainerCreating   0          58s   <none>         k8s-node2   <none>           <none>
pc-rs-fs2ml   1/1     Running             0          58s   10.244.36.72   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running             0          58s   10.244.36.71   k8s-node1   <none>           <none>[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
pc-rs-d46gm   1/1     Running   0          113s   10.244.169.129   k8s-node2   <none>           <none>
pc-rs-fs2ml   1/1     Running   0          113s   10.244.36.72     k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running   0          113s   10.244.36.71     k8s-node1   <none>           <none>#查看rs
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES         SELECTOR
pc-rs   3         3         3       2m8s   nginx        nginx:1.17.1   app=nginx-pod

ReplicaSet扩缩容

  • 方法一:编辑ReplicaSet pc-rs

  • 方法二:使用命令修改

[root@k8s-master ~]# kubectl edit rs pc-rs -n test
replicaset.apps/pc-rs edited
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
pc-rs   6         6         6       3m    nginx        nginx:1.17.1   app=nginx-pod
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pc-rs-b24tf   1/1     Running   0          35s     10.244.169.131   k8s-node2   <none>           <none>
pc-rs-d46gm   1/1     Running   0          3m16s   10.244.169.129   k8s-node2   <none>           <none>
pc-rs-f7mqb   1/1     Running   0          35s     10.244.36.73     k8s-node1   <none>           <none>
pc-rs-fs2ml   1/1     Running   0          3m16s   10.244.36.72     k8s-node1   <none>           <none>
pc-rs-mqk6x   1/1     Running   0          35s     10.244.169.130   k8s-node2   <none>           <none>
pc-rs-xzm7s   1/1     Running   0          3m16s   10.244.36.71     k8s-node1   <none>           <none>
[root@k8s-master ~]# kubectl scale rs pc-rs --replicas 2 -n test
replicaset.apps/pc-rs scaled
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS        RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pc-rs-b24tf   0/1     Terminating   0          66s     10.244.169.131   k8s-node2   <none>           <none>
pc-rs-d46gm   0/1     Terminating   0          3m47s   <none>           k8s-node2   <none>           <none>
pc-rs-f7mqb   0/1     Terminating   0          66s     10.244.36.73     k8s-node1   <none>           <none>
pc-rs-fs2ml   1/1     Running       0          3m47s   10.244.36.72     k8s-node1   <none>           <none>
pc-rs-mqk6x   0/1     Terminating   0          66s     <none>           k8s-node2   <none>           <none>
pc-rs-xzm7s   1/1     Running       0          3m47s   10.244.36.71     k8s-node1   <none>           <none>
[root@k8s-master ~]# kubectl get pod -n test -o wide -w
NAME          READY   STATUS        RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-f7mqb   0/1     Terminating   0          69s     10.244.36.73   k8s-node1   <none>           <none>
pc-rs-fs2ml   1/1     Running       0          3m50s   10.244.36.72   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running       0          3m50s   10.244.36.71   k8s-node1   <none>           <none>
pc-rs-f7mqb   0/1     Terminating   0          76s     10.244.36.73   k8s-node1   <none>           <none>
pc-rs-f7mqb   0/1     Terminating   0          76s     10.244.36.73   k8s-node1   <none>           <none>
^C[root@k8s-master ~]# kubectl get pod -n test -o wide 
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-fs2ml   1/1     Running   0          4m    10.244.36.72   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running   0          4m    10.244.36.71   k8s-node1   <none>           <none>

 

ReplicaSet镜像更新

  • 方法一编辑ReplicaSet pc-rs

[root@k8s-master ~]# kubectl edit rs pc-rs -n test
replicaset.apps/pc-rs edited
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR
pc-rs   2         2         2       4m47s   nginx        nginx:1.17.2   app=nginx-pod
[root@k8s-master ~]# kubectl set image rs pc-rs nginx=nginx:1.17.3 -n test
replicaset.apps/pc-rs image updated
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR
pc-rs   2         2         2       5m17s   nginx        nginx:1.17.3   app=nginx-pod

 

ReplicaSet删除

# kubectl delete rs pc-rs -n test# 如果希望仅仅删除RS对象(保留Pod),可以使用kubectl delete命令时添加--cascade=false选项(不推荐)[root@k8s-master ~]# kubectl delete rs pc-rs -n test --cascade=orphan
replicaset.apps "pc-rs" deleted
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
Error from server (NotFound): replicasets.apps "pc-rs" not found
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-fs2ml   1/1     Running   0          12m   10.244.36.72   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running   0          12m   10.244.36.71   k8s-node1   <none>           <none>
#删除之后,不会重新创建,因为控制器已经被删除
[root@k8s-master ~]# kubectl delete pod pc-rs-fs2ml -n test
pod "pc-rs-fs2ml" deleted
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-xzm7s   1/1     Running   0          13m   10.244.36.71   k8s-node1   <none>           <none>

 


http://www.ppmy.cn/devtools/152366.html

相关文章

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…

模板编辑器(PHP)(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…

远程桌面使用是TCP还是UDP?

什么是TCP和UDP&#xff1f; “远程桌面是使用TCP还是UDP协议&#xff1f;我通常在Windows Server 2012 R2服务器上使用远程桌面协议&#xff08;RDP&#xff09;进行连接&#xff0c;最近有些好奇&#xff0c;RDP到底是通过UDP 3389端口还是TCP 3389端口来建立远程会话的&…

【gin】gin中使用protbuf消息传输go案例

在 Gin 中使用 Protobuf 进行高效消息传输 Protobuf&#xff08;Protocol Buffers&#xff09;是一种高效的二进制序列化协议&#xff0c;广泛用于高性能场景的数据传输。相比 JSON&#xff0c;Protobuf 具有更小的体积和更快的解析速度&#xff0c;非常适合服务间通信或前后端…

车载测试和相关面试

资源放下面啦&#xff01; 记得关注❤️&#xff5e;持续分享更多资源 永久链接&#xff1a;https://pan.quark.cn/s/cf64f687a12f

179最大数(贪心算法)分析+源码+证明

文章目录 题目题目分析算法原理 源码证明 思考 题目 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 题目分…

SpringBoot2 + Flowable(UI)

文章目录 引言I 技术栈软件架构基于 Vue.js 和 Element UI 的后台管理系统工程结构II 依赖rest,logic,conf 的依赖工作流flowable jar包flowable-ui所需jar包III 配置jdbc 配置 nullCatalogMeansCurrent = true引言 I 技术栈 软件架构 前端基于vue 、element-ui框架分模块设…

Web开发 -前端部分-CSS-2

一 长度单位 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…