kubernetes部署控制器Deployment

news2025/1/16 15:03:46

一、概念

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

        Depolyment控制器将Pod部署成无状态的应用,它只关心Pod的数量、更新方式、使用的镜像和资源限制等。由于是无状态的管理方式,因此Deployment控制器中没有“角色”和“顺序”的概念。即在Deployment控制器中没有状态。 

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

                                Deployment控制器、ReplicaSet和Pod之间关系图

  • 创建Depolyment的过程
    • 用户在创建Deployment时,Kubernetes会自动创建一个ReplicaSet。ReolicaSet在后台根据指定的副本数创建Pod,并检查Pod的状态,以确定Pod是启动成功还是失败
  • 更新Deployment的过程
    • 当用户更新Deployment时,Kubernetes会创建一个新的ReplicaSet。Deployment会将Pod从旧的ReplicaSet中迁移到新的ReplicaSet中
      • 如果迁移失败或Pod不稳定,则Deployment会自动回滚到上一个版本
      • 如果迁移成功,则Deployment将清除旧的,不必要的ReplicaSet.

二、Deployment的创建和使用

2.1 编辑资源清单dm.yaml

[root@master deployment-demo]# cat dm.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01
spec:
  #控制pod的副本数量
  replicas: 7
  #指定标签选择器,基于标签匹配pod
  selector:
    #声明基于标签匹配pod;
    matchLabels:
      k8s: dolphin
  #pod的编写,定义pod模板;
  template:
    metadata:
      name: pod01
      labels:
        k8s: dolphin
    spec:
      containers:
      - name: c1
        image: dolphinc/nginx:v1
        ports:
        - containerPort: 80
 

2.2 创建资源

[root@master deployment-demo]# kubectl apply -f dm.yaml

查看资源,可以看到多出来一个自动生成的标签

原理:

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

三、Deployment实现升级和回滚

基于上面创建的资源清单继续操作

3.1 创建service资源

 [root@master deployment-demo]# cat svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: svc-dm
spec:
  type: NodePort
  selector:
    k8s: dolphin
  ports:
  - port: 99
    targetPort: 80
    nodePort: 31000
 

3.2 创建资源

[root@master deployment-demo]# kubectl apply -f svc.yaml 

3.3 查看资源

资源绑定成功

3.4 浏览器访问资源

 

3.5 修改镜像,并更新资源

[root@master deployment-demo]# cat dm.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01
spec:
  #控制pod的副本数量
  replicas: 7
  #指定标签选择器,基于标签匹配pod
  selector:
    #声明基于标签匹配pod;
    matchLabels:
      k8s: dolphin
  #pod的编写,定义pod模板;
  template:
    metadata:
      name: pod01
      labels:
        k8s: dolphin
    spec:
      containers:
      - name: c1
        image: dolphinc/nginx:v2
        ports:
        - containerPort: 80
 
[root@master deployment-demo]# kubectl apply -f dm.yaml 
deployment.apps/dm01 configured
 

3.6 再次查看资源(升级成功)

        我们可以看到再次执行apply命令,会创建新的rs资源进行,并创建新的pod临时标签

 访问资源页面,资源版本更新了

 上面的升级操作我们也可以通过一下命令来操作

kubectl --record deployment.app/dm01 set image deployment.apps/dm01 dolphinc/nginx:v2

###

--record 是为了能够追溯修改的历史记录

3.7 追溯修改的历史

[root@master deployment-demo]# kubectl rollout history deployment dm01
deployment.apps/dm01 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
 

3.8 回滚到之前的版本

上边的1就是之前的版本

[root@master deployment-demo]# kubectl rollout undo deployment dm01 --to-revision=1
deployment.apps/dm01 rolled back

查看页面,回滚成功

查看资源,我们可以看到回滚到之前版本,临时标签是不变的

 四、Deployment的升级策略

4.1 Recreate

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

使用案例

