目录
工作负载控制器是什么
工作负载控制器(Workload Controllers)是k8s的一个抽象概念,用于更高层次对象,部署和管理pod
常用工作负载控制器:
- Deployment:无状态应用部署
- StatefulSet:有状态应用部署
- DaemonSet:确保所有Node运行同一个Pod
- Job:一次性任务
- Cronjob:定时任务
控制器的作用:
- 管理Pod对象
- 使用标签与Pod关联
- 控制器实现了Pod 的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等
直接去创建pod有很多功能使用不了的,都是需要控制器去来管理,所以实际生产环境Pod用作测试比较多
Deployment
Deployment可以管理Pod和ReplicaSet,具有上线部署、副本设定、滚动升级、回滚等功能,他的应用场景主要在网站、API、微服务等
Deployment使用流程如下
第一步:部署镜像
部署使用的镜像,镜像来源与两个位置(docker hub、私有仓库)
在这里只是简单的测试一下Deployment的使用流程,以nginx版本为例去进行测试,生产环境中的部署方式类似
# 部署nginx镜像,尽量使用yaml去部署,yaml可以通过kubectl create命令去生成后修改,也可以自己去手写
# 生成一个deployment的yaml,然后去部署nginx
[root@k8s-master ~]# kubectl create deployment web --image=nginx --dry-run=client -o yaml > deployment.yaml
kubectl apply -f deployment.yaml
# 生成一个service的yaml
[root@k8s-master ~]# kubectl expose deployment web --port=80 --target-port=80 --type=NodePort --dry-run=client -o yaml > services.yaml
[root@k8s-master ~]# kubectl apply -f services.yaml
访问下这个nginx页面,看到版本号为1.21.6,那么我们来坐下滚动升级
第二步:滚动升级
滚动发布是指每次只升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程,直到集群中的全部旧版本升级新版本
应用的升级有三种方式
- 修改yaml,然后kubectl apply -f进行升级
- 使用命令去升级,kubectl set image deployment/web nginx=nginx:1.18
- 使用系统编辑器打开,kubectl edit deployment/web
第一种方式,修改yaml文件进行升级
>再去访问nginx页面,nginx版本号变更
第二种方式,使用命令升级
第三种方式,使用系统的编辑器打开修改
改完即生效,我将其中的image改为了nginx:1.20
深入理解下k8s是如何实现滚动升级的
master另开两个终端持续查看在滚动更新时情况
先将副本数改为3,然后重新更新一下
# 一台机器查看nginx请求头信息,这样子可以看到nginx版本号为多少
[root@k8s-master ~]# for i in {1..1000};do curl -I 10.96.93.68 ;sleep 1;don
# 一台机器查看副本数状态
[root@k8s-master ~]# kubectl get replicaset -w
开始更新版本
[root@k8s-master ~]# kubectl set image deployment web nginx=nginx:1.15
更新好后他会一个一个去替换掉
还可以拿这条命令去查看升级情况
滚动更新策略
maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数量比期望(replicas)Pod数量最大多出25%
maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时最大25%Pod数量不可用,即确保75%Pod数量是可用状态
其实默认就是25%的
# 案例
spec:
replicas: 3
revisionHistoryLimit: 10 # RS历史版本保存数量
selector:
matchLabels:
app: web
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
第三步:水平扩容
他是通过replicas参数来控制Pod数量的(也是由ReplicaSet来控制的),有两种方法
- 修改yaml里的replicas值,在apply
- 使用命令,kubectl scale deployment web --replicas=10
第四步:回滚
发布的版本不合适需要退回到上个版本或者指定版本,可以使用以下命令来实现
- kubectl rollout history deployment web # 查看历史发布版本,web是项目所在deployment的名称,我这里的名称就为web
- kubectl rollout undo deployment web # 回滚到上一个版本
- kubectl rollout undo deployment web --to-revison=2 # 回滚历史指定版本
可以使用以下命令来查看历史版本和镜像版本的对应关系,不过信息太多需要使用正则语句去匹配出来
- kubectl describe rs | grep -C 9 revision #找到关键字revision后向下查询9行
第五步:应用下线
删除即可
- kubectl delete deploy web
- kubectl delete svc web
ReplicaSet控制器
ReplicaSet:副本集,主要维护Pod副本数量,不断对比当前Pod数量与期望Pod数量
ReplicaSet用途:Deployment每次发布都会创建一个RS作为记录,用于实现滚动升级和回滚
- kubectl get rs # 查看RS记录
- kubectl rollout history deployment web # 版本对应RS记录
DaemonSet
DaemonSet应用场景:网络插件(kube-proxy、calico)、其他Agent
DaemonSet功能:
- 在每一个Node上运行一个Pod
- 新加入的Node也同样会自动运行一个Pod
DaemonSet和deployment的使用方式类似,只是不支持副本集,因为默认每个节点都有一个
Job
Job分为普通任务(Job)和定时任务(CronJob)
- 一次性执行
应用场景:离线数据处理,视频解码等业务
# 案例
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restarPollicy: Never
CronJob
CronJob用于实现定时任务,像Linux的Crontab一样
- 定时任务
应用场景:通知,备份
# 案例
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *" # 每分钟运行一次
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello hahaha
restartPolicy: OnFailure