资源控制器

四、资源控制器

pod分为两种类型:

  • 自主式pod:如果pod退出,不会被重新创建
  • 控制器管理的pod:如果pod退出,资源控制器会注意到缺少了pod并重建替代pod,以维持设定的pod副本数目

在第三章中创建的pod都是自主式pod。下面介绍控制器管理的pod,控制器有很多类型:

  • ReplicationController 和 ReplicaSet
  • Deployment
  • DaemonSet
  • StateFulSet
  • Job/CronJob
  • Horizontal Pod Autoscaling

1 ReplicationController和ReplicaSet

1.1 ReplicationController

ReplicationController可确保它管理的pod始终保持运行状态。如果pod因任何原因消失(例如节点从集群中消失或由于该pod已从节点中逐出),则ReplicationController会注意到缺少了pod并创建替代pod,确保容器应用的副本数始终保持在用户定义的副本数,而如果异常多出来的容器也会自动回收。

RC的控制流程如下图所示:
资源控制器

RC有三个主要部分:

  • 标签选择器:用于确定RC管理哪些pod
  • 副本个数:指定应运行的pod的期望数量
  • pod模版:创建pod的资源清单

创建一个RC的资源清单如下:

apiVersion: v1
kind: ReplicationController  # 定义资源类型为RC
metadata:
  name: kubia  # RC的名字
spec:
  replicas: 3  # 期望的pod数目
  selector:
    app: kubia  # pod选择器决定RC管理哪些pod(通过pod的标签)
  template:  # 创建pod所使用的模版
    metadata:
      labels:
      app: kubia  # 添加标签,RC根据这个标签名来管理pod
    spec:
      containers:
      - name: mykubia
        image: luksa/kubia
        ports:
        - containerPort: 8080

根据这个资源清单创建RC还是使用之前提到的kubectl create/apply -f命令即可,RC名字叫做kubia,它确保符合标签选择器app=kubia的pod始终为三个,当没有足够的pod时,根据提供的pod模板创建新的pod。template中的内容与前面我们手动创建pod的资源清单的定义基本相同。

刚创建这个RC时,此时并没有app=kubia标签,RC会根据template模版的内容,创建出三个pod。如果此时手动删除一个pod,RC会立即启动一个新pod,保持pod的数量始终为三。

可以通过kubectl get rc命令查看关于RC的相关信息:

NAME DESIRED CURRENT READY AGE
kubia  3       3       2   3m

1.2 ReplicaSet

下面要说明的是:使用ReplicaSet来代替ReplicationController。RS和RC相比,RS在标签选择的功能上更加强大:比如RS可以仅匹配标签名(相当于labels=*)而不论标签的内容是什么;再比如RS还允许匹配缺少某个标签的pod等等。

RS的资源清单如下:

apiVersion: apps/v1
kind: ReplicaSet  # # 定义资源类型为RS
metadata:
  name: kubia
spec:
  replicas: 3
  selector:  # 这里的matchlabels和RC的selector作用是相同的
    matchLabels:  
      app: kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: mykubia
        image: luksa/kubia

可以看到与RC基本相同,惟一的区别在选择器上:没必要在selector中直接指定匹配pod的标签,而是多了一层matchLabels,在它下面指定标签。

创建RS也使用kubectl create/apply -f命令,同样可以通过如下命令来检查RS的相关信息:

kubectl get rs
kubectl describe rs

如你所见,RC与RS的使用没有任何区别,在RC的基础上,RS支持另一种选择器:

# 一个RS资源清单的选择器部分
selector:
  matchExpressions:
  - key: app
    operator: In
    values:
      - kubia

RS可以使用matchExpressions标签选择器,可以添加额外的表达式,这种表达式由如下几个部分组成:

  • key标签名
  • operator运算符,有四种:
    • In,标签的值必须与其中一个指定的values匹配
    • NotIn,标签的值与任何指定的values不匹配
    • Exists,pod必须包含一个指定名称的标签(值不重要)。使用此运算符时,不应指定values字段。
    • DoesNotExist,pod不得包含有指定名称的标签。使用此运算符时,不应指定values字段。
  • values标签值

比如,上述例子要求pod必须包含名为app的标签,且标签值必须为kubia

k8s推荐使用RS代替RC,且后续会将RC弃用。

1.3 通过资源控制器管理pod

RC和RS作为资源控制器,可以很方便地对pod进行管理,比如扩容缩容等操作。你可以随时更改资源清单的replicas,方便地实现pod扩容缩容。并且,如果你更改了一个pod的标签,那么这个pod就不再归该资源控制器管理了,当你更改pod标签时,RC或RS会注意到一个pod丢失了,于是重新创建一个新的。此时被更改过标签的pod就变得和其他手动创建的pod 一样,如果把这个更改过标签的pod删掉,RC或者RS也不会重新调度它。

1.4 删除RC或者RS

接下来介绍如何删除资源控制器:

kubectl delete rc rc名称  # 删除rc
kubectl delete rs rs名称  # 删除rs
# 举例
kubectl delete rs kubia  # 删除一个名为kubia的rs

注意,当你删除RC或者RS时,对应的pod也会被删除,如果你不想删除pod,可以添加如下参数:

kubectl delete rs kubia --cascade=false  # 删除名为kubia的rs,但保持pod运行
上一篇:前端智能化漫谈 (3) - pix2code推理部分解析


下一篇:《精通Android 5 多媒体开发》——第6章,第6.2节分析硬件抽象层