高级使用-ReplicaSet控制器
# 1 ReplicaSet概述
ReplicaSet
是取代早期版本中的ReplicationController
控制器,其功能基本上与ReplicationController
相同
ReplicaSet
(简称RS)是Pod
控制器类型的一种实现,用于确保由其管控的Pod
对象副本数在任意时刻都能精确满足期望的数量,ReplicaSet
控制器资源启动后会查找集群中匹配器标签选择器的Pod
资源对象,当前活动对象的数量与期望的数量不吻合时,多则删除,少则通过Pod
模板创建以补足。
# 2 ReplicaSet功能
ReplicaSet
能够实现以下功能:
# 2.1 精确反应期望值
确保Pod资源对象的数量精确反映期望值:ReplicaSet
需要确保由其控制运行的Pod副本数量精确吻合配置中定义的期望值,否则就会自动补足所缺或终止所余。
# 2.2 保证高可用
**确保Pod健康运行:**探测到由其管控的Pod
对象因其所在的工作节点故障而不可用时,自动请求由调度器于其他工作节点创建缺失的Pod
副本。
# 2.3 弹性伸缩
**弹性伸缩:**可通过ReplicaSet
控制器动态扩容或者缩容Pod
资源对象的数量,必要时还可以通过HPA
控制器实现Pod
资源规模的自动伸缩。
# 3 创建ReplicaSet
# 3.1 核心属性
spec字段一般嵌套使用以下几个属性字段:
字段值 | 类型 | 描述 |
---|---|---|
replicas | Integer | 指定期望的Pod对象副本数量 |
selector | Object | 当前控制器匹配Pod对象副本的标签选择器,支持matchLabels和matchExpressions两种匹配机制 |
template | Object | 用于定义Pod时的Pod资源信息 |
minReadySeconds | Integer | 用于定义Pod启动后多长时间为可用状态,默认为0秒 |
# 3.2 ReplicaSet示例
# 3.2.1 创建资源清单
vi nginx-rs.yml
apiVersion: apps/v1 #api版本定义
kind: ReplicaSet #定义资源类型为ReplicaSet
metadata: #元数据定义
name: nginx-rs
namespace: default
spec: #ReplicaSet的规格定义
replicas: 2 #定义副本数量为2个
selector: #标签选择器,定义匹配Pod的标签
matchLabels:
app: nginx
template: #Pod的模板定义
metadata: #Pod的元数据定义
name: nginx-pod #自定义Pod的名称
labels: #定义Pod的标签,需要和上面的标签选择器内匹配规则中定义的标签一致,可以多出其他标签
app: nginx
spec: #Pod的规格定义
containers: #容器定义
- name: nginx #容器名称
image: nginx:1.12 #容器镜像
imagePullPolicy: IfNotPresent #拉取镜像的规则
ports: #暴露端口
- name: http #端口名称
containerPort: 80
# 3.2.2 创建rs控制器
kubectl apply -f nginx-rs.yaml
# 3.2.3查看rs控制器
kubectl get rs
# 3.2.4查看pod容器
通过查看pod可以看出pod命令是规则是前面是replicaset控制器的名称加随机生成的字符串
kubectl get pods -o wide -w
# 4 更新控制器
修改上面创建的
replicaset
示例文件,将镜像nginx:1.12
改为1.20
版本
vi nginx-rs.yml
apiVersion: apps/v1 #api版本定义
kind: ReplicaSet #定义资源类型为ReplicaSet
metadata: #元数据定义
name: nginx-rs
namespace: default
spec: #ReplicaSet的规格定义
replicas: 2 #定义副本数量为2个
selector: #标签选择器,定义匹配Pod的标签
matchLabels:
app: nginx
template: #Pod的模板定义
metadata: #Pod的元数据定义
name: nginx-pod #自定义Pod的名称
labels: #定义Pod的标签,需要和上面的标签选择器内匹配规则中定义的标签一致,可以多出其他标签
app: nginx
spec: #Pod的规格定义
containers: #容器定义
- name: nginx #容器名称
image: nginx:1.20 #容器镜像
imagePullPolicy: IfNotPresent #拉取镜像的规则
ports: #暴露端口
- name: http #端口名称
containerPort: 80
# 4.1 应用更新
kubectl apply -f nginx-rs.yaml
# 4.1.1 查看更新流程
kubectl get pods -o wide -w
我们发现pod没有任何更新变化
# 4.1.2 查看Pod版本号
kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image
这里并没有更新pod的nginx版本号
# 4.1.3 删除pod应用
这里虽然重载了,但是已有的pod所使用的镜像仍然是1.12版本的,只是新建pod时才会使用1.20版本,这里测试先手动删除已有的pod。
kubectl delete pods -l app=nginx
# 4.1.4 查看版本
kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image
现在我们发现pod的版本已经更新正确了
# 5 RS扩缩容
可以直接通过
vim
编辑清单文件修改replicas
字段,也可以通过kubect edit
命令去编辑
kubectl
还提供了一个专用的子命令scale
用于实现应用规模的伸缩,支持从资源清单文件中获取新的目标副本数量,也可以直接在命令行通过“--replicas”
选项进行读取。
# 5.1 scale命令扩容
命令扩容一般用于短期的临时性扩容,应付完成后要记得缩容到原来水平
# 5.1.1 查看容量
可看到当前是两个节点
kubectl get pods -o wide
# 5.1.2 执行扩容
使用
scale
命令可以对集群进行扩缩容
kubectl scale replicasets nginx-rs --replicas=4
# 5.1.3 查看扩容过程
在更新前打开新窗口,监控pod的更新变化
kubectl get pods -o wide -w
在更新前打开新窗口,监控RS的更新变化
kubectl get rs -o wide -w
我们发现扩容后只是在原来的RS集群上面增加了两个节点
# 5.2 配置文件缩容
配置文件扩容一般用于初始容量变更,长期进行扩容
# 5.2.1 查看容量
可看到当前是四个节点
kubectl get pods -o wide
# 5.2.2 应用配置
因为没有变更配置文件可以直接应用配置文件
kubectl apply -f nginx-rs.yml
# 5.2.3 查看缩容容过程
在更新前打开新窗口,监控pod的更新变化
kubectl get pods -o wide -w
在更新前打开新窗口,监控RS的更新变化
kubectl get rs -o wide -w
我们发现扩容后只是在原来的RS集群上面减少了两个节点
# 6 删除rs控制器
使用
Kubectl delete
命令删除ReplicaSet
对象时默认会一并删除其管控的各Pod
对象,有时,考虑到这些Pod
资源未必由其创建,或者即便由其创建也并非自身的组成部分,这时候可以添加“--cascade=false”
选项,取消级联关系。
# 6.1 查看集群情况
# 6.1.1 查看RS集群
kubectl get rs -o wide
# 6.1.2 查看POD
kubectl get pods -o wide
# 6.2 删除rs
删除rs可以通过参数
cascade=false
设置不删除pod
kubectl delete replicasets nginx-rs --cascade=false
# 6.3 查看集群情况
# 6.3.1 查看RS集群
kubectl get rs -o wide
# 6.3.2 查看POD
kubectl get pods -o wide
# 6.4 删除Pod
kubectl delete pods nginx-rs-7rzz6
kubectl delete pods nginx-rs-c5zrs