Kubernetes常用资源对象-RC和RS

前面我们学习了Pod的一些基本用法,而且前面我们都是直接来操作Pod;但是现在遇到了问题、假设我们现在有这样一种场景:

  • 第一种情况:某次运营活动⾮常成功,网站访问量突然暴增;
  • 第二种情况:运行当前 Pod 的节点发⽣故障了, Pod 不能正常提供服务了。

遇到这种情况该怎么办呢?第⼀种情况,相对比较好应对,⼀般活动之前我们会大概计算一下会有多大的访问量,提前多启动几个 Pod ,活动结束后再把多余的 Pod 杀掉,虽然有点麻烦,但还是能够应对这种情况的。第⼆种情况,可能某天夜⾥收到⼤量报警说服务挂了,管理员收到告警信息以后起来打开电脑在另外的节点上重新启动⼀个新的 Pod ,问题也很好的解决了。

那么、问题来了:如果我们都人工去解决遇到的这些问题,似乎⼜回到了以前刀耕火种的时代了,有没有一种工具能够帮助我们来管理 Pod 呢?如果 Pod 不够了自动帮我们新增⼀个, Pod 挂了自动帮我们在合适的节点上重新启动⼀个 Pod ,这样是不是遇到上⾯的问题我们都不需要手动去解决了?

非常幸运、Kubernetes就为我们提供了这样的资源对象:

  • Replication Controller:⽤来部署、升级 Pod
  • Replica Set:下⼀代的 Replication Controller
  • Deployment:可以更加⽅便的管理 Pod 和 Replica Set

1、什么是Replication Controller(RC)?

Replication Controller 简称 RC , RC 是 Kubernetes 系统中的核⼼概念之一,简单来说, RC 可以保证在任意时间运行 Pod 的副本数量,能够保证 Pod 总是可⽤的。如果实际 Pod 数量⽐指定的多那就结束多余的,如果实际数量比指定的少就新启动⼀些 Pod ,当 Pod 失败、被删除或者挂掉 后, RC 都会去自动创建新的 Pod 来保证副本数量,所以即使只有⼀个 Pod ,我们也应该使⽤ RC 来 管理我们的 Pod 。

有了RC,我们再遇到上面的问题,可能除了第⼀种情况不能做到完全自动化,其余的我们是不是都不用担心了呢?例如:运行Pod 的节点挂了, RC 检测到 Pod 失败了,就会去合适的节点重新启动⼀个 Pod 就行,不需要我们手动去新建⼀个 Pod 了。如果是第⼀种情况,我们是不是可以在活动开始之前就给 Pod 指定10个副本,结束后将副本数量改成2,这样是不是也远比们手动去启动、手动去关闭要好得多呢?

话不多说、下面我们就通过一个示例来看看如何通过RC来管理我们前面使用的Nginx的Pod、Yaml文件如下:

---
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-demo
  labels:
    name: rc
spec:
  replicas: 3
  selector:
    name: rc
  template:
    metadata:
      labels:
        name: rc
    spec:
      containers:
      - name: nginx-demo
        image: nginx
        ports:
        - containerPort: 80

img

注:在上面这个Yaml文件中我们定义了⼀个 RC 资源对象,它的名字叫 rc-demo ,他能保证⼀直会有3
个 Pod 运⾏, Pod 的镜像是 nginx 镜像。spec.selector 和 spec.template.metadata.labels 这两个字段必须相同,否则会创建失败的,当然我们也可以不写 spec.selector ,这样就默认与 Pod 模板中的 metadata.labels 相同了。所以为了避免不必要的错误的话,这里建议不写。

RC相关参数:

  • kind: ReplicationController;
  • spec.replicas: 指定 Pod 副本数量,默认为1;
  • spec.selector: RC 通过该属性来筛选要控制的 Pod;
  • spec.template: 这⾥就是我们之前的 Pod 的定义的模块,但是不需要 apiVersion 和 kind 了;
  • spec.template.metadata.labels: 注意这⾥的 Pod 的 labels 要和 spec.selector 相同,这样 RC 就可以来控制当前这个 Pod 了。

