k8s工作负载控制器之deployment介绍与使用
工作负载控制器工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。常用工作负载控制器有:• Deployment : 无状态应用部署• StatefulSet : 有状态应用部署• DaemonSet : 确保所有Node运行同一个Pod• Job : 一次性任务 • Cronjob : 定时任务控制器的作用:1、管理pod对象2
·
目录
工作负载控制器
工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
常用工作负载控制器有:
• Deployment : 无状态应用部署
• StatefulSet : 有状态应用部署
• DaemonSet : 确保所有Node运行同一个Pod
• Job : 一次性任务 • Cronjob : 定时任务
控制器的作用:
1、管理pod对象
2、使用标签与pod绑定
•3、控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等。
Deployment
deployment是最常用的控制器
Deployment的功能: • 管理Pod和ReplicaSet
• 具有上线部署、副本设定、滚动升级、回滚等功能
应用场景:网站、API、微服务
先来理解一个项目的生命周期
deployment生命周期演示
1、部署镜像
kubectl apply -f xxx.yaml
或者
kubectl create deployment web --image=nginx:1.15 --replicas=3
示例
apiVersion: apps/v1kind: Deploymentmetadata:creationTimestamp: nulllabels:app: nginxname: nginxspec:replicas: 3selector:matchLabels:app: nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginx:1.16name: nginxresources: {}livenessProbe:httpGet:path: /port: 80initialDelaySeconds: 3 #启动容器后多少秒健康检查periodSeconds: 10 #以后每间隔多少秒检查一次readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 3periodSeconds: 10
导出service的yaml
kubectl expose deployment nginx --port=80 --target-port=8080 --type=NodePort --dry-run=client -o yaml > service.yaml
修改内容
apiVersion: v1kind: Servicemetadata:creationTimestamp: nulllabels:app: nginxname: nginxspec:ports:- port: 80protocol: TCPtargetPort: 80selector:app: nginxtype: NodePort
执行yaml查看
kubectl get svc,pods
2、应用升级
deployment升级一般默认是滚动升级,即当deployment执行升级的时候,他会先起一个新的容器,再删掉旧容器
一般执行镜像更新有三种方式
• kubectl apply -f xxx.yaml(最常用的方式)
• kubectl set image deployment/web nginx=nginx:1.17
• kubectl edit deployment/web #使用系统编辑器打开
2.1 采用第一种方式升级
vi deployment.yaml
将镜像版本由1.6换成1.7
apiVersion: apps/v1kind: Deploymentmetadata:creationTimestamp: nulllabels:app: nginxname: nginxspec:replicas: 3selector:matchLabels:app: nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginx:1.17name: nginxresources: {}livenessProbe:httpGet:path: /port: 80initialDelaySeconds: 3 #启动容器后多少秒健康检查periodSeconds: 10 #以后每间隔多少秒检查一次readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 3periodSeconds: 10
执行yaml
kubectl apply -f deployment.yaml
可以看到,他的升级是滚动的,先启动一个新的容器在杀掉一个旧容器,直到全部升级完成
2.2,采用第二种方式去更新
kubectl set image deployment/web 容器名=nginx:1.17
示例
kubectl set image deployment nginx nginx=nginx:1.18
2.3,采用第三种方式升级
kubectl edit deployment nginx
他会直接进入系统编辑页面,可以直接修改
3、滚动升级的实现(ReplicaSet)
3.1 ReplicaSet控制器
初次部署,副本数其实是由replicaSet管理的,replicaSet是副本集,主要用来维护pod数量
ReplicaSet:副本集,主要维护Pod副本数量,不断对比当前Pod数量 与期望Pod数量。
ReplicaSet用途:Deployment每次发布都会创建一个RS作为记录, 用于实现滚动升级和回滚。
例如,在用户对一个副本数为3的nginx1.6升级为nginx1.7时,replicaSet的变化是
第一步:创建RS(nginx-68dcf59cf5)并副本数设置为1(扩容)(1.17镜像起一个pod)第二步:将RS(nginx-686db6866d)副本数设置为2(缩容)第三步:将RS(nginx-68dcf59cf5)副本数设置为2(扩容)第四步:将RS(nginx-686db6866d)副本数设置为1(缩容)第五步:将RS(nginx-68dcf59cf5)副本数设置为3(扩容)第六步:将RS(nginx-686db6866d)副本数设置为0(缩容)
kubectl get replicaset
3.2 滚动升级的策略
spec:replicas: 3revisionHistoryLimit: 10 # RS历史版本保存数量selector:matchLabels:app: webstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdate
• maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数 量比期望(replicas)Pod数量最大多出25%
• maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时 最大25% Pod数量不可用,即确保75% Pod数量是可用状态。
4、deployment应用实例扩容与缩容
在实际使用场景中,当有需求是启动多实例提高并发的时候,有两个方案实现
1、 修改yaml里replicas值,再apply
2、 kubectl scale deployment web --replicas=10
注:replicas参数控制Pod副本数量
示例
kubectl scale deployment nginx --replicas=10
kubectl get pods
可以看到,pod数量变成了十个
kubectl get ep
5、deployment应用回滚
5.1当我们在更新中发现更新有问题,需要回滚在上一个版本的时候,可能就需要应用回滚这个功能,回滚一般包括
kubectl rollout history deployment/web # 查看历史发布版本kubectl rollout undo deployment/web # 回滚上一个版本kubectl rollout undo deployment/web --to-revision=2 # 回滚历史指定版本
注:回滚是重新部署某一次部署时的状态,即当时版本所有配置
5.2示例
第一步,查看名为nginx的deployment过去所有版本
kubectl rollout history deployment nginx
第二步,回滚到上一个版本
kubectl rollout undo deployment nginx
在查看历史版本
kubectl rollout history deployment nginx
发现3不见了,变成了5,即现在回滚成功,该deployment回滚到第3个版本
另外,还有回滚到指定版本需求
kubectl rollout undo deployment/web --to-revision=2 # 回滚历史指定版本
5.3,另外。如果想知道历史版本镜像,可以通过这个命令
kubectl describe rs |egrep "revision:|Name:|Image:"
如例
它包括deployment版本和name以及镜像版本,以此作参考回滚到某个位置
6、项目下线
项目下线,即删除对应deployment与service资源
kubectl delete deploy/web
kubectl delete svc/web
6.1、示例
kubectl delete deployment nginx
kubectl delete svc nginx
更多推荐
已为社区贡献13条内容
所有评论(0)