ReplicaSet & ReplicationController(上)
概述
- ReplicationController是一种 K8s 资源,可确保其 pod 始终保持运行 。
- 如果 pod 由于任何原因消失,例如节点从集群中消失或因为 pod 被从节点中逐出,它会 ReplicationController 注意到丢失的 pod 并创建一个替换 pod。
- 通常 ReplicationController ,用于创建和管理 pod 的多个副本。

- 使用复制控制器或副本集创建新的 pod 时,您的节点可能资源不足,在这种情况下,它会自动在另一个可用的集群节点上创建新的 pod

工作原理
ReplicationController 的工作是确保确切数量的 pod 始终与其标签选择器匹配。如果不是,则 ReplicationController 会采取适当的操作来协调实际数字与所需数字。
下面的流程图展示了 Replication Controller 的运行:

复制控制器有三个基本部分:
- 标签选择器(label selector) ,它决定了 ReplicationController 范围内的 pod
- 副本计数(replica count) ,指定应该运行的所需 pod 数量
- pod模板(pod template) ,创建新的 pod 副本时使用
ReplicationController 的副本数、标签选择器,甚至 Pod 模板都可以随时修改, 但只有副本数的更改会影响现有的 Pod 。
创建
要获得复制控制器的种类和 apiVersion,我们将检查列表 api-resources
[root@controller ~]# kubectl api-resources | grep -iE 'KIND|replication'
NAME SHORTNAMES APIGROUP NAMESPACED KIND
replicationcontrollers rc true ReplicationController
因此,kind 值将是 ReplicationController,现在要获取此类 apiVersion,我们将使用 kubectl explain 命令:
[root@controller ~]# kubectl explain ReplicationController | head -n 2
KIND: ReplicationController
VERSION: v1
现在我们有了创建第一个复制控制器所需的数据 kind 和值。 apiVersion 与 pod 和其他 Kubernetes 资源类似,您可以通过将 JSON 或 YAML 描述符发布到 Kubernetes API 服务器来创建 ReplicationController。
[root@controller ~]# cat replication-controller.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp-rc
labels:
app: myapp
type: dev
spec:
replicas: 3
selector:
app: myapp
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: dev
spec:
containers:
- name: nginx-container
image: nginx
突出显示的部分是创建 Pod 的模板。
当您将文件发布到 API 服务器时,Kubernetes 会创建一个名为 的新 Replication-Controller myapp-rc ,它确保三个 pod 实例始终与标签选择器匹配 app=myapp 。当没有足够的 pod 时,将从提供的 pod 模板创建新的 pod。

