10. Kubernetes - ReplicaSet(RS)和 Replication Controller(RC)
控制器
在实际应用中,一般不会直接使用 Pod,而是会使用各种 Pod 的上层封装 控制器
来满足使用需求。Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望状态保持一致。
控制器会监听资源创建、更新、删除事件,并触发
Reconcile
调谐函数,该过程称为Reconcile Loop(调谐循环)
或Sync Loop(同步循环)
。
整个过程就像下面这段伪代码:
for {
desired := getDesiredState() // 获取期望状态
current := getCurrentState() // 获取实际状态
if current == desired { // 如果状态一致则什么都不做
// nothing to do
} else { // 如果状态不一致则调整编排,到一致为止
// 调整当前状态到期望状态并更新集群状态
}
}
这个编排模型就是 Kubernetes 项目中的一个通用编排模式:控制循环(control loop)
。
ReplicaSet
ReplicaSet,简称 RS
,翻译成中文就是 副本集
,它最重要的用途就是:控制副本数量。
以生产应用为例,假如现有一个 Pod 正提供服务,可能会遇到以下两种情况:
-
网站访问量突然暴增。
-
运行 Pod 的节点发生故障。
针对第一种情况,可以通过手动多启动几个 Pod 副本,流量降下来之后再将多余的 Pod 杀掉的方法来应对。
针对第二种情况,如果节点挂了,也可以通过在另外的节点上重新启动一个新的 Pod 来应对。
但这两种解决办法都存在一个问题,那就是非常多的人工干预。想要减少人的工作量,就需要一种工具来自动管理 Pod。ReplicaSet 这种资源对象就实现这个功能。
ReplicaSet 控制器通过持续监听一组 Pod 的运行状态,在 Pod 数量减少或增加时就会触发调谐过程,最终保证副本数量始终如期望一致。
ReplicaSet 资源清单
可以通过 explain 展示 ReplicaSet 资源清单支持的参数:
kubectl explain rs
示例资源清单:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
namespace: default
spec:
# 期望的副本数量
replicas: 3
# 标签选择器
selector:
matchLabels:
app: nginx
# 模板
template:
# Pod 的资源清单
# 注释掉的配置控制器是知道的,所以不需要专门定义
# apiVersion: v1
# kind: Pod
metadata:
# 由于多个副本,让它自己生成即可,一般为控制器的 name-(ID前几位)
# name: rs-nginx-xxx
# 命名空间必须和控制器一致,也不需要定义
# namespace: default
# 标签需要定义,且要满足上面标签选择器的需求
labels:
app: nginx
version: v1.0
spec:
containers:
- name: rs-nginx-container
image: nginx
ports:
- containerPort: 80
特别说明:
- 和 Pod 不同,ReplicaSet 的 apiVersion 为
apps/v1
。 replicas
为 ReplicaSet 的核心配置,用于定义副本数。selector
标签选择器为必选项,必须和 Pod 中的标签进行匹配,不同的 RS 可以有相同的标签,互不影响。- ReplicaSet 属于 Pod 的上层封装,其底层还是管理 Pod,所以 Pod 的知识一定要掌握。
template
字段下面定义的其实就是 Pod 的资源清单,一般会对 Pod 的资源清单进行精简,去掉某些重复声明。
RS 实用操作
常用的 ReplicaSet 资源清单操作命令:
# 创建和更新
kubectl apply -f rs-nginx.yaml
# 查看
kubectl get rs
# 通过标签筛选查看 Pod
kubectl get pods -A -o wide -l app=nginx
# 查看 rs 信息
kubectl describe rs rs-nginx
# 删除 Pod,RS 会新建 Pod 以满足期望的副本数
kubectl delete pod rs-nginx-25wg5
# 删除 RS
kubectl delete -f rs-nginx.yaml
# 另外一种删除方式
kubectl delete rs rs-nginx
# 第三种删除方式就是将资源清单中副本数调整为 0 再更新一次
# yaml 格式输出 Pod 的资源清单,metadata.ownerReferences 可以看到所属的 RS,该字段类似 RS 的外键
kubectl get pod rs-nginx-6ng5l -o yaml
# yaml 格式输出 RS 的资源清单
kubectl get rs rs-nginx -o yaml
Replication Controller(扩展了解)
Replication Controller 简称 RC
,实际上 RC 和 RS 的功能几乎一致,RS 算是对 RC 的改进。
目前唯一的一个区别就是 RC 只支持基于等式的 selector(env=dev或env!=qa),RS 支持基于集合的 selector。
比如 RC 的 selector 是这样的,只支持单个 Label 的等式:
selector:
app: nginx
而 RS 中的 Label Selector 支持 matchLabels
和 matchExpressions
两种形式:
# matchLabels 格式
selector:
matchLabels:
app: nginx
# matchExpressions 格式
selector:
matchExpressions:
- key: app
operator: In
values:
- nginx
总的来说,RS 是新一代的 RC,所以 RC 几乎被废弃,直接使用 RS 即可。
但是实际使用中一般也不会直接使用 RS,而是使用更上层的类似于 Deployment 这样的资源对象。