咱们有了 pod,那么就须要对 pod 进行控制,就是同一个服务的 podv我须要启动几个?若是须要扩容了,怎么办?这里就有个控制器,ReplicationController(简称rc)。node
不过咱们看官网:nginx
这里告诉咱们,ReplicationController 如今已通过时了,如今建议使用 Deployment 配合ReplicaSet。ReplicationController的主要功能是保证Pod的数量、健康,弹性收缩等。可是Deployment除了有这些功能以外,还增长了回滚功能(当升级 pod 镜像或者相关参数的时候,若是有错误,能够回滚到上一个稳定版本),版本记录(每一次对 Deployment 的操做都能保存下来)。暂停和启动(升级的时候,能随时暂停和启动)。redis
估计不久的未来,ReplicationController 就不会有人用了。不过咱们仍是基本了解下 ReplicationController 的一些配置。api
下面是官方的一份ReplicationController的配置文件:app
apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
其中spec.template是spec中必须填写的,它就是一个pod的配置。pod的配置全集在上一篇咱们看到了。frontend
其中.spec.replicas表示这个pod须要维持几份。若是没有配置的话,它就是为1。好比上面那个例子,就保持3份nginx服务。学习
其中的selector咱们这里能够好好研究下,这个是咱们第一次见到。设计
标签选择器在不少概念都是会使用到的,好比pod在哪一个node上,ReplicationController做用在哪一个pod上,service做用在哪一个pod上,等等。tag标注的系统化也是k8s应用集群必要的设计之一。3d
标签选择器理解起来却是很简单,就是一堆的key:value。好比我能够给pod设置3个label:code
metadata: labels: key1: value1, key2: value2, key3: value3
key1=value1, key2=value2, key3=value3。
而后在ReplicationController的selector里面,有两种写法,一种是简单写法,一种高级写法。(好像网上没有这种说法,可是我理解就是这样的)
简单写法:
selector: key1: value1
表明这个ReplicationController选择labels有key1标签,且标签值为value1的pod进行控制。
高级写法:(这个高级写法里面的matchExpressions其实ReplicationController是不支持的,ReplicaSet才开始支持。不知道后续会不会支持个正则匹配)
selector: matchLabels: key1: value1 matchExpressions: - {key: key2, operator: In, values: [value2, value4]}
表明这个ReplicationController选择labels有标签和标签值,key1:value1,且key2在value2和value4集合中的pod进行控制。
咱们能够在查看资源的时候带上--show-labels
来获取labels,好比:
kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS busybox 1/1 Running 26 3d <none> busybox1 1/1 Running 26 3d name=busybox busybox2 1/1 Running 26 3d name=busybox frontend-5c548f4769-l9cts 1/1 Running 0 1h app=guestbook,pod-template-hash=1710490325,tier=frontend frontend-5c548f4769-nnp2b 1/1 Running 0 1h app=guestbook,pod-template-hash=1710490325,tier=frontend frontend-5c548f4769-zjwwm 1/1 Running 0 1h app=guestbook,pod-template-hash=1710490325,tier=frontend redis-master-55db5f7567-929np 1/1 Running 0 1h app=redis,pod-template-hash=1186193123,role=master,tier=backend redis-slave-584c66c5b5-dsbcc 1/1 Running 0 1h app=redis,pod-template-hash=1407227161,role=slave,tier=backend redis-slave-584c66c5b5-kfhnq 1/1 Running 0 1h app=redis,pod-template-hash=1407227161,role=slave,tier=backend task-pv-pod 1/1 Running 0 1d <none>
虽然官网有推荐了一些labels
"release" : "stable", "release" : "canary" "environment" : "dev", "environment" : "qa", "environment" : "production" "tier" : "frontend", "tier" : "backend", "tier" : "cache" "partition" : "customerA", "partition" : "customerB" "track" : "daily", "track" : "weekly"
可是我感受你们写集群的时候也并无按照这些建议的labels。基本上一个集群有本身的一套设计。
最后在总结下,ReplicationController这个已是被淘汰的了,连k8s官网的demo已经都切换到deployment+replicaset了,因此遇到有用ReplicationController的书和文章,能够弃读了。
-- 当前日期:2019年7月9日