在学习rc控制器之前,我们再来了解一下k8s的核心组件:(详细介绍看官网)
架构图:
什么是rc(replication controller) 控制器:
Replication Controller 保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,Replication Controller就杀死几个,如果太少了,Replication Controller会新建几个,和直接创建的pod不同的是,Replication Controller会替换掉那些删除的或者被终止的pod,不管删除的原因是什么(维护阿,更新啊,Replication Controller都不关心)。基于这个理由,我们建议即使是只创建一个pod,我们也要使用Replication Controller。Replication Controller 就像一个进程管理器,监管着不同node上的多个pod,而不是单单监控一个node上的pod,Replication Controller 会委派本地容器来启动一些节点上服务(Kubelet ,Docker)。
Replication Controller只会对那些RestartPolicy = Always的Pod的生效,(RestartPolicy的默认值就是Always),Replication Controller 不会去管理那些有不同启动策略pod
使用rc控制器 起容器
1:创建 nginx-rc.yml 文件(kind: ReplicationController和之前的pod 最大区别在这里类型)
[root@k8s-master ~]# cat nginx-rc.yml
apiVersion: v1
kind: ReplicationController #rc 类型
metadata:
name: nginx #kubectl get rc nginx 通过命令rc显示的名称
spec:
replicas: 3 #容器副本数,就是起几个nginx的容器,这里是起3个(集群)
selector:
app: myweb #注意这里的名字,要和labels的一致,否则会报错
template:
metadata:
labels:
app: myweb #rc是通过识别这个名字来管理容器的,保证容器副本一直是3
spec:
containers:
- name: nginx #和上面的metadata一致就行
image: 192.168.6.129:5000/nginx:latest
ports:
- containerPort: 80
#如果容器里面需要指定变量:
#创建容器,查看
#删除一个容器,瞬间又起一个(前面创建文件指定了三个副本)优先删除容器起的时间是最小的
#修改 容器的信息 rc方式启动是这样修改:
[root@k8s-master ~]# kubectl edit rc nginx
#立刻就变为4个了
#Pod方式启动是这样修改:
[root@k8s-master tmp]# kubectl edit pod nginx
#或者直接修改nginx.yml 文件,起10个副本(10个容器) --- Kubectl apply -f nginx-rc.yml 重新加载配置文件
===========================================================================
扩展: rc 的故障自愈(控制容器副本数和定义的一致)
1: 使用pod 方式起一个容器
[root@k8s-master ~]# vim k8s_pod.yml
2:修改labels标签,改成和rc yml里面定义的一样。
[root@k8s-master ~]# kubectl edit pod nginx #或者修改配置文件,在apply加载
或者修改之前的pod,把metadata:
name: nginx
labels:
app: myweb2 #改成myweb
# 保存后:会发现刚才pod起的容器自动没有了:
rc其实就是通过app: myweb的来管理pod的,rc 会发现原本定义的是10个副本,现在是11个了,
默认会把当前创建时间最小的杀掉,所以只剩下之前rc起的10个容器了。
同理:
我们也可以修改一个pod,把里面的app: myweb 改成其它名字,这样就个pod就会脱离rc 的控制。
======================================================================
扩展2:rc 自动部署升级 或 回滚:
修改配置文件:
[root@k8s-master ~]# cp nginx.yml nginx2.yml
[root@k8s-master ~]# vim nginx2.yml
和之前的对比:
#创建一个192.168.6.129:5000/nginx:v1.1 镜像
#每10s 就会升级一个pod,升级一个就会删除一个原先的。(新的是nginx2- xxxxx)
#重新打开一个窗口,升级完成后,全部变成nginx2 了。