1、RC(Replication Controller)副本控制器,Replication Controller的作用。
应用托管在kubernetes之后,kubernetes需要保证应用能够持续运行,这是RC的工作内容,它会确保任何时间kubernetes中都有指定数量的Pod在运行。在此基础上,RC还提供了一些更高级的特性,比如滚动升级,升级回滚等等。
通俗的理解就是,当将应用通过K8s运行起来之后,我们的k8s是需要保证容器一直处于持续运行,保证它的高可用,那么我们的RC就可以确保容器的高可用,RC的工作原理就是,RC是会一直监控我们的K8S容器,也就是说POD资源它的运行状态,一旦发现这个Pod资源有异常了,那么我们的RC就会控制k8s在其他的Node节点上启动一个新的Pod,以此来保证这个业务的高可用运行。RC除了保证Pod高可用之外,还提供了更高级的特性,比如滚动升级,升级回滚等等。
2、首先,查看你的k8s各个节点状态是否正常运行,然后创建一个rc的目录,用于存放RC(Replication Controller)的yaml配置文件。
1 [root@k8s-master ~]# kubectl get nods 2 the server doesn't have a resource type "nods" 3 [root@k8s-master ~]# kubectl get node 4 NAME STATUS AGE 5 k8s-master Ready 6d 6 k8s-node2 Ready 6d 7 k8s-node3 Ready 6d 8 [root@k8s-master ~]# kubectl get nodes 9 NAME STATUS AGE 10 k8s-master Ready 6d 11 k8s-node2 Ready 6d 12 k8s-node3 Ready 6d 13 [root@k8s-master ~]# clear 14 [root@k8s-master ~]# kubectl get componentstatus 15 NAME STATUS MESSAGE ERROR 16 scheduler Healthy ok 17 controller-manager Healthy ok 18 etcd-0 Healthy { "health":"true"} 19 [root@k8s-master ~]# clear 20 [root@k8s-master ~]# cd k8s/ 21 [root@k8s-master k8s]# ls 22 pod 23 [root@k8s-master k8s]# mkdir rc 24 [root@k8s-master k8s]# cd rc/ 25 [root@k8s-master rc]# ls 26 [root@k8s-master rc]# vim nginx_rc_yaml 27 [root@k8s-master rc]# kubectl create -f nginx_rc_yaml 28 replicationcontroller "myweb" created 29 [root@k8s-master rc]# kubectl get rc 30 NAME DESIRED CURRENT READY AGE 31 myweb 2 2 1 13s 32 [root@k8s-master rc]#
创建nginx_rc_yaml配置文件,配置内容,如下所示。
1 # 声明api的版本。 2 apiVersion: v1 3 # kind代表资源的类型,资源是ReplicationController。 4 kind: ReplicationController 5 # 资源叫什么名字,是在其属性metadata里面的。 6 metadata: 7 # 第一个属性name的值是myweb,即ReplicationController的名字就叫做myweb。 8 name: myweb 9 # spec是详细,详细里面定义了一个容器。 10 spec: 11 # 声明副本数量是2,代表了RC会启动两个相同的Pod。 12 replicas: 2 13 # 选择器。 14 selector: 15 app: myweb 16 # Pod的启动模板,和Pod的yaml配置信息基本差不多的,几乎一样,但是这里没有名称,是因为两个Pod名称不能完全一样的。 17 # 没有指定名称,RC会随机生成一个名称。 18 template: 19 # 资源叫什么名字,是在其属性metadata里面的。但是这里让RC随机生成指定数量的名称。 20 metadata: 21 # 给Pod贴上了一个标签,标签是app: web,标签是有一定的作用的。 22 labels: 23 app: myweb 24 # spec是详细,详细里面定义了一个容器。 25 spec: 26 # 定义一个容器,可以声明多个容器的。 27 containers: 28 # 容器的名称叫做myweb 29 - name: myweb 30 # 使用了什么镜像,可以使用官方公有的,也可以使用私有的。 31 image: 192.168.110.133:5000/nginx:1.13 32 # ports定义容器的端口。 33 ports: 34 # 容器的端口是80,如果容器有多个端口,可以在后面接着写一行即可。 35 - containerPort: 80
配置,如下所示:
如果如何控制yaml的格式,可以使用notepad++的yaml语言格式,或者在线yaml解析,或者idea的yaml配置文件,idea的yaml配置文件也推荐使用哦。
创建好RC(Replication Controller)之后,可以进行检查。可以看到RC创建了两个Pod,可以查看一下Pod的数量和状态。
1 [root@k8s-master rc]# kubectl get rc 2 NAME DESIRED CURRENT READY AGE 3 myweb 2 2 1 7m 4 [root@k8s-master rc]# kubectl get pods 5 NAME READY STATUS RESTARTS AGE 6 myweb-0hqc5 0/1 ImagePullBackOff 0 8m 7 myweb-2np4k 1/1 Running 0 8m 8 nginx 1/1 Running 1 3d 9 test1 0/1 ImagePullBackOff 0 2d 10 test2 2/2 Running 1 2d 11 test4 1/1 Running 0 2d 12 [root@k8s-master rc]#
很明显,我这里创建的两个Pod,有一个启动失败了。此时,我想将失败的Pod删除掉,但是我删除了一个,RC又帮助你启动了一个,嗯,真的是高可用啊,然后我将RC删除掉,这两个Pod就随着被删除掉了。
1 [root@k8s-master ~]# kubectl get rc 2 NAME DESIRED CURRENT READY AGE 3 myweb 2 2 1 17m 4 [root@k8s-master ~]# kubectl get pod -o wide 5 NAME READY STATUS RESTARTS AGE IP NODE 6 myweb-8cp7h 0/1 ImagePullBackOff 0 5m 172.16.85.3 k8s-master 7 myweb-qcgjl 1/1 Running 1 14m 172.16.5.2 k8s-node2 8 nginx 1/1 Running 2 3d 172.16.38.3 k8s-node3 9 test1 0/1 ImagePullBackOff 0 2d 172.16.85.2 k8s-master 10 test2 2/2 Running 3 2d 172.16.38.2 k8s-node3 11 test4 1/1 Running 1 2d 172.16.5.3 k8s-node2 12 [root@k8s-master ~]# kubectl delete rc myweb 13 replicationcontroller "myweb" deleted 14 [root@k8s-master ~]# kubectl get rc 15 No resources found. 16 [root@k8s-master ~]#
这里我将没有用的测试Pod都删除掉,因为我笔记本只有8g内存,可能内存不够用了。搞了一个小时,不是内存的问题,是之前部署k8s的时候,测试nginx的时候将nginx拼错了,尴尬。
1 [root@k8s-node2 ~]# docker images 2 REPOSITORY TAG IMAGE ID CREATED SIZE 3 docker.io/busybox latest 1c35c4412082 8 days ago 1.22 MB 4 192.168.110.133:5000/nginx 1.13 ae513a47849c 2 years ago 109 MB 5 docker.io/nginx 1.13 ae513a47849c 2 years ago 109 MB 6 192.168.110.133:5000/pod-infrastructure latest 34d3450d733b 3 years ago 205 MB 7 docker.io/tianyebj/pod-infrastructure latest 34d3450d733b 3 years ago 205 MB 8 [root@k8s-node2 ~]#
而我的RC的yaml的配置文件,如下所示:
1 Version: v1 2 kind: ReplicationController 3 metadata: 4 name: myweb 5 spec: 6 replicas: 2 7 selector: 8 app: myweb 9 template: 10 metadata: 11 labels: 12 app: myweb 13 spec: 14 containers: 15 - name: myweb 16 image: 192.168.110.133:5000/nginx:1.13 17 # imagePullPolicy: IfNotPresent 18 ports: 19 - containerPort: 80
但是主节点的docker镜像是192.168.110.133:5000/ngnix,造成了每次创建RC,在主节点的Pod都无法启动,尴尬,还排查了这么久