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.rhkb.cn/news/314067.html

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

相关文章

[Flutter3] 记录Dio的简单封装(一)

文章目录 效果使用ResponseEntity类DioManager封装_onResponse / _onDioException 的设计Response的处理catch处理 效果 请求成功/失败/异常的日志输出效果 成功: 失败:500 失败:404 网络异常: 使用 举个使用的例子, 在调用 DioManager的时候, 直接通过返回值的状态, 来…

森林消防隔膜泵的应用与前景——恒峰智慧科技

随着全球气候变暖&#xff0c;森林火灾频发&#xff0c;给生态环境和人类安全带来严重威胁。为有效应对这一挑战&#xff0c;森林消防领域不断引入新技术、新装备。其中&#xff0c;隔膜泵作为一种高效、可靠的消防设备&#xff0c;正逐渐受到广泛关注。本文将探讨森林消防隔膜…

Python Flask Web框架快速入门

Flask 入门Demo Flask 开发环境搭建&#xff0c;执行如下指令&#xff1a; pip install flask # 第一节: Flask 快速入门from flask import Flask app Flask(__name__)app.route(/flask) def hello_flask():return Hello Flaskapp.run() 核心代码剖析&#xff1a; 从 fla…

五种主流数据库:集合运算

关系型数据库中的表与集合理论中的集合类似&#xff0c;表是由行&#xff08;记录&#xff09;组成的集合。因此&#xff0c;SQL 支持基于数据行的各种集合运算&#xff0c;包括并集运算&#xff08;Union&#xff09;、交集运算&#xff08;Intersect&#xff09;和差集运算&a…

springcloud Ribbon的详解

1、Ribbon是什么 Ribbon是Netflix发布的开源项目&#xff0c;Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的框架。 2、Ribbon能干什么 LB负载均衡(Load Balance)是什么&#xff1f;简单的说就是将用户的请求平摊的分配到多个服务上&#xff0c;从而达…

C++:const成员和取地址操作符

目录 一、const成员 二、取地址及const取地址操作符重载 一、const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数 隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改。 注&…

ESLlint重大更新后,使用旧版ESLint搭配Prettier的配置方式

概要 就在前几天&#xff0c;ESLint迎来了一次重大更新&#xff0c;9.0.0版本&#xff0c;根据官方文档介绍&#xff0c;使用新版的先决条件是Node.js版本必须是18.18.0、20.9.0&#xff0c;或者是>21.1.0的版本&#xff0c;新版ESLint将不再直接支持以下旧版配置(非扁平化…

【CSS】使用 scroll snap 实现页面的垂直大屏滚动

CSS 属性 scroll-snap-type 设置了在有滚动容器的情形下吸附至吸附点的严格程度。 scroll-snap-type 使用 scroll snap 也可以用于垂直滚动&#xff0c;全屏展示就是一个很好的例子: <main><section class"section section-1"></section><sect…

pytest使用 pytest-rerunfailures 插件实现失败用例重跑功能

使用 pytest 进行测试时&#xff0c;你可以通过安装并配置 pytest-rerunfailures 插件来实现失败用例重跑功能。以下是一个示例说明&#xff1a; 假设你有一个测试文件 test_example.py 包含如下测试用例&#xff1a; import pytestpytest.mark.parametrize("num",…

Idea:通义千问插件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、通义千问大模型 二、程序编写助手 三、Idea安装通义千问插件 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、通义千问大模型…

python 中使用 ESP8266 实现语音识别(或热词检测)

介绍 我的大部分家庭自动化都是通过对网络中的设备执行 HTTP 请求来控制的。 (例如:开灯、打开收音机、控制加热系统...... 这可以使用ESP8266轻松完成。我有一个控制器和一个触摸传感器,当我在床上时用它来控制灯光和音乐。 像 Amazon Echo 或 Google Homepod 一样添加语…

基于harris角点和RANSAC算法的图像拼接matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ....................................................................... I1_harris fu…

某翻译平台翻译接口逆向之webpack学习

逆向网址 aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLw 逆向链接 aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLyMv 逆向接口 aHR0cHM6Ly9kaWN0LnlvdWRhby5jb20vd2VidHJhbnNsYXRl 逆向过程 请求方式 POST 逆向参数 sign c168e4cb76169e90f82d28118dbd24d2 接口请求结果解密 过程分析 根据XHR…

计算机网络—— book

文章目录 一、概述1.1互联网的核心部分1&#xff0e;电路交换的主要特点2&#xff0e;分组交换的主要特点 1.2.计算机网络的性能1&#xff0e;速率2&#xff0e;带宽3&#xff0e;吞吐量4&#xff0e;时延5&#xff0e;利用率 1.3.计算机网络体系结构协议与划分层次具有五层协议…

用爬虫玩转石墨文档

目录 前言 一、什么是爬虫 二、爬虫原理 三、使用Python实现爬虫 1.安装Python库 2.爬取石墨文档内容 3.解析HTML内容 四、实际应用案例 1.批量下载附件 2.统计文档字数 3.自动化更新文档 总结 前言 在当今信息化时代&#xff0c;文档协作平台早已成为我们日常工作…

H5点击复制功能 兼容安卓、IOS

效果图 HTML代码 <div>链接&#xff1a;<span style"color: #FF8A21" click"CopyUrl" id"copyId"> https://blog.csdn.net/qq_51463650?spm1000.2115.3001.5343</span> </div>复制方法 const CopyUrl () > {let …

QT跨平台读写Excel

QT跨平台读写Excel 背景Excel工具CMakeLists.txt工程目录 背景 开发框架QT&#xff0c;makefile构建工具CMake&#xff0c;编译器MinGW Excel工具 考虑跨平台则不能使用针对微软COM组件的QAxObject来读写Excel&#xff0c;因此使用开源QtXlsx。 这里是将QXlsx当做源码嵌入使…

如何快速学习盲打键盘的指法

学习盲打键盘的指法需要一定的时间和练习&#xff0c;但是以下几个方法可以帮助你加快学习的速度&#xff1a; 掌握正确的手位&#xff1a;了解标准的键盘布局以及手指应该放置的位置是学习盲打的第一步。在QWERTY键盘上&#xff0c;你的左手应该放在ASDF键上&#xff0c;右手应…

Git--基础学习--面向企业--持续更新

一、基础学习 1.1基本命令 //查询基础信息 git config --global --list //选取合适位置创建 mkdir 文件名 //创建文件夹 //全局配置 git config --global user.email "****e***i" git config --global user.name "*** K****"//--------------------进入…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象&#xff0c;分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点&#xff0c;主要成员是各类 Server&#xff0c;开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外&#xff0c;还…