15-k8s控制器资源-deployment/部署控制器

一、deployment部署控制器概念

在学习rc和rs控制器资源时,我们指导,这两个资源都是控制pod的副本数量的,但是,他们两个有个缺点,就是在部署新版本pod或者回滚代码的时候,需要先apply资源清单,然后再删除现有pod,通过资源控制,重新拉取新的pod来实现回滚或者迭代升级;

那么deployment部署控制器资源,就因此而诞生了;

deployments资源,实际上就是用来专门部署业务代码的控制器,专门用于企业业务代码的升级和回滚;

所以,这个资源非常的重要;

deployment部署控制器,实际上控制的是rs副本控制器,如果说rs副本控制器是控制pod的副本数量的,那么deployment就是专门控制rs控制器资源的;

二、deployment资源的清单编写

deployment资源与replicaset资源的清单编写方式没什么区别,只是kind的类型换成deployment就可以了,就实现了资源清单的编辑;

root@k8s231 deployment# cat dm.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: dm01

spec:

#控制pod的副本数量

replicas: 7

#指定标签选择器,基于标签匹配pod

selector:

#声明基于标签匹配pod;

matchLabels:

k8s: xinjizhiwa

#pod的编写,定义pod模板;

template:

metadata:

name: pod01

labels:

k8s: xinjizhiwa

spec:

containers:

  • name: c1

image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v1

ports:

  • containerPort: 80
    root@k8s231 deployment# kubectl apply -f dm.yaml

三、小结

我们先以查看标签的方式,查看一下pod,可以看到下图中,多出来一个自动生成的标签;

root@k8s231 deployment# kubectl get pods --show-labels

deployment:是用来部署服务的一个资源,是常见的,企业中经常用的资源控制器;

功能:

1,管理rs资源,通过rs资源管理pod;

2,它剧本上线部署、副本设置、滚动升级、回滚等功能;

3,它也提供了声明式更新,可以使用apply命令进行更新镜像版本之类的能力'

使用场景:企业部署迭代应用

原理:

通过"标签"管理,实现rs资源的控制,它会在自动创建rs的过程中给rs自动生成一个特有的标签(专属于deployment),当apply更新清单的时候,它会通过标签选定是使用历史的rs还是重新创建rs;

四、deployment实现升级和回滚

1,编辑deployment资源清单(v1版本)

root@k8s231 deployment# cat dm.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: dm01

spec:

#控制pod的副本数量

replicas: 7

#指定标签选择器,基于标签匹配pod

selector:

#声明基于标签匹配pod;

matchLabels:

k8s: xinjizhiwa

#pod的编写,定义pod模板;

template:

metadata:

name: pod01

labels:

k8s: xinjizhiwa

spec:

containers:

  • name: c1

image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v1

ports:

  • containerPort: 80

2,创建deploy资源(V1)

root@k8s231 deployment# kubectl apply -f dm.yaml

3,创建service资源用于访问

· 编辑svc资源清单

root@k8s231 deployment# vim svc.yaml

apiVersion: v1

kind: Service

metadata:

name: svc01

spec:

type: NodePort

selector:

k8s: xinjizhiwa

ClusterIP: 10.200.200.200

ports:

  • port: 99

targetPort: 80

nodePort: 31000

· 创建svc资源

root@k8s231 deployment# kubectl apply -f svc.yaml

· 浏览器访问

4,修改deploy清单中pod镜像版本为V2

root@k8s231 deployment# cat dm.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: dm01

spec:

replicas: 7

selector:

matchLabels:

k8s: xinjizhiwa

template:

metadata:

name: pod01

labels:

k8s: xinjizhiwa

spec:

containers:

  • name: c1

#将镜像版本修改为V2

image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v2

ports:

  • containerPort: 80

5,重新apply一下deploy资源

root@k8s231 deployment# kubectl apply -f dm.yaml

6,浏览器刷新查看是否迭代成功

发现,版本已经更新;

7,小结

deployment,不需要删除原有的pod,只需要apply重新更新一下资源清单,即可实现产品迭代,同比与rc和rs资源,优势明显;

deployment资源,在apply升级后,是又重新创建了rs资源,也就是再升级的过程中,有两个rs资源;

每修改一次镜像,就创建一个rs资源,我们选择使用哪个镜像,就会将这个镜像创建相应的pod副本数,不是用的,就逐渐归零;

五、deployment的升级策略

什么事升级策略?就是升级时过程的控制策略;

1,编辑资源清单

root@k8s231 deployment# cat dm.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: dm01

spec:

#声明设置升级策略

strategy:

#设置升级的策略类型,类型有两种;

#第一种:Recreate:先停止所有pod,再批量创建新的pod;生产环境不建议使用,因为用户在此时会访问不到服务;

#第二种:RollingUpdate:滚动更新,即实现部分更新,逐渐替换掉原有的pod,也就是默认的策略;

type: RollingUpdate

#如果设置了滚动更新RollingUpdate类型,还需要设置更新的策略;

rollingUpdate:

#在原有pod副本数量的基础上,多启动pod的数量(也就是说,更新过程中同时可以存在2+副本数个pod,新旧版本一起)

maxSurge: 2

