Kubernetes-ReplicaSet控制器

Kubernetes-ReplicaSet控制器

概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ReplicaSet 简写(RS) 是 Kubernetes 中的一种资源对象,用于确保指定数量的 Pod 始终运行。与 ReplicationController 相比,ReplicaSet 具有更强大的标签选择器,可以更精确地选择要管理的 Pod。

在创建 ReplicaSet 时,需要指定以下信息:

- Pod 模板:定义了要创建的 Pod 的规范,包括容器镜像、容器端口等。
- 副本数:指定要创建的 Pod 的数量。
- 标签选择器:指定要管理的 Pod 的标签,ReplicaSet 只会管理具有指定标签的 Pod。

ReplicaSet 会根据 Pod 模板创建指定数量的 Pod,并监视它们的运行状态。如果某个 Pod 发生故障或被删除,ReplicaSet 会自动创建新的 Pod,以确保指定数量的 Pod 始终在运行状态。

使用 ReplicaSet 可以实现以下目标:

- 提高应用程序的可用性:当某个 Pod 发生故障时,ReplicaSet 会自动创建新的 Pod,以确保应用程序的可用性。
- 扩展应用程序:通过增加副本数,可以扩展应用程序的处理能力,以满足更高的负载需求。
- 管理应用程序的版本:通过创建不同版本的 Pod 模板,并使用不同的标签,可以管理应用程序的不同版本,并实现无缝升级和回滚。

需要注意的是,ReplicaSet 已经取代了 ReplicationController,成为 Kubernetes 中管理 Pod 副本的首选方式。如果您使用的是较新的 Kubernetes 版本,请考虑使用 ReplicaSet 来管理 Pod 的副本。

参考文档

1
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/replicaset/

创建rs控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@kubernetes-master controller]# cat nginx-rs.yaml 
---
apiVersion: v1
kind: Namespace
metadata:
name: rs-nginx
---
apiVersion: apps/v1 # 注意这里版本为apps/v1
kind: ReplicaSet # 资源对象为 rs控制器
metadata:
namespace: rs-nginx
name: nginx-web # pod名
spec:
replicas: 4 # 副本数量
selector:
  matchLabels:
    app: nginx # rs资源控制器的标签 用来管理使用该标签的容器
template:
  metadata:
    labels:
      app: nginx # 这里容器使用 rs资源控制器的标签
  spec:
    containers:
      - name: nginx
        image: daocloud.io/library/nginx
        ports:
          - containerPort: 80
1
2
3
4
5
6
7
8
9
10
11
12
# 创建rs资源控制器
[root@kubernetes-master controller]# kubectl apply -f nginx-rs.yaml
namespace/rs-nginx created
replicaset.apps/nginx-web created

# 查看pod信息
[root@kubernetes-master controller]# kubectl get pod -n rs-nginx -o wide
NAME             READY   STATUS   RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
nginx-web-45z8q   1/1     Running   0         14s   10.10.20.107   kubernetes-node2   <none>           <none>
nginx-web-8w7tg   1/1     Running   0         14s   10.10.20.108   kubernetes-node2   <none>           <none>
nginx-web-cbnn7   1/1     Running   0         14s   10.10.20.255   kubernetes-node1   <none>           <none>
nginx-web-z2w6b   1/1     Running   0         14s   10.10.20.194   kubernetes-node1   <none>           <none>

手动扩缩容pod副本

1
2
3
4
5
6
7
8
9
10
11
12
13
# 缩容成一个 
[root@kubernetes-master controller]# kubectl scale rs nginx -n rs-nginx --replicas 1
replicaset.apps/nginx scaled

# 查看pod 只剩下一个
[root@kubernetes-master controller]# kubectl get pod -n rs-nginx
NAME         READY   STATUS   RESTARTS   AGE
nginx-zqd2j   1/1     Running   0         2m13s

注:  
kubectl scale :扩缩容命令
rs nginx : rs为rs资源控制器 nginx 为上面创建的rs资源控制器名字
--replicas 1 :指定副本数量

yaml文件扩缩容pod副本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@kubernetes-master controller]# cat nginx-rs.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: rs-nginx
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
namespace: rs-nginx
name: nginx
spec:
replicas: 8 #改为 8 创建8个副本
selector:
  matchLabels:
    app: nginx
template:
  metadata:
    labels:
      app: nginx
  spec:
    containers:
      - name: nginx-web
        image: daocloud.io/library/nginx
        ports:
          - containerPort: 80

image-20231108180110317

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 更新rs资源控制器
[root@kubernetes-master controller]# kubectl apply -f nginx-rs.yaml
namespace/rs-nginx unchanged
replicaset.apps/nginx configured

# 查看pod 数量为 8
[root@kubernetes-master controller]# kubectl get pod -n rs-nginx
NAME         READY   STATUS   RESTARTS   AGE
nginx-2zc5b   1/1     Running   0         5s
nginx-7mv4d   1/1     Running   0         5s
nginx-bffgn   1/1     Running   0         5s
nginx-cr5hh   1/1     Running   0         5s
nginx-d57m8   1/1     Running   0         5s
nginx-nghkx   1/1     Running   0         5s
nginx-xrfpn   1/1     Running   0         5s
nginx-zqd2j   1/1     Running   0         6m49s

删除rs资源控制器

命令行删除rs资源控制器

1
2
3
4
5
6
7
# 删除名为nginx的rs资源控制器
[root@kubernetes-master controller]# kubectl delete rs nginx -n rs-nginx
replicaset.apps "nginx" deleted

[root@kubernetes-master controller]# kubectl get pod -n rs-nginx
No resources found in rs-nginx namespace.

yaml文件删除rs资源控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 先创建出来rs
[root@kubernetes-master controller]# kubectl apply -f nginx-rs.yaml
namespace/rs-nginx unchanged
replicaset.apps/nginx created

# 查看pod
[root@kubernetes-master controller]# kubectl get pod -n rs-nginx
NAME READY STATUS RESTARTS AGE
nginx-56vh6 1/1 Running 0 6s
nginx-7wrb2 1/1 Running 0 6s
nginx-8gsff 1/1 Running 0 6s
nginx-fx8gk 1/1 Running 0 6s
nginx-j2www 1/1 Running 0 6s
nginx-kkc4m 1/1 Running 0 6s
nginx-nf4ht 1/1 Running 0 6s
nginx-zbxr8 1/1 Running 0 6s

# yaml文件方式删除rs资源控制器
[root@kubernetes-master controller]# kubectl delete -f nginx-rs.yaml
namespace "rs-nginx" deleted
replicaset.apps "nginx" deleted


[root@kubernetes-master controller]# kubectl get pod -n rs-nginx
No resources found in rs-nginx namespace.