[root@master deployment-demo]# cat dm.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01
spec:
  strategy: 
    type: Recreate

  #控制pod的副本数量
  replicas: 7
  #指定标签选择器,基于标签匹配pod
  selector:
    #声明基于标签匹配pod;
    matchLabels:
      k8s: dolphin
  #pod的编写,定义pod模板;
  template:
    metadata:
      name: pod01
      labels:
        k8s: dolphin
    spec:
      containers:
      - name: c1
        image: dolphinc/nginx:v2
        ports:
        - containerPort: 80

4.2 RollingUpdate

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

[root@master deployment-demo]# cat dm.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01
spec:
  strategy: 
    type: RollingUpdate
    #如果设置了滚动更新RollingUpdate类型,还需要设置更新的策略;
    rollingUpdate:
      #在原有Pod副本数量的基础上,多启动Pod的数量(也就是说,更新过程中可以存在2+副本个数的Pod,新旧版本一起)
      maxSurge: 2
      # 在升级过程中最大不可能访问pod的数量(也就是说,Pod副本数-1数量可以备注访问)
      maxUnavailable: 1
  #控制pod的副本数量
  replicas: 7
  #指定标签选择器,基于标签匹配pod
  selector:
    #声明基于标签匹配pod;
    matchLabels:
      k8s: dolphin
  #pod的编写,定义pod模板;
  template:
    metadata:
      name: pod01
      labels:
        k8s: dolphin
    spec:
      containers:
      - name: c1
        image: dolphinc/nginx:v1
        ports:
        - containerPort: 80
 

创建资源,下边截了三个状态的截图,刚更新资源,更新资源中,更新资源后

开始更新以及更新中,我们Running中的有6个( replicas: 7,也就是上边配置的maxUnavailable:1)符合配置要求

更新中我们有1个关闭中的,6个running+3个ContainerCreating(共9个,maxSurge: 2)说明我们更新过程中多启动了2个

更新结束最红我们是7个正在Running的pod资源

清空资源

[root@master deployment-demo]# kubectl delete deployment --all
deployment.apps "dm01" deleted
[root@master deployment-demo]# kubectl delete svc --all
service "kubernetes" deleted
service "svc-dm" deleted
 

 五、常用的应用部署策略

5.1  金丝雀部署

        金丝雀部署也叫灰度部署。是先让一部分用户继续使用旧版,而另一部分用户开始使用新版本;如果新版本没有发生意外,则逐步扩大新版本的使用范围,直到使用旧版本的用户都是用新版本。

5.1.1 svc.yaml

编辑创建service资源

[root@master deployment-demo]# cat svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: svc-dm
spec:
  type: NodePort
  selector:
    k8s: dolphin
  ports:
  - port: 99
    targetPort: 80
    nodePort: 31000
[root@master deployment-demo]# kubectl apply -f svc.yaml 
 

5.1.2 dm-old.yaml  (5个副本为例)

编辑创建旧版本deployment资源

[root@master deployment-demo]# cat dm-old.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01-v1
spec:
  #控制pod的副本数量
  replicas: 5
  #指定标签选择器,基于标签匹配pod
  selector:
    #声明基于标签匹配pod;
    matchLabels:
      k8s: dolphin
      version: v1.0
  #pod的编写,定义pod模板;
  template:
    metadata:
      name: pod01
      labels:
        k8s: dolphin
        version: v1.0
    spec:
      containers:
      - name: c1
        image: dolphinc/nginx:v1
        ports:
        - containerPort: 80
 
[root@master deployment-demo]# kubectl apply -f dm-old.yaml 
deployment.apps/dm01-v1 created
 

5.1.3 dm-new.yaml(1个副本为例)

编辑创建新版本deployment资源

[root@master deployment-demo]# cat dm-new.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01-v2
spec:
  #控制pod的副本数量
  replicas: 1
  #指定标签选择器,基于标签匹配pod
  selector:
    #声明基于标签匹配pod;
    matchLabels:
      k8s: dolphin
      version: v2.0
  #pod的编写,定义pod模板;
  template:
    metadata:
      name: pod01
      labels:
        k8s: dolphin
        version: v2.0
    spec:
      containers:
      - name: c1
        image: dolphinc/nginx:v1
        ports:
        - containerPort: 80
 [root@master deployment-demo]# kubectl apply -f dm-new.yaml 
