云计算之 docker 集群管理_ K8S_03 RC的操作

# 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 ## 升级过程中出现问题,回滚。