K8s新手系列之ReplicaSet资源


目录在这里嗷~,如有问题请私信我进行修改~


回到顶部

概述

官网地址:ReplicaSet | Kubernetes

ReplicaSet简称rs,其主要作用和ReplicationController一样,保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。

相较于ReplicationController而言,ReplicaSet更加轻量级,且功能更强大,支持正则匹配Pod。

想要学习ReplicationController可以查看这篇文章K8s新手系列之ReplicationController资源

回到顶部

ReplicaSet的作用

  • 副本管理:ReplicaSet 的核心功能是保证在任何时候都有指定数量的 Pod 副本在运行。如果有 Pod 意外终止,ReplicaSet 会自动创建新的 Pod 来替代它;如果 Pod 数量过多,它会删除多余的 Pod。

  • 集群扩容和缩容:用户可以通过修改 ReplicaSet 中的副本数量来轻松地对应用进行扩容或缩容。

  • 灵活的标签选择器

    • 集合式选择器:与 ReplicationController 仅支持等式选择器不同,ReplicaSet 支持更灵活的集合式选择器,如 in、notin、exists 等。这使得 ReplicaSet 能够更精确地选择要管理的 Pod,提高了标签选择的灵活性和表达能力。

    • 动态匹配 Pod:通过标签选择器,ReplicaSet 可以动态地匹配符合条件的 Pod。即使在 ReplicaSet 创建之后,只要有新的 Pod 被创建且其标签符合 ReplicaSet 的选择器,这些 Pod 就会被纳入 ReplicaSet 的管理范围。

回到顶部

ReplicaSet资源配置文件详解

可以通过kubectl explain rs查看创建ReplicaSet需要的字段

示例:

 
[root@node01 ~]# kubectl explain rs
KIND: ReplicaSet
VERSION: apps/v1
DESCRIPTION:
ReplicaSet ensures that a specified number of pod replicas are running at
any given time.
# fileds字段中的内容已进行截取
FIELDS:
apiVersion <string>
kind <string>
metadata <Object>
spec <Object>
status <Object>

通过上述可以发现定义ReplicaSet的资源文件和定义Pod一样,也需要apiVersion、kind、metadata、spec等字段。

但是spec字段中有三个字段,需要注意,分别是replicas、selector、template。如下:

 
[root@node01 ~]# kubectl explain rs.spec
KIND: ReplicaSet
VERSION: apps/v1
RESOURCE: spec <Object>
DESCRIPTION:
Spec defines the specification of the desired behavior of the ReplicaSet.
More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
ReplicaSetSpec is the specification of a ReplicaSet.
FIELDS:
minReadySeconds <integer>
# minReadySeconds 规定了一个时间阈值,只有当 Pod 保持就绪状态的时间达到或者超过这个阈值,并且在此期间 Pod 内的任何容器都没有崩溃,这个 Pod 才会被视为可用。
replicas <integer>
# 定义Pod的副本数量
selector <map[string]string>
# 标签选择器,这里指定Pod定义的标签
template <Object>
# 定义Pod的模板

回到顶部

创建ReplicaSet

