ReplicaSet 控制器
今天继续给大家介绍 Kubernetes 相关知识,本文主要内容是ReplicaSet控制器。
概述:
ReplicaSet 控制器是 Pod 控制器的一种实现,该控制器用于确保其管控的 Pod 对象副本数量在任意时刻都能满足用户期望的数量.ReplicaSet 控制器在启动后自动查找集群种符合条件的 Pod 对象.并进行管理.ReplicaSet 控制取代了 Kubernetes 集群种早期的 ReplicatonController 控制器.
功能
确保 Pod 资源对象的数量符合期望值.根据期望值和当期值得差异,对 Pod 进行缩容或者扩容.
确保 Pod 健康运行.当检测到运行 Pod 资源对象得节点发生故障时,请求调度器在其他节点上创建 Pod
弹性伸缩. ReplicaSet 控制器可以对 Pod 资源对象进行弹性得扩容或者缩容.必要时还可以通过 HPA 控制器实现 Pod 资源规模得自动伸缩
核心字段
在资源清单中,ReplicaSet 控制器得 spec 下的核心字段如下:
replicas 指定期望的 Pod 副本的数量
selector 指定 ReplicaSet 控制器的标签选择器, 支持 matchLables 和 mastchExPressions 两种匹配机制
template 用于定义 ReplicaSet 控制的 Pod 资源对象的一些参数
minReadySeconds 用于定义 Pod 启动后多长时间为可用状态
应用场景
假如我们现在有个 Pod 正在提供线上服务 ,我们来想一想我们会遇到的场景:
某次运营活动非常成功,网站访问量突然暴增
运行当前 Pod 的节点发生了故障了.Pod 不能正常提供服务了
第一种 ,比较好应付,活动之前我们可以大概计算下会有多大的访问量,提前多启动几个 Pod 副本,活动结束后把多余的 Pod 杀掉,虽然有的麻烦 .但是还是能够应对这种情况的.
第二种 , 可能某天夜里收到大量报警说服务挂了,然后起来打开电脑在另外的节点上重新启动一个新的 Pod,问题可以解决
但是如果我们都人工去解决遇到的这些问题,似乎回到了以前刀耕火种的时代是吧?
如果有一种工具能够帮助我们自动管理 Pod 就好了,Pod 挂了自动帮我在合适的节点上重新启动一个 Pod,这样不是遇到上面的问题我们都不需要手动去解决了.
而 ReplicaSet 这种资源对象就可以来帮助我们实现这个功能 Replicaset 的主要作用就是维持一组 Pod 副本的运行,保证一定的数量的 Pod 在集群中正常运行,ReplicaSet 控制器会持续监听它说控制的这些 Pod 的运行状态,在 Pod 发送故障数量减少或者增加时会触发调度过程,始终保持副本数量一定.
Pod 模板
Pod 模板这个概念非常重要,因为后面我们讲解到的大多数控制器,都会使用 Pod 模板来统一定义它所要管理的 Pod。更有意思的是,我们还会看到其他类型的对象模板,比如 Volume 的模板登。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
namespace: default
spec:
replicas: 3 # 期望的 Pod 副本数量,默认值为1
selector: # Label Selector,必须匹配 Pod 模板中的标签
matchLabels:
app: nginx
template: # Pod 模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
创建上面的资源对象
kubectl apply -f nginx-rs.yaml
# kubectl apply -f nginx-rs.yaml
replicaset.apps/nginx-rs created
$ kubectl get rs nginx-rs
NAME DESIRED CURRENT READY AGE
nginx-rs 3 3 3 17m
通过查看 RS 可以看到当前资源对象的描述信息,包括DESIRED、CURRENT、READY的状态值,创建完成后,可以利用如下命令查看下 Pod 列表:
$ kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-rs-nxklf 1/1 Running 0 52s
nginx-rs-t46qc 1/1 Running 0 52s
nginx-rs-xfqrn 1/1 Running 0 52s
彻底删除
$ kubectl delete rs nginx-rs
# 或者执行 kubectl delete -f nginx-rs.yaml