# 2. RC应用(replication Controller :pod的复制抽象,提供服务的高可用。) master节点上面操作 之前的pod 可以删除,先前的是用于测试的。配置yml文件 一般情况下,很少手工建pod,都至少是一个服务一个RC,为了实现所谓的高可用,以及治愈,还有滚动升级的功能,对业务的影响非常小。 cd /opt/yml/test cat >k8s_nginx_rc.yml<<EOF apiVersion: v1 kind: ReplicationController metadata: name: nginxrc spec: replicas: 3 selector: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: 192.168.20.88:5000/dfsc/nginx:v1 ports: EOF replicas: 3 ##副本,一启RC,生成3个pod,来提供高可用和治愈功能。当有一个down机了,立马生成一个新的。
kubectl create -f k8s_nginx_rc.yml kubectl get rc
![]()
测试治愈功能: 删除一个pod kubectl get pods -o wide ##查看原来的pod kubectl delete pod nginxrc-7ncvq ##删除一个pod kubectl get pods -o wide ##查看 新生成的pod
副本数增删 kubectl delete rc ningxrc ##删除RC 方法一:修改配置文件 cd /opt/yml/test vim k8s_nginx_rc.yml replicas: 3 ## 修改replicas: 后面的数字 kubectl replace -f k8s_nginx_rc.yml 方法二: 2、kubectl edit rc nginx 方法三、用命令修改 3、kubectl scale rc nginxrc --replices=4 ##用得比较多
滚动升级及回滚(所有pod升级) 修改镜像内容:
docker run -it 8cf1bfb43ff5 /bin/bash
提交修改给的镜像:
docker commit 096a160355fe 192.168.20.88:5000/dfsc/nginx:v3
![]()
将新的镜像push 到registry docker push 192.168.20.88:5000/dfsc/nginx:v3
滚动升级: cd /opt/yml/test cp k8s_nginx_rc.yml k8s_nginx_rc1.yml ##备份原来的文件 修改新的文件 k8s_nginx_rc1.yml vim k8s_nginx_rc1.yml
保存退出。 kubectl rolling-update nginxrc -f k8s_nginx_rc1.yml --update-period=10s nginxrc ----> 原有的配置文件中的名称 k8s_nginx1-rc.yml ----->新的配置文件 --update-period=10s ##每10秒替换一个,这样的话,可以保证,原来的业务不受影响。时间可以任意改的
在更新过程中,有报错,或者卡在一个地方不动了,都可以回滚(roollback)。 kubectl rolling-update nginxrc nginxrc1 --rollback ##把刚才升级过的,回退。 只能是在升级过程中。
查找原因发现如下问题: Docker 容器启动时,默认会把容器内部第一个进程,也就是pid=1的程序,作为docker容器是否正在运行的依据,如果 docker 容器pid=1的进程挂了,那么docker容器便会直接退出。 nginx镜像在启动时,Docker未执行自定义的 命令(cmd) 之前,nginx的pid是1,执行到自定义 命令(cmd) 之后,nginx就在后台运行,bash或sh脚本的pid变成了1。 由于刚才我们启动的nginx 镜像,是手动运行的 /bin/bash 修改完nginx 配置文件后,做commit 。这个镜像以后启容器的时候,第一个运行的就是/bin/bash ,而不是把nginx的进程放在前台运行。 所以我们在做,滚动升级的时候,进行替换原来的pod ,会卡住,因为新的镜像的容器,启动后,马上退出了,没有夯住。 我们可以手动修改yml配置文件,让在启动容器时,自动把nginx的进程放在前台 cd /opt/yml/test vim k8s_nginx_rc1.yml
再次执行滚动升级 kubectl rolling-update nginxrc -f k8s_nginx_rc1.yml --update-period=10s
![]()
![]()
回滚即是相反操作即可 注: 在升级过程中,可以进行回退。 如果升级完成,则不可以使用这条指令进行回退。 全部升级完成后,想要回退,到旧版本。可以又反过来做一遍 kubectl rolling-update ngixrc1 -f k8s_nginx_rc.yml --update-period=10 --rollback ngixrc1 ------>升级后新的RC的名称 k8s_nginx_rc.yml -------->老版本的配置文件 RC资源功能小结: kubectl create -f 配置文件 ##创建RC kubectl replace -f 配置文件 ##更新RC kubectl get rc ##查询 有那些RC kubectl scale rc RCNAME --replicas=4 ## 在线改副本数量 kubectl rolling-update OLDRCNAME -f NEWRCFILE --update-period=5s ## 滚动升级 kubectl rolling-update OLDRCNAME NEWRCNAME --rollback ## 升级过程中出现问题,回滚。