四、资源控制器
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运行