这里我们创建三个Pod副本
示例:

 
# 定义资源文件
[root@node01 ~/rs]# cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
app: rs-nginx
spec:
# 定义Pod的副本数量
replicas: 3
# 标签选择器,这里和Pod的Label保持一致
selector:
# 匹配Pod的Label
matchLabels:
app: nginx
# 定义Pod的模板,只需要定义metadata和spec两个字段即可
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest
# 创建ReplicaSet
[root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml

查看对应的ReplicaSet和Pod

查看ReplicaSet

 
[root@node01 ~/rs]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-nginx-1 3 3 3 93s

查看Pod

 
[root@node01 ~/rs]# kubectl get po | grep rs-nginx
rs-nginx-1-6rb9p 1/1 Running 0 2m
rs-nginx-1-ssdhv 1/1 Running 0 2m
rs-nginx-1-vzn2x 1/1 Running 0 2m

回到顶部

验证ReplicaSet的副本管理

ReplicaSet 的核心功能是保证在任何时候都有指定数量的 Pod 副本在运行。如果有 Pod 意外终止,ReplicaSet 会自动创建新的 Pod 来替代它;如果 Pod 数量过多,它会删除多余的 Pod。

当我们删除创建好的Pod时,Replicaset会发生什么呢?

 
# 删除上面创建的所有Pod
[root@node01 ~/rs]# kubectl delete po rs-nginx-1-6rb9p rs-nginx-1-ssdhv rs-nginx-1-vzn2x
pod "rs-nginx-1-6rb9p" deleted
pod "rs-nginx-1-ssdhv" deleted
pod "rs-nginx-1-vzn2x" deleted
# 查看rs,发现其副本数量还是3个
[root@node01 ~/rs]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-nginx-1 3 3 3 5m17s
# 查看Pod,发现对应的Pod还是3个,通过AGE字段发现是新创建的
[root@node01 ~/rs]# kubectl get po | grep rs-nginx
NAME READY STATUS RESTARTS AGE
rs-nginx-1-6h7fv 1/1 Running 0 22s
rs-nginx-1-fhkm9 1/1 Running 0 22s
rs-nginx-1-l5njb 1/1 Running 0 22s

回到顶部

验证Replicaset的扩缩容

验证扩容

我们将rs的副本数量调整成5,看看会发生什么?

 
[root@node01 ~/rs]# cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
app: rs-nginx
spec:
# 将副本数量修改成5
replicas: 5
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest
# 重新应用它
[root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml
replicaset.apps/rs-nginx-1 configured

查看一下Pod的变化:

 
[root@node01 ~/rs]# kubectl get po | grep rs-nginx
NAME READY STATUS RESTARTS AGE
rs-nginx-1-6h7fv 1/1 Running 0 4m17s
rs-nginx-1-fhkm9 1/1 Running 0 4m26s
rs-nginx-1-l5njb 1/1 Running 0 4m26s
rs-nginx-1-t75z7 1/1 Running 0 8s
rs-nginx-1-tdvbr 1/1 Running 0 8s

通过上述发现Pod副本数量由3个变成了5个,查看AGE字段,发现有两个Pod是新建的状态。

验证缩容

同理,我们将副本数量调整成1,看看会发生什么?

 
[root@node01 ~/rs]# cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
app: rs-nginx
spec:
# 将Pod数量调整成1
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest
# 重新应用它
[root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml
replicaset.apps/rs-nginx-1 configured

查看一下:

 
# 查看rs
[root@node01 ~/rs]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-nginx-1 1 1 1 11m
# 查看Pod
[root@node01 ~/rs]# kubectl get po | grep rs-nginx
rs-nginx-1-fhkm9 1/1 Running 0 6m33s

通过上述发现,Pod的数量由5个缩减成1个

回到顶部

Replicaset的标签选择器

Replicaset的标签选择器分为两类,一类是等式选择器,另一类是集合选择器

等式选择器

等式选择器通过 =、==(两者含义相同)或者 != 来筛选标签。其通过spec.selector.matchLabels来实现。

示例:

 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
app: rs-nginx
spec:
replicas: 1
selector:
# 等式选择器
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest

集合选择器

集合选择器借助 in、notin、exists、DoesNotExist 这些操作符来筛选标签。

  • in:用于选取标签值在指定集合内的 Pod。
  • notin:用于选取标签值不在指定集合内的 Pod。
  • exists:用于选取具有指定标签的 Pod,不考虑标签的值。
  • DoesNotExist:用于选取不具有指定标签的 Pod,不考虑标签的值。

其通过spec.selector.matchExpressions来实现

示例:

 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset-set
spec:
replicas: 3
selector:
# 集合选择器
matchExpressions:
# key:指定Label的key,operator:表示操作符,value:表示Label的value
- {key: app, operator: In, values: [nginx]}
- {key: env, operator: NotIn, values: [development, testing]}
template:
metadata:
labels:
app: nginx
env: production
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

回到顶部

管理Replicaset

查看Replicaset

语法:

 
kubectl get rs <rs-name> -n <namespace-name>

示例:

 
[root@node01 ~/rs]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-nginx-1 1 1 1 25m

修改Replicaset

由两种方式,一种是通过kubectl edit rc <rc-name>来进行修改,会打开一个类似vim的界面,修改其对应的值即可,最后wq保存即可应用你的配置.
另一种方式则是修改对应的资源文件,最后使用kubectl apply -f <file>即可。

删除Replicaset

语法:

 
kubectl delete rc <rc-name> -n <namespace-name>
### Kubernetes 初学者指南教程 对于希望学习 Kubernetes新手来说,理解其核心概念和操作方法至关重要。一份结构良好的入门指南应当覆盖基础架构、部署应用和服务管理等内容。 #### 了解基本术语与组件 Kubernetes 是一种用于自动化部署、扩展以及管理容器化应用程序的开源平台。该系统由多个节点组成集群来运行工作负载,并通过控制平面进行管理和协调[^2]。为了更好地掌握这些功能,建议先熟悉以下几个关键要素: - **Pod**: 这是最小可部署单元,通常包含一个或多个紧密关联的应用容器。 - **Service**: 定义了一组逻辑上的 Pod 和访问策略,使得服务发现变得简单易行。 - **Deployment**: 提供声明式的更新方式,可以用来创建新的 ReplicaSet 或者替换现有版本。 - **ConfigMap & Secret**: 存储配置数据和敏感信息的最佳实践工具。 #### 实践练习:安装 Minikube 并启动第一个项目 Minikube 可以帮助开发者快速搭建单机版 Kubernetes 环境,在本地测试各种特性而无需担心生产环境的影响。按照官方文档中的说明完成软件下载之后,只需几条命令就能让一切运转起来[^1]: ```bash minikube start kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4 kubectl expose deployment hello-minikube --type=NodePort --port=8080 minikube service hello-minikube ``` 上述脚本会依次执行如下任务: - 启动虚拟机并初始化小型 K8S 集群; - 创建名为 `hello-minikube` 的 Deployment 资源对象及其副本集; - 将此服务暴露给外部网络请求; - 打开浏览器窗口展示实例页面。 #### 探索更多资源 除了以上介绍的基础知识外,还有许多其他主题值得深入研究,比如持久存储卷(PV/PVC)、命名空间(Namespace),甚至更高级别的 Helm Chart 应用包管理系统等。AWS 提供了一个专门针对机器学习场景优化过的 Deep Learning Container 解决方案,其中也包含了对 Kubeflow 等流行框架的支持[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值