deployment.apps/dm01-v2 created

 查看结果

 [root@master deployment-demo]# for a in {1..100}; do sleep 1; curl "10.15.233.42:99"; done

上边部署了6个实例,5个版本1的,1个版本2的,我们通过服务循环访问,可以看到我们大概1/5概率会访问到服务2

5.1.4 将版本1缩容到2个,版本2扩容到3个

[root@master deployment-demo]# kubectl scale --replicas=2 deploy dm01-v1
deployment.apps/dm01-v1 scaled
[root@master deployment-demo]# kubectl scale --replicas=3 deploy dm01-v2
deployment.apps/dm01-v2 scaled

再次循环访问,访问版本服务的比例变了

5.1.5 停掉版本1,把版本2扩容到我们需的实例数

5.1.6 部署完成

至此,金丝雀部署完成。

总结:

我们用2个部署控制器部署项目,都交由同一个svc来对外提供服务,两个版本都注册到同一个endpoints上,来控制不同版本的数量,最终替换掉所有的旧版本。

清空资源:

5.2  蓝绿部署

蓝绿部署可以在线进行,具有较小风险,但是会对用户的体验有影响。另外,蓝绿部署由于同时部署了新旧两套版本,所以需要双倍的资源

5.2.1 svc.yaml(服务标签选择指定版本)

[root@master deployment-demo]# cat svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: svc-dm
spec:
  type: NodePort
  selector:
    k8s: dolphin
    version: v1.0
  ports:
  - port: 99
    targetPort: 80
    nodePort: 31000
[root@master deployment-demo]# kubectl apply -f svc.yaml 
service/svc-dm created

5.2.2 dm-old.yaml

同5.1.2一样

[root@master deployment-demo]# cat dm-old.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01-v1
spec:
  #控制pod的副本数量
  replicas: 5
  #指定标签选择器,基于标签匹配pod
  selector:
    #声明基于标签匹配pod;
    matchLabels:
      k8s: dolphin
      version: v1.0
  #pod的编写,定义pod模板;
  template:
    metadata:
      name: pod01
      labels:
        k8s: dolphin
        version: v1.0
    spec:
      containers:
      - name: c1
        image: dolphinc/nginx:v1
        ports:
        - containerPort: 80
 
 

5.2.3 dm-new.yaml

同5.1.3一样

[root@master deployment-demo]# cat dm-new.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01-v2
spec:
  #控制pod的副本数量
  replicas: 5
  #指定标签选择器,基于标签匹配pod
  selector:
    #声明基于标签匹配pod;
    matchLabels:
      k8s: dolphin
      version: v2.0
  #pod的编写,定义pod模板;
  template:
    metadata:
      name: pod01
      labels:
        k8s: dolphin
        version: v2.0
    spec:
      containers:
      - name: c1
        image: dolphinc/nginx:v2
        ports:
        - containerPort: 80
[root@master deployment-demo]# kubectl apply -f dm-old.yaml 
deployment.apps/dm01-v1 created
[root@master deployment-demo]# kubectl apply -f dm-new.yaml 
deployment.apps/dm01-v2 created
 

5.1.4 查看访问资源

因为我们service资源绑定的是version:v1.0这个资源,所以我们目前访问的都是版本1

5.1.5 切换Service服务到新版本 

[root@master deployment-demo]# kubectl patch service/svc-dm -p '{"spec":{"selector":{"version":"v2.0"}}}'
 

再次请求服务,看到切换成功

5.1.6 删除旧版本,部署完成

[root@master deployment-demo]# kubectl delete deployment.apps/dm01-v1
deployment.apps "dm01-v1" deleted
 

5.3  滚动部署

我们平常修改yaml文件,再次应用的部署就是滚动部署,相对蓝绿部署更加节约资源。

5.5 总结

