Kubernetes-ReplicationController控制器

Kubernetes-ReplicationController控制器

概念

1
2
3
4
5
6
7
8
ReplicationController 简写(RC)是 Kubernetes 中的一种资源对象,用于确保指定数量的 Pod 始终运行。ReplicationController 通过监视 Pod 的运行状态,并在 Pod 发生故障或被删除时自动创建新的 Pod,以保持指定数量的 Pod 在运行状态。

使用 ReplicationController 可以实现以下目标:
--提高应用程序的可用性:当某个 Pod 发生故障时,ReplicationController 会自动创建新的 Pod,以确保应用程序的可用性。
--扩展应用程序:通过增加副本数,可以扩展应用程序的处理能力,以满足更高的负载需求。
--管理应用程序的版本:通过创建不同版本的 Pod 模板,可以管理应用程序的不同版本,并实现无缝升级和回滚。
 
需要注意的是,ReplicationController 已经被 ReplicaSet 和 Deployment 所取代,但它们的作用和使用方式基本相同。如果您使用的是较新的 Kubernetes 版本,请考虑使用 ReplicaSet 或 Deployment 来管理 Pod 的副本

参考文档

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

使用控制器创建pod资源对象

1
2
# 创建目录
[root@kubernetes-master]# mkdir /study/controller && cd /study/controller
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
# 创建rc资源对象yaml文件
[root@kubernetes-master controller]# cat nginx-rc.yaml
---
apiVersion: v1
kind: Namespace # 创建资源对象为命名空间
metadata: # 元数据
name: rc-nginx # 命名空间名为 rc-nginx
---
apiVersion: v1
kind: ReplicationController # 创建资源对象为ReplicationController控制器 简称rc
metadata: # 元数据
namespace: rc-nginx # 资源所在空间为 rc-nginx
name: rc-nginx # rc资源对象名为 rc-nginx
spec: # 属性
replicas: 2 # 副本数量 这里副本数量就是创建pod的数量
template:
  metadata: # 元数据
    labels: # 标签
      app: nginx # 标签键和值
  spec: # 属性
    containers:
      - name: nginx #容器名nginx
        image: daocloud.io/library/nginx #容器镜像
        ports: # 容器暴漏端口80
          - containerPort: 80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建rc控制器
[root@kubernetes-master controller]# kubectl apply -f nginx-rc.yaml
namespace/rc-nginx unchanged
replicationcontroller/rc-nginx created

# 查看pod
[root@kubernetes-master controller]# kubectl get pod -n rc-nginx
NAME             READY   STATUS   RESTARTS   AGE
rc-nginx-5dhzz   1/1     Running   0         11s
rc-nginx-m5tnk   1/1     Running   0         11s

# 查看pod详细信息
[root@kubernetes-master controller]# kubectl get pod -n rc-nginx -o wide
NAME             READY   STATUS   RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
rc-nginx-5dhzz   1/1     Running   0         30s   10.10.20.242   kubernetes-node1   <none>           <none>
rc-nginx-m5tnk   1/1     Running   0         30s   10.10.20.96   kubernetes-node2   <none>           <none>

验证rc控制器

1
2
3
4
5
6
7
8
9
# 从上面得知已有pod名为rc-nginx-5dhzz 此时使用命令删除这个pod
[root@kubernetes-master controller]# kubectl delete pod rc-nginx-5dhzz   -n rc-nginx  
pod "rc-nginx-5dhzz" deleted

# pod删除后从新查询 可以看到rc自动创建一个新的pod 名为rc-nginx-7vm8p 启动8s
[root@kubernetes-master controller]# kubectl get pod -n rc-nginx -o wide
NAME             READY   STATUS   RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
rc-nginx-7vm8p   1/1     Running   0         8s   10.10.20.243   kubernetes-node1   <none>           <none>
rc-nginx-m5tnk   1/1     Running   0         17m   10.10.20.96   kubernetes-node2   <none>           <none>

命令行方式扩缩容pod副本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 扩容到4个pod
[root@kubernetes-master controller]# kubectl scale -n rc-nginx rc rc-nginx --replicas=4
replicationcontroller/rc-nginx scaled

# 查看pod信息 当前为4个pod 两个3s的pod就是新扩容的
[root@kubernetes-master controller]# kubectl get pod -n rc-nginx -o wide
NAME             READY   STATUS   RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
rc-nginx-56vqv   1/1     Running   0         3s   10.10.20.244   kubernetes-node1   <none>           <none>
rc-nginx-7vm8p   1/1     Running   0         10m   10.10.20.243   kubernetes-node1   <none>           <none>
rc-nginx-dhbf9   1/1     Running   0         3s   10.10.20.97   kubernetes-node2   <none>           <none>
rc-nginx-m5tnk   1/1     Running   0         28m   10.10.20.96   kubernetes-node2   <none>           <none>

注:命令解释
kubectl scale : 副本命令
-n rc-nginx : 指定rc所在命名空间
rc rc-nginx :选择rc控制器中的名为rc-nginx控制器
--replicas=4 : 副本数量
1
2
3
4
5
6
7
# 缩容pod只留一个
[root@kubernetes-master controller]# kubectl scale -n rc-nginx rc rc-nginx --replicas=1
replicationcontroller/rc-nginx scaled

[root@kubernetes-master controller]# kubectl get pod -n rc-nginx -o wide
NAME             READY   STATUS   RESTARTS   AGE   IP           NODE               NOMINATED NODE   READINESS GATES
rc-nginx-m5tnk   1/1     Running   0         31m   10.10.20.96   kubernetes-node2   <none>           <none>

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
[root@kubernetes-master controller]# cat nginx-rc.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: rc-nginx
---
apiVersion: v1
kind: ReplicationController
metadata:
namespace: rc-nginx
name: rc-nginx
spec:
replicas: 8 # 改为8
template:
  metadata:
    labels:
      app: nginx
  spec:
    containers:
      - name: nginx
        image: daocloud.io/library/nginx
        ports:
          - containerPort: 80

image-20231108143631007

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使用yaml更新rc控制器
[root@kubernetes-master controller]# kubectl apply -f nginx-rc.yaml
namespace/rc-nginx unchanged
replicationcontroller/rc-nginx configured

# 查看pod 这时8个pod已经创建处来
[root@kubernetes-master controller]# kubectl get pod -n rc-nginx
NAME             READY   STATUS   RESTARTS   AGE
rc-nginx-9pdqz   1/1     Running   0         7s
rc-nginx-b6rg2   1/1     Running   0         7s
rc-nginx-cckt9   1/1     Running   0         7s
rc-nginx-m5tnk   1/1     Running   0         35m
rc-nginx-mvxbj   1/1     Running   0         7s
rc-nginx-nqrlb   1/1     Running   0         7s
rc-nginx-p6t82   1/1     Running   0         7s
rc-nginx-shhxp   1/1     Running   0         7s

# 同理缩容只需要修改 replicas: 的值即可并使用命令重新更新rc控制器

查看rc控制器

1
此时使用rc创建出来的pod被删除后rc会检测当前pod数量多则删除,少则创建。
1
2
3
4
5
6
7
8
9
# 查看rc-nginx 命名空间下的rc控制器
[root@kubernetes-master controller]# kubectl get rc -n rc-nginx
NAME       DESIRED   CURRENT   READY   AGE
rc-nginx   8         8         8       38m

# 查看rc-nginx 命名空间下的rc控制器的详细信息
[root@kubernetes-master controller]# kubectl get rc -n rc-nginx -o wide
NAME       DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                     SELECTOR
rc-nginx   8         8         8       39m   nginx       daocloud.io/library/nginx   app=nginx

命令行删除rc控制器

1
2
3
4
5
6
# 删除rc-nginx命名空间下的rc-nginx资源控制器
[root@kubernetes-master controller]# kubectl delete -n rc-nginx rc rc-nginx
replicationcontroller "rc-nginx" deleted
# 查看pod 可以看到通过rc创建出来的pod也被删除了
[root@kubernetes-master controller]# kubectl get pod -n rc-nginx
No resources found in rc-nginx namespace.

yaml文件方式删除rc控制器

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
# 由于上面已经删除所以先创建在使用yaml方式删除
[root@kubernetes-master controller]# kubectl apply -f nginx-rc.yaml
namespace/rc-nginx unchanged
replicationcontroller/rc-nginx created

# 查看到已经创建
[root@kubernetes-master controller]# kubectl get pod -n rc-nginx
NAME             READY   STATUS   RESTARTS   AGE
rc-nginx-2945m   1/1     Running   0         12s
rc-nginx-4st78   1/1     Running   0         12s
rc-nginx-5jzj7   1/1     Running   0         12s
rc-nginx-5rkbv   1/1     Running   0         12s
rc-nginx-kr2s4   1/1     Running   0         12s
rc-nginx-ljrmr   1/1     Running   0         12s
rc-nginx-mfk5g   1/1     Running   0         12s
rc-nginx-tzgx8   1/1     Running   0         12s

# 通过yaml文件进行删除
[root@kubernetes-master controller]# kubectl delete -f nginx-rc.yaml
namespace "rc-nginx" deleted
replicationcontroller "rc-nginx" deleted

# 命名空间都没了 说明pod肯定也已经被删除
[root@kubernetes-master controller]# kubectl get pod -n rc-nginx
No resources found in rc-nginx namespace.