Kubernetes的基本概念和术语-Replication Controller

RC是Kubernetes系统中的核心概念之一,简单来说,它其实定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值,所以RC的定义包括如下几个部分。

  1. Pod期待的副本数量。
  2. 用于筛选目标Pod的Label Selector。
  3. 当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模板(template)
apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
spec:
  replicas: 1
  selector:
    tier: frontend
  template
    metadata:
      lables:
        app: app-demo
        tier: frontend
    spec:
      containers:
      - name: tomcat-demo
        image: tomcat
        imagePullPolicy: ifNotPresent
        env:
        - name: GET_HOST_FROM
          value: dns
        ports:
        - containersPort: 80
 

在我们定义了一个RC并将其提交到Kubernetes集群中后,Master上的Controller Manager组件就得到通知,定期巡检系统中当前存活的目标Pod,并确保目标Pod实例的数量刚好等于此RC的期望值,如果有过多的Pod副本在运行,系统就会停掉一些Pod,否则系统会再自动创建一些Pod。可以说,通过RC,Kubernetes实现了用户应用集群的高可用性,并且大大减少了系统管理员在传统IT环境中需要完成的许多手工运维工作(如主机监控脚本、应用监控脚本、故障恢复脚本等)。

下面以有3个Node的集群为例,说明Kubernetes如何通过RC来实现Pod副本数量自动控制的机制。假如在我们的RC里定义redis-slave这个Pod需要保持两个副本,系统将可能在其中的两个Node上创建Pod。图1.9描述了在两个Node上创建redis-slave Pod的情形。

 

 

 图1.9 在两个Node上创建redis-slave Pod

假设Node 2上的Pod 2意外终止,则根据RC定义的replicas数量2,Kubernetes将会自动创建并启动一个新的Pod,以保证在整个集群中始终有两个redis-slave Pod运行。

如图1.10所示,系统可能选择Node 3或者Node 1来创建一个新的Pod。

图1.10 根据RC定义创建新的Pod

此外,在运行时,我们可以通过修改RC的副本数量,来实现Pod的动态缩放(Scaling),这可以通过执行kubectl scale命令来一键完成:

kubectl scale rc redis-slave --replicas=3
scaled

执行结果

需要注意的是,删除RC并不会影响通过该RC已创建好的Pod。为了删除所有Pod,可以设置replicas的值为0,然后更新该RC。另外,kubectl提供了stop和delete命令来一次性删除RC和RC控制的全部Pod。

应用升级时,通常会使用一个新的容器镜像版本替代旧版本。我们希望系统平滑升级,比如在当前系统中有10个对应的旧版本的Pod,则最佳的系统升级方式是旧版本的Pod每停止一个,就同时创建一个新版本的Pod,在整个升级过程中此消彼长,而运行中的Pod数量始终是10个,几分钟以后,当所有的Pod都已经是新版本时,系统升级完成。通过RC机制,Kubernetes很容易就实现了这种高级实用的特性,被称为“滚动升级”

apiVersion: extensions/v1betal
kind: Replicaset
metadata:
  name: frontend
spec:
  selector:
    matchLables:
        tier: frontend
    metchExpressions:
    - {key: tier, operator: In, values: [fronted]}
template
...................................................................
 

kubectl命令行工具适用于RC的绝大部分命令同样适用于Replica Set。此外,我们当前很少单独使用Replica Set,它主要被Deployment这个更高层的资源对象所使用,从而形成一整套Pod创建、删除、更新的编排机制。我们在使用Deployment时,无须关心它是如何创建和维护Replica Set的,这一切都是自动发生的。

Replica Set与Deployment这两个重要的资源对象逐步替代了之前RC的作用,是Kubernetes 1.3里Pod自动扩容(伸缩)这个告警功能实现的基础,也将继续在Kubernetes未来的版本中发挥重要的作用。

最后总结一下RC(Replica Set)的一些特性与作用。

  •  在大多数情况下,我们通过定义一个RC实现Pod的创建及副本数量的自动控制。
  •  在RC里包括完整的Pod定义模板。
  •  RC通过Label Selector机制实现对Pod副本的自动控制。
  •  通过改变RC里的Pod副本数量,可以实现Pod的扩容或缩容。
  •  通过改变RC里Pod模板中的镜像版本,可以实现Pod的滚动升级。

 

posted @ 2021-02-01 16:58  星火撩原  阅读(63)  评论(0编辑  收藏  举报