在K8s-Pod文档中我们创建的Pod是非托管的Pod,因为Pod被设计为用后就弃的对象,如果Pod正常关闭,K8s会将该Pod清除,它没有自愈的能力。Pod控制器是用来保持Pod状态的一种对象资源,如下为Pod控制器的作用

Pod控制组成部分

更改标签选择器和Pod模板不会影响现有的Pod.更改标签选择器会使现有的Pod脱离控制,但不会影响现有Pod的运行,更改Pod模板也不会影响现有Pod的运行,只会影响由改控制器新生成的Pod.

作用:

1:确保Pod副本数保持一致

2:当节点故障时会在其他节点运行创建的Pod以替代旧的Pod

3:非常容器实现Pod的水平伸缩。

三: Pod控制器-ReplicationController

3.1 RC-组成部分

3.1.1 label selector

标签选择器,用于确定控制的Pod

3.1.2 replica count

副本个数,指定用行的Pod数量

3.1.3 pod template

Pod模板,用于创建新的Pod副本

3.2 RC-创建

我们可以通过yaml格式的文件进行RC的创建

如下一个rc yaml格式的文件

[root@k8s-master-node1 pod-controller]# cat kubia-rc.yaml

apiVersion: v1   # API的版本

kind: ReplicationController  # Pod控制器 RC

metadata:     # 元数据

name: kubia

spec:        # 规格说明

replicas: 3   # 副本个数

selector:    # 标签选择器

app: kubia

template:  # 标签的模板

metadata:

labels:

app: kubia  # Pod标签,这里要确保跟RC的标签选择器一致

spec:

containers:

- name: kubia

image: luksa/kubia

ports:

- containerPort: 8080

创建RC

[root@k8s-master-node1 pod-controller]# kubectl create -f kubia-rc.yaml

查看一下有没有生成Pod

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels -o wide

会生成指定的副本数3个Pod,也会贴上app=kubia的标签

查看我们已经创建的ReplicationController

[root@k8s-master-node1 pod-controller]# kubectl get replicationcontroller -o wide

Replicationcontroller的缩写时rc

[root@k8s-master-node1 pod-controller]# kubectl get rc -o wide

上面的三列分别时所需的Pod数量,实际的Pod数量,已经准备就绪的Pod数量

查看rc kubia的相信信息

[root@k8s-master-node1 pod-controller]# kubectl describe rc kubia

现在我们尝试删除一个Pod,看下发生了什么

# 查看当前Pod

[root@k8s-master-node1 pod-controller]# kubectl get po

NAME          READY   STATUS    RESTARTS   AGE

kubia-7x4dp   1/1     Running   0          32m

kubia-f4b5d   1/1     Running   0          28m

kubia-m7bv2   1/1     Running   0          32m

# 尝试删除一个Pod

[root@k8s-master-node1 pod-controller]# kubectl delete po kubia-7x4dp

# 查看目前Pod 可以看到如果我们手动删除一个Pod,RC会自动的根据Pod template创建出一个Pod

[root@k8s-master-node1 ~]# kubectl get po

NAME          READY   STATUS              RESTARTS   AGE

kubia-59r66   0/1     ContainerCreating   0          2s

kubia-7x4dp   1/1     Terminating         0          34m

kubia-f4b5d   1/1     Running             0          31m

kubia-m7bv2   1/1     Running             0          34m

# 我们使用标签选择器删除这三个Pod

[root@k8s-master-node1 pod-controller]# kubectl delete  po -l app=kubia

 

 

# 再次查看Pod情况

[root@k8s-master-node1 ~]# kubectl get po

NAME          READY   STATUS              RESTARTS   AGE

kubia-59r66   1/1     Terminating         0          3m26s

kubia-dpgp5   0/1     ContainerCreating   0          3s

kubia-f4b5d   1/1     Terminating         0          34m

kubia-jlw9l   0/1     ContainerCreating   0          3s

kubia-m7bv2   1/1     Terminating         0          38m

kubia-m8n9p   0/1     ContainerCreating   0          3s

现在我们模拟一下节点故障

目前有两个Pod运行在worker 节点2上,现在我们将节点2down掉

# 我们看到节点2成为了NotReady状态

[root@k8s-master-node1 ~]# kubectl get nodes

NAME               STATUS     ROLES    AGE    VERSION

k8s-master-node1   Ready      master   2d     v1.13.1

k8s-worker-node1   Ready      <none>   2d     v1.13.1

k8s-worker-node2   NotReady   <none>   4h4m   v1.13.1

# 再查看Pod状态

[root@k8s-master-node1 pod-controller]# kubectl get pods

NAME          READY   STATUS    RESTARTS   AGE

kubia-dpgp5   1/1     Running   0          21m

kubia-jlw9l   0/1     Error     0          21m

kubia-m8n9p   0/1     Error     0          21m

# 等一会儿我们再次查看,K8s新创建了两个Pod,实现了自愈

[root@k8s-master-node1 pod-controller]# kubectl get po

NAME          READY   STATUS        RESTARTS   AGE

kubia-dl9zv   1/1     Running       0          5m47s

kubia-dpgp5   1/1     Running       0          29m

kubia-jlw9l   0/1     Terminating   0          29m

kubia-m8n9p   0/1     Terminating   0          29m

kubia-rjvnm   1/1     Running       0          5m47s

现在我们将节点2启动

发现Pod不会在发生改变,会把之前的Erro状态的Pod删除掉。

3.3 RC-作用域

RC 负责管理与标签选择器匹配的Pod,而不是绑定关系,两者没有互相依赖的关系,我们可以通过修改Pod的标签,从而脱离RC的管理,但该脱离Pod只是不受RC管理了,不会产生任何影响,所不同的是如果该Pod节点发生故障,Pod因为是非托管的Pod,该Pod会被删除而不会重建。

