一、ReplicaSet 控制器介绍
ReplicaSet是k8s中一种资源对象,简写 rs
,用于管理Pod副本数量和健康状态,在spec.replicas
字段中可以定义Pod副本数量,ReplicaSet会始终保持Pod在指定数量,当发现Pod数量大于副本数量时,会移除多出的Pod,当发现Pod小于副本数量会自动创建Pod,使其始终维护在副本数量,此外,ReplicaSet还会监控Pod的健康状态,如果某个Pod出现故障,ReplicaSet会自动替换它。
ReplicaSet特点如下:
- 自动化管理:ReplicaSet可以自动地创建、删除和更新Pod副本,以确保指定数量的Pod副本一直在运行。
- 健康检查:ReplicaSet会定期检查Pod的健康状态,并根据需要重启或替换不健康的Pod。
- 水平扩展:通过增加或减少Pod副本的数量,可以实现应用程序的水平扩展,以满足不同的负载需求。
- 选择器:ReplicaSet使用标签选择器来选择要管理的Pod副本。
- 有状态管理:ReplicaSet可以管理有状态的应用程序,例如数据库,以确保数据的一致性和可用性。
- 更新:不支持滚动更新,需要手动删除旧Pod实现更新。
ReplicaSet常用字段解释:
apiVersion: apps/v1 # RS版本
kind: ReplicaSet # 定义RS资源类型
metadata: # RS元数据
name: nginx-replicaset # RS名称
namespace: default # RS命名空间
labels: # RS标签
app: web
env: uat
spec:
replicas: 3 # 关联Pod副本数量
selector:
matchLabels: # 关联具有app=web的Pod
app: web
template: # Pod模板
metadata: # Pod元数据
namespace: default # Pod命名空间
labels: # Pod标签
app: web
env: uat
spec:
containers: # Pod定义容器
- name: web-nginx # 容器名称
image: nginx # 容器使用镜像
imagePullPolicy: IfNotPresent # 容器镜像下载策略
ports:
- containerPort: 80 # 容器内端口
二、ReplicaSet案例
1、Pod副本扩缩容案例
通过修改 spec.replicas
值来进行动态扩容、缩容,使用 nginx
镜像定义副本数量 3
,并添加了一些必要的探测,如下:
cat replicaset.yaml
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
namespace: default
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
namespace: default
labels:
app: web
spec:
containers:
- name: web-nginx
image: nginx:1.18.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
startupProbe:
tcpSocket:
port: 80
livenessProbe:
httpGet:
path: /index.html
port: 80
readinessProbe:
httpGet:
path: /index.html
port: 80
执行YAML文件:
kubectl apply -f replicaset.yaml
查看Pod、RS状态,是否创建且正常:
kubectl get rs,pod -l app=web
当我们删除Pod时,RS会自动为我们创建出来,RS会始终维护Pod数量为3 删除命令如下:
kubectl delete pod nginx-replicaset-7mh2r
动态扩容副本数量,更新副本数量为5:
重新 apply 一下 YAML文件:
kubectl apply -f replicaset.yaml
验证,Pod数量:
kubectl get pod -l app=web
缩容也是同样操作,更改replicas数值重新apply一下即可,此处省略。
2、Pod更新版本案例
ReplicaSet,不支持动态更新,只能是通过删除旧Pod方式,案例演示如下:
使用 web:v1
镜像 创建ReplicaSet资源
cat replicaset.yaml
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
namespace: default
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
namespace: default
labels:
app: web
spec:
containers:
- name: web-nginx
image: web:v1 # V1 镜像
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
执行文件:
kubectl apply -f replicaset.yaml
kubectl get pod -l app=web
查看PodIP地址,并访问:
kubectl describe pod nginx-replicaset-wht6q|grep IP
根据以上更新使用 web:v2
镜像:
编辑上面 YAML 文件 只更改镜像版本即可如下图:
执行文件:
kubectl apply -f replicaset.yaml
kubectl get pod -l app=web
注意,此时curl Pod返回内容依旧是 旧版Pod内容,需要手动删除旧Pod资源,RS会自动创建Pod,自动创建的Pod才会使用新的镜像。
删除Pod,根据自己当前环境pod名称进行删除:
kubectl delete pod nginx-replicaset-ff5pl nginx-replicaset-rvr9k nginx-replicaset-wht6q
删除后,RS会自动创建,查看新的Pod:
kubectl get pod -l app=web
访问Pod: