ReplicaSet 控制副本
1 ) 概述
-
pod 是一个无状态的,并且可以被任意的按需的调度,在各个work node上运行的组件
-
谁来控制这类调度就变得非常复杂,不可能去手工的去维护某一个pod的一个运行实例
-
如果那样的话呢,它就失去了容器的概念,就会像一个虚拟机一样去运行
-
K8s中提供了 controller 这个概念,对于副本管理来说,有两种
- 一种是 Replica Set (RS) 副本控制器
- 一种是 Replication Controller(RC)已经不推荐使用了
- 都是用于确保集群中特定数量的 Pod 副本始终运行的服务
- Replica Set 是对 Replication Controller 的改进和升级,具备更强大的获取标签label功能
- 新版本中推荐用 Deployment 来控制 ReplicaSet,用 ReplicaSet 控制pod副本数量
-
Replica Set
- 它是维护在任何时候都处于运行状态pod副本的一个稳定集合
- 通常它是用来保证给定数量和完全相同的pod的一个可用性
- 可以认为它是一个管理员,要保证集群的pod的数量是一个稳定的
- 比如设定了3个副本的nginx, 如果你主动销毁一个副本,它会自动新建一个补充
-
RS 可以独立使用,但是也可以被 Deployment 用来协调
2 )应用
-
新建 rep-nginx.yaml
yamlapiVersion: apps/v1 kind: ReplicaSet metadata: name: rep-nginx spec: replicas: 3 selector: # 选择器选择的是 满足 app: rep-nginx 的 pod matchLabels: app: rep-nginx template: # 这里的模板就是创建一系列的 pod metadata: name: rep-nginx labels: app: rep-nginx spec: containers: - name: rep-nginx image: nginx ports: - containerPort: 80
-
$
kubectl apply -f rep-nginx.yaml
创建副本confreplicaset.apps/rep-nginx created
-
$
kubectl get all
confNAME READY STATUS RESTARTS AGE pod/rep-nginx-k6k8g 1/1 Running 0 2m16s pod/rep-nginx-sh969 1/1 Running 0 2m16s pod/rep-nginx-tcrsb 1/1 Running 0 2m16s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 6d NAME DESIRED CURRENT READY AGE replicaset.apps/rep-nginx 3 3 3 2m17s
-
这时候开两个 bash窗口, 来监控运行
- $
kubectl get po -w
这个窗口一直做监控,命名窗口为A窗口 - $
kubectl delete pod/rep-nginx-tcrsb
这个窗口删除一个pod, 命名窗口为B窗口
- $
-
我们可以在A窗口这个监控窗口中看到
- 之前被删除的pod的状态是立即变成: Terminating
- 并且同时有一个新的pod被创建出来,状态为: Pending -> ContainerCreating -> Running 的变化
-
回到B窗口中运行 $
kubectl get po
发现依旧是 3个 pod -
这个说明副本控制器就是一直在工作来维持副本运行的稳定性