在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