提示:
定义 ReplicationController 时不要指定 pod 选择器。让 Kubernetes 从 pod 模板中提取它。这将使您的 YAML 更短更简单。要创建 ReplicationController,请使用 kubectl create 命令:
[root@controller ~]# kubectl create -f replication-controller.yml
replicationcontroller/myapp-rc created
验证 Replication Controller 的运行
因为标签不存在 pod app=myapp ,ReplicationController 应该从 pod 模板启动三个新的 pod。列出默认命名空间中的可用 pod:
[root@controller ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
init-container-example-1 1/1 Running 0 112m
myapp-rc-b2jtr 0/1 ContainerCreating 0 5s
myapp-rc-c57qm 0/1 ContainerCreating 0 5s
myapp-rc-hmj9g 0/1 ContainerCreating 0 5s
正如预期的那样,ReplicationController 已经在默认命名空间中启动了 3 个 pod,以获取可用复制控制器的状态和列表:
[root@controller ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
myapp-rc 3 3 3 71s
这里' rc '是复制控制器的缩写。
为确保 RC 将创建新的 pod,我们将删除带有标签的现有 pod app=myapp :
[root@controller ~]# kubectl delete pod myapp-rc-c57qm
pod "myapp-rc-c57qm" deleted
正如预期的那样,删除的 pod 将从可用 pod 列表中删除,并创建一个新的 pod:
[root@controller ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
init-container-example-1 1/1 Running 0 113m
myapp-rc-2tcgx 1/1 Running 0 15s
myapp-rc-b2jtr 1/1 Running 0 52s
myapp-rc-hmj9g 1/1 Running 0 52s
要检查 pod 的状态和运行相应 pod 的工作节点,您可以使用 -o wide with kubectl get pods 命令:
[root@controller ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
init-container-example-1 1/1 Running 0 122m 10.36.0.2 worker-1.example.com <none> <none>
myapp-rc-2tcgx 1/1 Running 0 9m58s 10.36.0.4 worker-1.example.com <none> <none>
myapp-rc-b2jtr 1/1 Running 0 10m 10.36.0.3 worker-1.example.com <none> <none>
myapp-rc-hmj9g 1/1 Running 0 10m 10.44.0.4 worker-2.example.com <none> <none>
ReplicationController 您可以使用以下命令查看有关您的其他信息 kubectl describe :
[root@controller ~]# kubectl describe rc myapp-rc
Name: myapp-rc
Namespace: default
Selector: app=myapp
Labels: app=myapp
type=dev
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=myapp
type=dev
Containers:
nginx-container:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 91s replication-controller Created pod: myapp-rc-b2jtr
Normal SuccessfulCreate 91s replication-controller Created pod: myapp-rc-c57qm
Normal SuccessfulCreate 91s replication-controller Created pod: myapp-rc-hmj9g
Normal SuccessfulCreate 54s replication-controller Created pod: myapp-rc-2tcgx
底部的事件列表显示了 Replication-Controller 采取的操作——到目前为止它已经创建了四个 pod。

更改 pod 模板
ReplicationController 的 pod 模板可以随时修改。更改 pod 模板只会影响新创建的 pod,不会影响处于运行状态的现有 pod:
作为练习,我将通过编辑 pod 模板来更新 replicas 值,并将 的值更改 replicas 为 4 并保存模板。这将在您的默认文本编辑器中打开 ReplicationController 的 YAML 定义:
[root@controller ~]# kubectl edit rc myapp-rc
replicationcontroller/myapp-rc edited
我们现在将列出 Pod 并验证副本数,正如您现在看到的,我们有 4 个使用标签运行的 Pod myapp :
[root@controller ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
init-container-example-1 1/1 Running 0 130m
myapp-rc-2tcgx 1/1 Running 0 17m
myapp-rc-b2jtr 1/1 Running 0 17m
myapp-rc-hmj9g 1/1 Running 0 17m
myapp-rc-ksx4f 1/1 Running 0 3m7s
您还可以检查复制控制器状态,该状态现在显示它允许 4 个副本:
[root@controller ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
myapp-rc 4 4 4 18m

水平扩展的 Pod
您已经了解了如何 ReplicationControllers 确保特定数量的 pod 实例始终在运行。因为更改所需的副本数量非常简单,这也意味着水平扩展 pod 是微不足道的。
假设您突然预计应用程序的负载会增加,因此您必须部署更多的 pod 直到负载减少,在这种情况下,您可以轻松地增加 pod 运行时的数量。
例如,在这里我将副本数量扩展到 6:
[root@controller ~]# kubectl scale rc myapp-rc --replicas=6
replicationcontroller/myapp-rc scaled
然后验证带有标签的 pod 列表 myapp ,因此又启动了两个 pod:
[root@controller ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
init-container-example-1 1/1 Running 0 132m
myapp-rc-2tcgx 1/1 Running 0 19m
myapp-rc-b2jtr 1/1 Running 0 20m
myapp-rc-hmj9g 1/1 Running 0 20m
myapp-rc-ksx4f 1/1 Running 0 5m41s
myapp-rc-pvqk2 0/1 ContainerCreating 0 3s
myapp-rc-zp972 0/1 ContainerCreating 0 3s
同样,一旦负载减少,副本也可以缩小,这里我现在将副本的数量减少到 3。这个命令所做的就是修改 ReplicationController 定义的字段 spec.replicas ——就像你通过 . 更改它时一样 kubectl edit :
[root@controller ~]# kubectl scale rc myapp-rc --replicas=3
replicationcontroller/myapp-rc scaled
在缩小副本后,您可以看到新创建的 Pod 现在正在终止:
[root@controller ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
init-container-example-1 1/1 Running 0 134m
myapp-rc-2tcgx 1/1 Running 0 21m
myapp-rc-b2jtr 1/1 Running 0 21m
myapp-rc-hmj9g 1/1 Running 0 21m
myapp-rc-ksx4f 0/1 Terminating 0 7m13s
myapp-rc-pvqk2 0/1 Terminating 0 95s
myapp-rc-zp972 0/1 Terminating 0 95s
让王者们更上一层楼!
让王者们更上一层楼!
欢迎各位小伙伴关注、点赞、评论、转发,你的关注和转发是我最大的动力!