用户访问版本时效切换版本修改对象对用户影响风险
金丝雀部署用户同时能访问两个版本,根据新旧版本都实例个数随机访问切换过程中两个版本会存在较长时间deployment极小

因为部署过程中两个都存在,万一新版本有问题,用户能明显感知到

蓝绿部署用户只能访问其中一个版本,因为两个版本都是稳定后才会切换,所以两个版本存在时间较长service有一定影响

因为切换版本我们一般是稳定测试过后切换,所以风险低

滚动部署用户可能会访问到2个版本,但版本替换过程快替换新版本,旧版本会马上被移出deoloyment极小

因为在执行应用新资源命令时,应用是逐步被替换,一般很快,所以万一新版本有问题,那么用户能立刻感知到

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1617822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

赛氪网参与第61届中国高等教育博览会,助力产教融合与科教融汇

为深入贯彻党的二十大精神&#xff0c;落实立德树人根本任务&#xff0c;推动高等教育装备现代化&#xff0c;第61届中国高等教育博览会&#xff08;以下简称“高博会”&#xff09;于近日在福建省福州市隆重开幕。作为高等教育领域内的综合性品牌博览会&#xff0c;此次高博会…

达梦(DM)数据库表索引

达梦DM数据库表索引 表索引索引准则其他准则 创建索引显式地创建索引其他创建索引语句 使用索引重建索引删除索引 表索引 达梦数据库表索引相关内容比较多&#xff0c;常用的可能也就固定的一些&#xff0c;这里主要说一下常用的索引&#xff0c;从物理存储角度进行分类&#…

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡 配置ssh远程连接docker1.端口映射2.配置ssh 在docker中使用nvidia显卡配置CUDA 注意&#xff1a;之前已经创建过容器的&#xff0c;需要打包成镜像&#xff0c;重新创建容器&#xff0c;因为要在创建…

# IDEA2019 如何打开 Run Dashboard 运行仪表面板

IDEA2019 如何打开 Run Dashboard 运行仪表面板 段子手168 1、依次点击 IDEA 上面工具栏 —> 【View】 视图。 —> 【Tool Windows】 工具。 —> 【Run Dashboard】 运行仪表面板。 2、如果 【Tool Windows 】工具包 没有 【Run Dashboard】 运行仪表面板 项 依次…

uniapp制作多选下拉框和富文本(短信页面)

实例 多选下拉框实现 http://t.csdnimg.cn/TNmcF 富文本实现 http://t.csdnimg.cn/Ei1iV

网络带宽相关

1.tcp重传率计算 watch -n 5 “cat /proc/net/snmp” 如下博客所讲 https://blog.csdn.net/michaelwoshi/article/details/121189743 2.iperf测试网络带宽 #客户端 #tcp iperf -c 服务端ip -P 4 -b 200M #udp iperf -c 服务端ip -u -P 4 -b 1000M -l 10K #服务端 iperf -s

OPTEE的GDB调试技术实战

【按语】&#xff1a;如果需要调试OPTEE&#xff0c;那么在远程调试配置中使用GDB可能会很有用。远程调试意味着GDB在您的PC上运行&#xff0c;它可以访问源代码&#xff0c;而被调试的程序在远程系统上运行(在本例中&#xff0c;在QEMU环境的OPTEE中)。本博客来探讨OPTEE的GDB…

React基础知识大汇总

函数组件和类组件 函数组件与类组件有什么区别呢&#xff1f; function getName(params:{name:string}){const count 0;return params.name -count; } getName({name:"test"}) getName({name:"哈哈哈"})getName是一个纯函数&#xff0c;不产生任何副作用…

算法竞赛相关问题总结记录

前言 日常在校生或者是工作之余的同学或多或少都会参加一些竞赛,参加竞赛一方面可以锻炼自己的理解与实践能力&#xff0c;也能够增加自己的生活费&#xff0c;竞赛中的一些方案也可以后续作为自己论文的base,甚至是横向课题的框架。在算法竞赛中算法的差别个人感觉差距都不大&…

区块链钱包开发指南: 探究区块链钱包开发涉及

