kubernetes部署控制器Deployment

一、概念

        在学习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.mzph.cn/pingmian/3691.shtml

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

相关文章

惯性测量单元(IMU)CAN接口:M-G552PJ7

M-G552PJ7是一种小形状因子惯性测量单元&#xff08;IMU&#xff09;&#xff0c;具有6个自由度&#xff1a;三轴角率和线性加速度&#xff0c;利用高精度补偿技术提供高稳定性和 高精度的测量能力。 各种校准参数存储在IMU的内存中&#xff0c;并在IMU的电源被打开后自动反映在…

python项目练习-1

获取无忧书城的小说内容&#xff01; import requests # 导入请求包 from lxml import etree # 导入处理xml数据包url https://www.51shucheng.net/wangluo/douluodalu/21750.html book_num 1 # 文章页数 download_urls [] # 定义一个空列表&#xff0c;表示我们下载过小…

如何使用bof-launcher在CC++Zig应用程序中执行Beacon对象文件(BOF)

关于bof-launcher bof-launcher是一款针对Beacon对象文件&#xff08;BOF&#xff09;的安全测试工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松在C/C/Zig应用程序中执行Beacon对象文件&#xff08;BOF&#xff09;。 Cobalt Strike 4.1于2020年6月25日发…

Checkpoint机制和生产配置

1.前提 在将Checkpoint之前&#xff0c;先回顾一下flink处理数据的流程&#xff1a; 2. 概述 Checkpoint机制&#xff0c;又叫容错机制&#xff0c;可以保证流式任务中&#xff0c;不会因为异常时等原因&#xff0c;造成任务异常退出。可以保证任务正常运行。 &#xff08;1&…

全志ARM-修改开发板内核启动日志

修改开发板内核日志输出级别&#xff1a; 默认输出级别为1&#xff0c;需要用超级用户权限修改 sudo vi /boot/orangepiEvn.txt 把第一行内核启动输出权限改为7&#xff0c;第二行把输出方式该为“serial”串口输出

前端实现将二进制文件流,并下载为excel文件

目录 一、关于二进制流二、项目实践三、常见问题及解决 一、关于二进制流 含义&#xff1a;二进制流是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同。 二进制文件可以包含任意类型的数据&#xff0c;例如&#xff1a;图像、音频、视频…

c++输入年月日,计算是该年的第几天

直接把每个月的天数存到数组直接相加会很方便&#xff0c;不用过多的判断。 注意&#xff1a;润年判断方法&#xff08;可以被4整除但不能被100整除&#xff0c;或者可以被400整除&#xff09; #include <iostream> using namespace std;int main() {int year,month,da…

PyCharm 中的特殊标记

在使用 PyCharm 开发 Python 项目的时候&#xff0c;经常会有一些特殊的标记&#xff0c;有些是 IDE 提示的代码规范&#xff0c;有些则为了方便查找而自定义的标记。 我在之前写过一些关于异常捕获的文章&#xff1a;Python3 PyCharm 捕获异常报 Too broad exception clause …

2024年Java JDK下载安装教程,附详细图文

文章目录 简介一、JDK的下载二、JDK的安装三、设置环境变量(不一定需要执行&#xff09; 简介 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f34…

Golang操作Redis

一. Redis介绍 1.1 简介 Redis是完全开源免费的&#xff0c;遵循BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis与其它的key-value缓存产品有以下三个特点&#xff1a; Redis支持数据持久化&#xff0c;可以见内存中的数据报错在磁盘中&#xff0c;重启的时候可以…

助力实现更可持续未来的智能解决方案:AI如何改变世界

人工智能已然成为今年的热门话题。由于生成式AI应用的快速采用&#xff0c;新闻头条充斥着有关AI如何彻底改变我们的政策制定、就业和经济走向的预测。您知道AI也是我们应对各种可持续发展挑战的先锋吗&#xff1f;AI通过分析大量数据&#xff0c;并提供有用的见解和工具&#…

【Unity动画系统】Animator组件的属性

介绍Animator组件的全部属性 Controller&#xff1a;动画控制器 Avatar&#xff1a;人物骨骼 Apply Root Motion&#xff1a;有一些动画片段自带位移&#xff0c;如果希望自带的位移应用在游戏对象上&#xff0c;那么就勾选&#xff1b;如果自己编写脚本&#xff0c;那么就不…

【静态分析】静态分析笔记08 - 指针分析 - 上下文敏感

参考&#xff1a; 【课程笔记】南大软件分析课程8——指针分析-上下文敏感&#xff08;课时11/12&#xff09; - 简书 ------------------------------------------------------------------------------------------------------------- 1. 上下文不敏感的问题 说明&#…

C# 图像处理 添加水印

方法1&#xff0c;使用自带的画刷进行绘制水印 示例代码 public partial class Form1 : Form{public Form1(){InitializeComponent();}string photoPathstring.Empty;Bitmap image null;private void button1_Click(object sender, EventArgs e) //选择照片{OpenFileDialog d…

【C++】位图

文章目录 1. 位图概念2. 位图的实现3. 位图的应用 1. 位图概念 面试题 给 40 亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这 40 亿个数中。 遍历&#xff0c;时间复杂度 O(N) 排序 O(NlogN)&#xff0c;利用二分查找&…

全志ARM-官方库SDK安装和验证

进入界面&#xff0c;输入以下指令 git clone https://github.com/orangepi-xunlong/wiringOP //下载源码 cd wiringOP //进入文件夹 sudo ./build clean //清除编译信息 sudo ./build …

C++ | Leetcode C++题解之第40题组合总和II

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<pair<int, int>> freq;vector<vector<int>> ans;vector<int> sequence;public:void dfs(int pos, int rest) {if (rest 0) {ans.push_back(sequence);return;}if (pos fr…

前端JS必用工具【js-tool-big-box】,防抖和节流的方法调用学习

这一小节&#xff0c;我们针对前端工具包&#xff08;npm&#xff09;js-tool-big-box的使用做一些讲解&#xff0c;主要是防抖和节流方面的。 目录 前言 1 安装和引入 2 防抖的调用学习 3 节流的调用学习 4 使用方法总结 前言 在前端项目中&#xff0c;经常涉及到防抖…

多数据源注解使用

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> </dependency> 1.使用mybatis-plus 如何配置多数据源&#xff0c;application-loc…

vue使用海康控件开发包——浏览器直接查看海康监控画面

1、下载控件开发包 2、安装插件&#xff08;双击/demo/codebase/HCWebSDKPlugin.exe进行安装&#xff09; 3、打开/demo/index.html文件 4、在页面上输入你的海康监控的登录信息进行预览 如果有监控画面则可以进行下面的操作 注意&#xff1a;以下操作都在Vue项目进行 5、复…