一、Pod控制器简介
在kubernetes中,按照pod的创建方式可以将其分为两类:
自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建
控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建
1.Pod控制器
Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。
2.Pod控制器类型
控制器类型 | 作用 |
---|---|
ReplicaSet | 保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级 |
Deployment | 通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本 |
Horizontal Pod Autoscaler | 可以根据集群负载自动水平调整Pod的数量,实现削峰填谷 |
DaemonSet | 在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务 |
Job | 它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务 |
Cronjob | 它创建的Pod负责周期性任务控制,不需要持续后台运行 |
StatefulSet | 管理有状态应用 |
二、ReplicaSet(RS)
ReplicaSet的主要作用是保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。
[root@t3-tkhijbs-jcsszy-app09 yaml]# cat nginx-pod.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: pc-replicaset
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx
在这里面,需要新了解的配置项就是spec
下面几个选项:
(1)replicas:指定副本数量,其实就是当前rs创建出来的pod的数量,默认为1
(2)selector:选择器,它的作用是建立pod控制器和pod之间的关联关系,采用的Label Selector机制在pod模板上定义label,在控制器上定义选择器(selector),就可以表明当前控制器能管理哪些pod了
(3)template:模板,就是当前控制器创建pod所使用的模板,里面其实就是前边讲解过的pod的定义
1.扩 缩pod数量
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl get ReplicaSet -n dev
NAME DESIRED CURRENT READY AGE
pc-replicaset 3 3 3 27m
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl edit rs pc-replicaset -n dev
#编辑rs的副本数量,修改spec:replicas: 5即可 .这个数量就是根据你的要求来修改
2.镜像升降级
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl edit rs pc-replicaset -n dev
#直接修改镜像版本即可
3.删除RS
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl delete rs pc-replicaset -n dev
或者
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl delete -f nginx-pod.yaml
三、deployment(deploy)
为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来简介管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加强大。
支持ReplicaSet的所有功能
支持发布的停止、继续
支持滚动升级和回滚版本
[root@t3-tkhijbs-jcsszy-app09 yaml]# cat nginx-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl apply -f nginx-pod.yaml
deployment.apps/pc-deployment created
1.Pod容器扩缩容
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-7d4f548fb9-mlksf 1/1 Running 0 94s
pc-deployment-7d4f548fb9-w5p2l 1/1 Running 0 94s
pc-deployment-7d4f548fb9-xlvvv 1/1 Running 0 94s
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl edit deploy pc-deployment -n dev
#修改这里的数字就好了
replicas: 5
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-7d4f548fb9-5z7n8 1/1 Running 0 27s
pc-deployment-7d4f548fb9-gfg7p 1/1 Running 0 27s
pc-deployment-7d4f548fb9-mlksf 1/1 Running 0 3m43s
pc-deployment-7d4f548fb9-w5p2l 1/1 Running 0 3m43s
pc-deployment-7d4f548fb9-xlvvv 1/1 Running 0 3m43s
2.版本回退
2.1 --record
此参数会记录更新的过程
[root@t3-tkhijbs-jcsszy-app09 yaml]# cat nginx-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl apply -f nginx-pod.yaml --record
deployment.apps/pc-deployment created
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-858db84f89 3 3 3 9s
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl get pod -n dev -w
NAME READY STATUS RESTARTS AGE
pc-deployment-858db84f89-8r5kg 1/1 Running 0 20s
pc-deployment-858db84f89-lc7wb 1/1 Running 0 20s
pc-deployment-858db84f89-s4f8f 1/1 Running 0 20s
开始更新镜像
kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev
更新完毕之后发现,产生了一个新的rs控制器pc-deployment-6c78d7875b
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-6c78d7875b 3 3 3 85s
pc-deployment-858db84f89 0 0 0 4m14s
新的pod也是基于pc-deployment-6c78d7875b产生的
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-6c78d7875b-9j27t 1/1 Running 0 3m1s
pc-deployment-6c78d7875b-c4wfl 1/1 Running 0 3m
pc-deployment-6c78d7875b-k5jsc 1/1 Running 0 2m57s
2.2 rollout
kubectl rollout: 版本升级相关功能,支持下面的选项:
status 显示当前升级状态
history 显示 升级历史记录
pause 暂停版本升级过程
resume 继续已经暂停的版本升级过程
restart 重启版本升级过程
undo 回滚到上一级版本(可以使用–to-revision回滚到指定版本)
实例:
[root@t3-tkhijbs-jcsszy-app09 yaml]# cat nginx-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl apply -f nginx-pod.yaml --record
deployment.apps/pc-deployment created
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-858db84f89 3 3 3 23s
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-858db84f89-khkml 1/1 Running 0 29s
pc-deployment-858db84f89-swkkv 1/1 Running 0 29s
pc-deployment-858db84f89-tnn8z 1/1 Running 0 29s
更改镜像版本
[root@t3-tkhijbs-jcsszy-app09 yaml]# vim nginx-pod.yaml
image: nginx:1.17.2
更新配置
[root@t3-tkhijbs-jcsszy-app09 yaml]# kubectl apply -f nginx-pod.yaml --record
deployment.apps/pc-deployment configured
查看更新历史记录
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl rollout history deploy pc-deployment -n dev
deployment.apps/pc-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=nginx-pod.yaml --record=true
2 kubectl apply --filename=nginx-pod.yaml --record=true
rs控制器也更新了
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-6c78d7875b 3 3 3 19m
pc-deployment-858db84f89 0 0 0 33m
开始回滚到上一个版本
这里直接使用–to-revision=1回滚到了1版本, 如果省略这个选项,就是回退到上个版本
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev
deployment.apps/pc-deployment rolled back
[root@t3-tkhijbs-jcsszy-app09 ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
pc-deployment-6c78d7875b 0 0 0 21m
pc-deployment-858db84f89 3 3 3 34m