pod分为两种类型:
在第三章中创建的pod都是自主式pod。下面介绍控制器管理的pod,控制器有很多类型:
ReplicationController可确保它管理的pod始终保持运行状态。如果pod因任何原因消失(例如节点从集群中消失或由于该pod已从节点中逐出),则ReplicationController会注意到缺少了pod并创建替代pod,确保容器应用的副本数始终保持在用户定义的副本数,而如果异常多出来的容器也会自动回收。
RC的控制流程如下图所示:
RC有三个主要部分:
创建一个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
下面要说明的是:使用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弃用。
RC和RS作为资源控制器,可以很方便地对pod进行管理,比如扩容缩容等操作。你可以随时更改资源清单的replicas
,方便地实现pod扩容缩容。并且,如果你更改了一个pod的标签,那么这个pod就不再归该资源控制器管理了,当你更改pod标签时,RC或RS会注意到一个pod丢失了,于是重新创建一个新的。此时被更改过标签的pod就变得和其他手动创建的pod 一样,如果把这个更改过标签的pod删掉,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运行