区块链钱包是连接用户与区块链网络的重要工具&#xff0c;它们不仅提供了安全的存储和管理数字资产的功能&#xff0c;还允许用户进行交易和与区块链上的智能合约进行互动。本文将探究区块链钱包开发涉及的关键方面和技术要点。 1. 区块链钱包类型 区块链钱包可以分为以下几种…

Android Studio查看viewtree

前言&#xff1a;之前开发过程一直看的是手机上开发者选项中的显示布局边界&#xff0c;开关状态需要手动来回切换&#xff0c;今天偶然在Android Studio中弄出了布局树觉得挺方便的。

汽车纵染压制专用液压机比例阀放大器

汽车纵染压制专用液压机比例阀放大器是一种专门用于汽车纵梁拉伸工艺的设备&#xff0c;它也可以用于其他金属薄板的压制成型及校正工艺。该类型的液压机通常具备独立的动力机构和电气系统&#xff0c;采用PLC技术进行控制&#xff0c;以确保操作的准确性和稳定性。除了纵梁拉伸…

文心一言 VS 讯飞星火 VS chatgpt (243)-- 算法导论18.1 1题

一、B树中为什么不允许最小度数 t1&#xff1f;如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在B树中不允许最小度数 t1 的主要原因在于这样会导致树的结构退化为链表&#xff0c;失去了B树作为平衡多路搜索树的优势。当 t1 时&#xff0c;每个非根节点将只能…

openGauss学习笔记-269 openGauss性能调优-TPCC性能调优测试指导-数据库服务端及客户端绑核

文章目录 openGauss学习笔记-269 openGauss性能调优-TPCC性能调优测试指导-数据库服务端及客户端绑核269.1 安装openGauss数据库269.2 停止数据库269.3 使用gs_guc工具修改数据库端口、IP等269.4 使用gs_guc工具设置如下参数269.5 执行如下命令以绑核方式启动服务端数据库269.6…

在线教程丨刘强东数字人首秀交易额破5千万!用GeneFace++ 生成实时说话数字人

近日&#xff0c;京东创始人刘强东化身「采销东哥 AI 数字人」&#xff0c;在京东家电家居和超市的采销直播间开启了自己的直播首秀。此次直播活动观看人次超 2 千万&#xff0c;交易总额超 5 千万&#xff0c;充分彰显了AI 数字人在电商直播领域的巨大潜力。 「采销东哥」亮相…

SwiftUI 5.0(iOS 17.0)触摸反馈“震荡波”与触发器模式趣谈

概览 要想创作出一款精彩绝伦的 App&#xff0c;绚丽的界面和灵动的动画并不是唯一吸引用户的要素。有时我们还希望让用户真切的感受到操作引发的触觉反馈&#xff0c;直击使用者的灵魂。 所幸的是新版 SwiftUI 原生提供了实现触觉震动反馈的机制。在介绍它之后我们还将进一步…

prompt提示词:小红书爆款标题提示词,让AI 帮你生成吸睛的标题

目录 小红书爆款标题提示词效果展示&#xff1a;提示词&#xff1a; 小红书爆款标题提示词 一篇文章若缺少了吸引人的标题&#xff0c;就如同失去了灵魂的躯壳&#xff0c;失去了与读者心灵相通的桥梁&#xff0c;上次发表了一篇小红书爆款文案生成助手 提示词&#xff0c;大家…

Linux之安装Nginx

目录 传送门前言一、快速安装二、反向代理语法1、基本语法2、location语法1. 基本语法2. 匹配规则3. 修饰符4. 权重5. 嵌套location6. 其他指令7.案例 三、配置反向代理 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff0…

食用油5G智能工厂数字孪生可视化平台,推进食品制造业数字化转型

食用油5G智能工厂数字孪生可视化平台&#xff0c;推进食品制造业数字化转型。在食用油产业中&#xff0c;数字化转型已成为提升生产效率、优化供应链管理、确保产品质量和满足消费者需求的关键。食用油5G智能工厂数字孪生可视化平台作为这一转型的重要工具&#xff0c;正在推动…