更多RC相关参数我们可以去查看官方API接口文档:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#replicationcontroller-v1-core

然后我们通过 kubectl apply -f rc-demo.yaml 命令创建RC对象并查看RC对象:

img

我们可以看到RC对象已经成功创建、目标副本数量为3个、目前是3个、Ready状态也是3个。

我们可以通过 kubect describe rc rc-demo 命令查看 RC 的详细信息 :

img

当然、我们也可以通过 RC 来修改Pod的副本数量为,我们可以通过修改 rc-demo.yaml 文件,然后执行 kubect apply -f rc-demo.yaml 命令进行更新;也可以通过 命令进行修改,这里我们修改副本数量为2:

img

img

我们还可以⽤ RC 来进⾏滚动升级,例如我们将镜像地址更改为 nginx:1.7.9,执行 kubectl rolling-update rc-demo –image=nginx:1.7.9 命令如下 :

img

我们可以看到 RC 对象的升级过程、首先去创建了一个新的Pod、新的Pod启动以后开始停用老的Pod、依次滚动。滚动更新完成以后我们也可以通过 kubect describe rc rc-demo 命令看到、nginx镜像版本已经切换为1.7.9了。

如果我们的 Pod 中多个容器的话,就需要通过修改 Yaml ⽂件来进⾏修改了,这里就不再演示了。如果升级完成后出现了新的问题,想要⼀键回滚到上⼀个版本的话,使⽤ RC 只能⽤同样的⽅法把镜像地址替换成之前的,然后重新滚动升级(RC的弱点、后面我们会讲到)。

2、什么是Replication Set(RS)

Replication Set 简称 RS ,随着 Kubernetes 的⾼速发展,官⽅已经推荐我们使用 RS 和 Deployment 来代替 RC 了,实际上 RS 和 RC 的功能基本⼀致,目前唯⼀的区别就 是 RC 只支持基于等式的 selector (env=dev或environment!=qa),但 RS 还支持基于集合 的 selector (version in (v1.0, v2.0)),这对复杂的运维管理就非常方便了。 kubectl 命令行工具中关于 RC 的⼤部分命令同样适用于我们的 RS 资源对象。不过我们也很少会去单独使用 RS ,它主要被 Deployment 这个更加高层资源对象使⽤,除非用户需要⾃定义升级功能或根本不需要升级 Pod ,在⼀般情况下,我们推荐使用 Deployment 而不直接使用 Replica Set 。

RS 示例代码:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  # Unique key of the ReplicaSet instance
  name: replicaset-example
spec:
  # 3 Pods should exist at all times.
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      # Run the nginx image
      - name: nginx
        image: nginx:1.10

具体的示例演示这里就不再详细讲解了 、感兴趣的小伙伴可以自己去操作一下、当然也可以去参考官网API文档:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#replicaset-v1-apps

我们来总结一下RC / RS 的特性和作用:

  • ⼤部分情况下,我们可以通过定义⼀个 RC 实现的 Pod 的创建和副本数量的控制;
  • RC 中包含⼀个完整的 Pod 定义模块(不包含 apiversion 和 kind );
  • RC 是通过 label selector 机制来实现对 Pod 副本的控制的;
  • 通过改变 RC ⾥⾯的 Pod 副本数量,可以实现 Pod 的扩缩容功能;
  • 通过改变 RC ⾥⾯的 Pod 模板中镜像版本,可以实现 Pod 的滚动升级功能(但是不⽀持⼀键回
    滚,需要⽤相同的⽅法去修改镜像地址)。

这就是如何使用 RC 或者 RS 来管理我们的 Pod ,后面我们继续讲解另外 ⼀种更加⾼级也是现在推荐使用的⼀个资源对象 Deployment 。

推荐文章