#在升级的过程中最大不可访问的pod的数量(也就是说,pod副本数-1的数量可以被访问)

maxUnavailable: 1

replicas: 7

selector:

matchLabels:

k8s: xinjizhiwa

template:

metadata:

name: pod01

labels:

k8s: xinjizhiwa

spec:

containers:

  • name: c1

image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v2

ports:

  • containerPort: 80

2,升级创建资源

root@k8s231 deployment# kubectl apply -f dm.yaml

六、蓝绿发布

1,概念

蓝绿发布,就是准备两套代码,不需要停止老版本(不影响上一个版本的用户访问),而是在另一套环境中部署新版本然后进行测试,测试通过后将用户流量切换到新的版本,其特点是业务没有终端,升级风险相对较小;

实现方式:

1,部署当前版本代码

2,部署svc资源

3,部署新版本使用新的deployment名称,新的标签

4,切换svc标签到新的pod中实现业务切换;

2,准备"蓝环境"版本v1

· 编辑deployment资源清单

root@k8s231 deployment# cat dm.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: dm01

spec:

replicas: 7

selector:

matchLabels:

k8s: xinjizhiwa

template:

metadata:

name: pod01

labels:

k8s: xinjizhiwa

spec:

containers:

  • name: c1

image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v1

ports:

  • containerPort: 80

· 编辑svc资源

root@k8s231 deployment# cat svc.yaml

apiVersion: v1

kind: Service

metadata:

name: svc01

spec:

type: NodePort

selector:

k8s: xinjizhiwa

clusterIP: 10.200.200.200

ports:

  • port: 99

targetPort: 80

nodePort: 31000

· 创建svc与deployment资源(蓝环境的)

root@k8s231 deployment# kubectl apply -f dm.yaml
root@k8s231 deployment# kubectl apply -f svc.yaml

· 浏览器访问

蓝环境v1准备完毕

3,准备"绿环境"v2

· 编辑deployment资源清单

root@k8s231 deployment# vim dm-green.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: dm02

spec:

replicas: 7

selector:

matchLabels:

k8s: k8s

template:

metadata:

name: pod01

labels:

k8s: k8s

spec:

containers:

  • name: c1

image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v2

ports:

  • containerPort: 80

· 创建deployment资源(绿环境的)

root@k8s231 deployment# kubectl apply -f dm-green.yaml

4,切换svc资源的标签,让其指向新版本

· 修改svc资源清单

root@k8s231 deployment# cat svc.yaml

apiVersion: v1

kind: Service

metadata:

name: svc01

spec:

type: NodePort

selector:

#修改标签,指向新的pod标签

k8s: k8s

clusterIP: 10.200.200.200

ports:

  • port: 99

targetPort: 80

nodePort: 31000

· 重新apply资源清单(svc)

root@k8s231 deployment# kubectl apply -f svc.yaml

5,浏览器访问测试

可见,切换新版本成功;

七、灰度发布(金丝雀发布)

实现的机制:

1,部署老版本,使用多副本(模拟正式环境)

2,部署svc,匹配标签

3,部署新版本,标签与老版本标签一致(让svc能够访问到,副本从0开始)

4,灰度版本测试没有问题,将恢复版本的副本数量,逐渐调高增加为生产数量;

5,将旧版本逐渐调低至0,此时流量全部跑到了新版本上;

1,部署老版本

root@k8s231 deployment# vim dm.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: dm01

spec:

replicas: 7

selector:

matchLabels:

k8s: k8s

template:

metadata:

name: pod01

labels:

k8s: xinjizhiwa

spec:

containers:

  • name: c1

image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v1

ports:

  • containerPort: 80
    root@k8s231 deployment# kubectl apply -f dm.yaml

2,部署新版本

root@k8s231 deployment# cat dm-green.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: dm02

spec:

#副本设置为0;

replicas: 0

selector:

matchLabels:

k8s: k8s

template:

metadata:

name: pod01

labels:

k8s: k8s

spec:

containers:

  • name: c1

image: harbor.xinjizhiwa.com/xinjizhiwa-nginx/nginx:v2

ports:

  • containerPort: 80
    root@k8s231 deployment# kubectl apply -f dm-green.yaml

3,部署svc

root@k8s231 deployment# cat svc.yaml

apiVersion: v1

kind: Service

metadata:

name: svc01

spec:

type: NodePort

selector:

k8s: k8s

clusterIP: 10.200.200.200

ports:

  • port: 99

targetPort: 80

nodePort: 31000
root@k8s231 deployment# kubectl apply -f svc.yaml

4,将新版本的副本逐渐调高

5,将旧版本的副本逐渐调低

至此,灰度发布,学习完毕;

灰度发布就是让新旧版本,一起上线,旧版本和新版本让用户随机访问到,然后没有业务问题之后,逐渐调高新版本副本数量,逐渐调低旧版本副本数量,从而达到灰度发布;

#########################################

至此,deployment部署控制器学习完毕;

#########################################

接下来,我们需要拿一个案例,来整体回顾一下,我们学过的知识;

#########################################

接下来,就是k8s的进阶学习了,你准备好了吗?

相关推荐
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun3 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)3 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang3 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿3 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl3 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、3 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove3 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21