这里我们尝试修改其中一个Pod的标签

# 以下三个Pod有一个app=kubia的标签

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-dl9zv   1/1     Running   0          35m   app=kubia

kubia-dpgp5   1/1     Running   0          58m   app=kubia

kubia-rjvnm   1/1     Running   0          35m   app=kubia

# 现在我们修改其中一个Pod的标签

[root@k8s-master-node1 pod-controller]# kubectl label po kubia-dl9zv app=wangys --overwrite

# 现在看下Pod情况

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS              RESTARTS   AGE   LABELS

kubia-dl9zv   1/1     Running             0          35m   app=wangys

kubia-dpgp5   1/1     Running             0          59m   app=kubia

kubia-p5clz   0/1     ContainerCreating   0          3s    app=kubia

kubia-rjvnm   1/1     Running             0          35m   app=kubia

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-dl9zv   1/1     Running   0          35m   app=wangys

kubia-dpgp5   1/1     Running   0          59m   app=kubia

kubia-p5clz   1/1     Running   0          9s    app=kubia

kubia-rjvnm   1/1     Running   0          35m   app=kubia

说明:修改现有Pod的标签可以将该Pod移除RC的作用域,不受管理,但是该Pod正常运行不受影响,区别在于这个Pod节点故障就会被删除。

3.4 RC-Pod模板

对于Pod模板我们可能常常会更新,需要说明的是,如果Pod模板更新,并不会影响现有的Pod运行,影响的是新建的Pod,新建的Pod会根据这个Pod模板创建。

我们可以通过修改模板来验证我们的结论

# 现在三个Pod都有app=kubia的标签

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-dpgp5   1/1     Running   0          82m   app=kubia

kubia-p5clz   1/1     Running   0          23m   app=kubia

kubia-rjvnm   1/1     Running   0          59m   app=kubia

# 修改rc文件,新增rel:beta标签

[root@k8s-master-node1 pod-controller]# kubectl edit rc kubia

# 再次查看 原Pod标签没有修改

[root@k8s-master-node1 pod-controller]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-dpgp5   1/1     Running   0          86m   app=kubia

kubia-p5clz   1/1     Running   0          27m   app=kubia

kubia-rjvnm   1/1     Running   0          63m   app=kubia

我们删除一个Pod试试,新Pod会根据修改后的模板创建

[root@k8s-master-node1 pod-controller]# kubectl delete po kubia-dpgp5

[root@k8s-master-node1 ~]# kubectl get po --show-labels

NAME          READY   STATUS        RESTARTS   AGE   LABELS

kubia-2r2qx   1/1     Running       0          15s   app=kubia,rel=beta

kubia-dpgp5   1/1     Terminating   0          88m   app=kubia

kubia-p5clz   1/1     Running       0          29m   app=kubia

kubia-rjvnm   1/1     Running       0          65m   app=kubia

[root@k8s-master-node1 ~]# kubectl get po --show-labels

NAME          READY   STATUS    RESTARTS   AGE   LABELS

kubia-2r2qx   1/1     Running   0          38s   app=kubia,rel=beta

kubia-p5clz   1/1     Running   0          30m   app=kubia

kubia-rjvnm   1/1     Running   0          65m   app=kubia

3.5 RC-Pod水平伸缩

3.5.1  扩容

可以通过手动的方式

[root@k8s-master-node1 ~]# kubectl scale rc kubia --replicas=10

# 查看状态

[root@k8s-master-node1 pod-controller]# kubectl get po

NAME          READY   STATUS    RESTARTS   AGE

kubia-2r2qx   1/1     Running   0          8m30s

kubia-5c47l   1/1     Running   0          3m33s

kubia-bfksb   1/1     Running   0          3m33s

kubia-ctkcm   1/1     Running   0          3m33s

kubia-d6zh9   1/1     Running   0          3m33s

kubia-g7296   1/1     Running   0          3m33s

kubia-p5clz   1/1     Running   0          37m

kubia-rjvnm   1/1     Running   0          73m

kubia-rtg4q   1/1     Running   0          3m33s

kubia-s9n8k   1/1     Running   0          3m33s

 

通过编辑定义来扩容

[root@k8s-master-node1 pod-controller]# kubectl edit rc kubia

[root@k8s-master-node1 pod-controller]# kubectl get po

NAME          READY   STATUS    RESTARTS   AGE

kubia-2ctxt   1/1     Running   0          59s

kubia-2r2qx   1/1     Running   0          16m

kubia-5c47l   1/1     Running   0          11m

kubia-7hmm6   1/1     Running   0          59s

kubia-b5kxm   1/1     Running   0          59s

kubia-bfksb   1/1     Running   0          11m

kubia-ctkcm   1/1     Running   0          11m

kubia-d6zh9   1/1     Running   0          11m

kubia-g7296   1/1     Running   0          11m

kubia-jvmt6   1/1     Running   0          59s

kubia-k7kc4   1/1     Running   0          59s

kubia-krbj6   1/1     Running   0          59s

kubia-kw66f   1/1     Running   0          59s

kubia-mktbp   1/1     Running   0          59s

kubia-p5clz   1/1     Running   0          45m

kubia-rjvnm   1/1     Running   0          81m

kubia-rtg4q   1/1     Running   0          11m

kubia-s9n8k   1/1     Running   0          11m

kubia-w9jx6   1/1     Running   0          59s

kubia-zr5s6   1/1     Running   0          59s

3.5.2 缩容

命令行/编辑文件,这里演示命令行

[root@k8s-master-node1 pod-controller]# kubectl scale rc kubia --replicas=3

05-11 20:06