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 正提供服务,可能会遇到以下两种情况:

  1. 网站访问量突然暴增。

  2. 运行 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 支持 matchLabelsmatchExpressions 两种形式:

# matchLabels 格式
selector:
  matchLabels:
    app: nginx

# matchExpressions 格式
selector:
  matchExpressions:
    - key: app
      operator: In
      values:
        - nginx

总的来说,RS 是新一代的 RC,所以 RC 几乎被废弃,直接使用 RS 即可。

但是实际使用中一般也不会直接使用 RS,而是使用更上层的类似于 Deployment 这样的资源对象。

posted @ 2022-10-19 19:01  不知名换皮工程师  阅读(304)  评论(0编辑  收藏  举报