# k8s Replication Controller
注意:建议使用 Deployment 配置 ReplicaSet (简称 RS)方法来控制副本数。
ReplicationController(简称 RC)是确保用户定义的 Pod 副本数保持不变。
# ReplicationController 工作原理
在用户定义范围内,如果 pod 增多,则 ReplicationController 会终止额外的 pod,如果减少,RC 会创建新的 pod,始终保持在定义范围。例如,RC 会在 Pod 维护(例如内核升级)后在节点上重新创建新 Pod。
注:
- ReplicationController 会替换由于某些原因而被删除或终止的 pod,例如在节点故障或中断节点维护(例如内核升级)的情况下。因此,即使应用只需要一个 pod,我们也建议使用 ReplicationController。
- RC 跨多个 Node 节点监视多个 pod。
# 示例:
replication.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
下载示例文件然后运行:
$ kubectl create -f ./replication.yaml
replicationcontroller "nginx" created
检查 ReplicationController 状态:
$ kubectl describe replicationcontrollers/nginx
Name: nginx
Namespace: default
Image(s): nginx
Selector: app=nginx
Labels: app=nginx
Replicas: 3 current / 3 desired
Pods Status: 0 Running / 3 Waiting / 0 Succeeded / 0 Failed
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- ---- ------ -------
20s 20s 1 {replication-controller } Normal SuccessfulCreate Created pod: nginx-qrm3m
20s 20s 1 {replication-controller } Normal SuccessfulCreate Created pod: nginx-3ntk0
20s 20s 1 {replication-controller } Normal SuccessfulCreate Created pod: nginx-4ok8v
创建了三个 pod:
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
列出属于 ReplicationController 的所有 pod:
$ pods=$(kubectl get pods --selector=app=nginx --output=jsonpath={.items..metadata.name})
echo $pods
nginx-3ntk0 nginx-4ok8v nginx-qrm3m
# 删除 ReplicationController 及其 Pods
使用 kubectl delete 命令删除 ReplicationController 及其所有 pod。
当使用 REST API 或客户端库时,需要明确地执行这些步骤(将副本缩放为 0,等待 pod 删除,然后删除 ReplicationController)。
# 只删除 ReplicationController
在删除 ReplicationController 时,可以不影响任何 pod。
使用 kubectl,为 kubectl delete 指定- cascade = false 选项。
使用 REST API 或 go 客户端库时,只需删除 ReplicationController 对象即可。
原始文件被删除后,你可以创建一个新的 ReplicationController 来替换它。只要旧的和新.spec.selector 相匹配,那么新的将会采用旧的 Pod。
# ReplicationController 隔离 pod
可以通过更改标签来从 ReplicationController 的目标集中删除 Pod。
# RC 常用方式
- Rescheduling(重新规划)
- 扩展
- 滚动更新
- 多版本跟踪
- 使用 ReplicationControllers 与关联的 Services
# API 对象
Replication controller 是 k8s REST API 中的顶级资源。有关 API 对象更多详细信息,请参见:ReplicationController API 对象。
# RC 替代方法
# ReplicaSet
ReplicaSet 是支持新的 set-based 选择器要求的下一代 ReplicationController。它主要用作 Deployment 协调 pod 创建、删除和更新。请注意,除非需要自定义更新编排或根本不需要更新,否则建议使用 Deployment 而不是直接使用 ReplicaSets。
# Deployment(推荐)
Deployment 是一个高级的 API 对象,以类似的方式更新其底层的副本集和它们的 Pods kubectl rolling-update。如果您希望使用这种滚动更新功能,建议您进行部署,因为 kubectl rolling-update 它们是声明式的,服务器端的,并具有其他功能。
# Bare Pods
与用户直接创建 pod 的情况不同,ReplicationController 会替换由于某些原因而被删除或终止的 pod,例如在节点故障或中断节点维护(例如内核升级)的情况下。因此,即使应用只需要一个 pod,我们也建议使用 ReplicationController。