概述

官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/

Deployment简称deploy,Deployment 用于管理运行一个应用负载的一组 Pod,通常适用于无状态的应用。

为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod,

即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加强大。要学习ReplicaSet请查看这篇文章:K8s新手系列之ReplicaSet资源

Deployment资源不会直接创建Pod,其作用在rs资源上,基于rs管理Pod副本。

Deployment的作用

管理 Pod 的副本

  • 创建和管理 Pod 副本:Deployment 可以创建指定数量的 Pod 副本,并确保这些副本始终运行。例如,你可以通过设置 replicas 字段来指定需要运行的 Pod 数量。

  • 自动恢复:如果某个 Pod 出现故障或被意外删除,Deployment 会自动创建一个新的 Pod 来替代它,从而保证应用的高可用性。

声明式更新

  • 定义期望状态:用户只需要在 Deployment 的配置文件中描述期望的状态,例如 Pod 的数量、镜像版本等,Deployment 控制器会自动将实际状态调整为期望状态。

  • 更新 Pod 模板:通过更新 Deployment 的 PodTemplateSpec,可以声明 Pod 的新状态,Deployment 会自动创建新的 ReplicaSet,并以受控速率将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet。

滚动更新和回滚

  • 滚动更新:Deployment 支持滚动更新,即在更新应用时,不会一次性替换所有 Pod,而是逐步替换,从而保证服务的连续性。你可以通过设置 maxSurge 和 maxUnavailable 参数来控制更新的节奏。

  • 回滚:如果更新后的应用出现问题,Deployment 可以方便地回滚到之前的版本。每次更新都会生成一个新的修订版本,你可以通过 kubectl rollout undo 命令回滚到指定的版本。

扩容和缩容

  • 手动扩展:你可以通过修改 Deployment 的 replicas 字段,手动增加或减少 Pod 的副本数量,以应对不同的负载需求。

  • 自动扩展:结合 Kubernetes 的水平自动扩展器(Horizontal Pod Autoscaler),Deployment 可以根据 CPU 使用率或其他自定义指标自动调整 Pod 的数量

版本管理

  • 修订版本:Deployment 会记录每次更新的修订版本,你可以通过 kubectl rollout history 查看历史版本,并通过 --revision 参数查看特定版本的详细信息

暂停和恢复

  • 暂停更新:在更新过程中,如果需要对 PodTemplateSpec 进行多次修改,可以暂停 Deployment 的更新,待修改完成后恢复,从而避免频繁更新导致的问题

清理旧的 ReplicaSet

  • 自动清理:Deployment 会自动清理不再需要的旧 ReplicaSet,以节省资源。

支持多种更新策略

  • 滚动更新(RollingUpdate):这是默认的更新策略,通过逐步替换 Pod 来更新应用。

  • 重建更新(Recreate):在这种策略下,Deployment 会先删除所有旧的 Pod,然后创建新的 Pod。

比例缩放

  • 支持比例缩放:在滚动更新过程中,如果 Deployment 的副本数量发生变化,Deployment 控制器会按照比例在新旧 ReplicaSet 中分配额外的副本,以降低更新风险。

负载均衡与服务发现

  • 与 Service 集成:Deployment 通常会和 Service 配合使用。Service 为 Deployment 中的 Pod 提供了一个稳定的网络端点,将请求分发到不同的 Pod 上,实现负载均衡。

Deployment资源配置文件详解

Deployment的资源配置文件和ReplicaSet资源配置文件类似,可以通过kubectl explain deploy来查看创建Deployment的字段

示例:

[root@master01 ~]# kubectl explain deploy
KIND: Deployment
VERSION: apps/v1 DESCRIPTION:
Deployment enables declarative updates for Pods and ReplicaSets. # FIELDS字段中的内容已进行截取
FIELDS:
apiVersion <string> kind <string> metadata <Object> spec <Object> status <Object>

通过上述可以发现定义Deployment的资源文件和定义Pod一样,也需要apiVersion、kind、metadata、spec等字段。

但是spec字段中有三个字段,需要注意,分别是replicas、selector、template。如下:

[root@master01 ~]# kubectl explain deploy.spec
KIND: Deployment
VERSION: apps/v1 RESOURCE: spec <Object> DESCRIPTION:
Specification of the desired behavior of the Deployment. DeploymentSpec is the specification of the desired behavior of the
Deployment. FIELDS:
minReadySeconds <integer>
#可选字段
#用于设定一个新创建的 Pod 在其所有容器都正常运行且处于就绪状态,并且没有任何容器崩溃的最短持续时间。
#默认值为0 paused <boolean>
#可选字段
#用于指示 Deployment 是否处于暂停状态。
#当将其设置为 true 时,Deployment 会停止创建或删除 Pod 的操作,不会再进行滚动更新等操作。
#默认值为false progressDeadlineSeconds <integer>
# 可选字段
#用于设定 Deployment 在被视为失败之前可以花费的最长时间。
#如果在这个时间内 Deployment 没有取得预期的进展,Deployment 控制器会继续处理该 Deployment,但会在 Deployment 的状态中显示一个 ProgressDeadlineExceeded 原因的条件。
#默认值600秒 replicas <integer>
# 必选字段
#用于设置Pod的副本数量 revisionHistoryLimit <integer>
#可选字段
#用于指定要保留的旧 ReplicaSet 的数量,以便在需要时进行回滚操作。
#默认值为10 selector <Object> -required-
#用于定义一个标签选择器,用于选择 Pod strategy <Object>
#用于指定 Deployment 在替换现有 Pod 为新 Pod 时所采用的策略
#默认值为RollingUpdate template <Object> -required-
#用于描述 Deployment 将会创建的 Pod 的模板。它包含了 Pod 的元数据(如标签)和规格(如容器配置)。

创建Deployment

这里我们创建三个Pod副本

示例:

# 定义资源文件
[root@master01 ~/deploy]# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
namespace: default
spec:
# 设置Pod的副本数量
replicas: 3
selector:
# 标签匹配规则
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
containers:
- name: container-nginx
image: nginx:1.14.1
restartPolicy: Always
[root@master01 ~/deploy]# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
containers:
- name: container-nginx
image: nginx:1.14.1
restartPolicy: Always # 创建deploy
[root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx created [root@master01 ~/deploy]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 0/3 3 0 8s
[root@master01 ~/deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 3 3 0 11s
rs-nginx-1 1 1 1 95m
[root@master01 ~/deploy]# kubectl get po | grep pod-nginx
[root@master01 ~/deploy]# kubectl get po | grep deploy
deployment-nginx-6d84458cd8-8kbmf 1/1 Running 0 41s
deployment-nginx-6d84458cd8-cmsl2 1/1 Running 0 41s
deployment-nginx-6d84458cd8-qmk9m 1/1 Running 0 41s [root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx created

查看创建成功之后对应的资源

查看deploy

[root@master01 ~/deploy]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 0/3 3 0 8s

查看ReplicaSet

[root@master01 ~/deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 3 3 0 11s

查看Pod

[root@master01 ~/deploy]# kubectl get po | grep deploy
deployment-nginx-6d84458cd8-8kbmf 1/1 Running 0 41s
deployment-nginx-6d84458cd8-cmsl2 1/1 Running 0 41s
deployment-nginx-6d84458cd8-qmk9m 1/1 Running 0 41s

验证Deployment的副本管理

如果某个 Pod 出现故障或被意外删除,Deployment 会自动创建一个新的 Pod 来替代它,从而保证应用的高可用性。

我们将新创建的三个Pod都哦进行删除,查看一下会发生什么:

# 删除所有的Pod
[root@master01 ~/deploy]# kubectl delete po deployment-nginx-6d84458cd8-8kbmf deployment-nginx-6d84458cd8-cmsl2 deployment-nginx-6d84458cd8-qmk9m
pod "deployment-nginx-6d84458cd8-8kbmf" deleted
pod "deployment-nginx-6d84458cd8-cmsl2" deleted
pod "deployment-nginx-6d84458cd8-qmk9m" deleted #查看deploy
[root@master01 ~/deploy]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 3/3 3 3 7m # 查看rs
[root@master01 ~/deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 3 3 3 6m28s # 查看Pod,发现对应的数量还是3个
[root@master01 ~/deploy]# kubectl get po | grep deloy
[root@master01 ~/deploy]# kubectl get po | grep dep
deployment-nginx-6d84458cd8-4tds2 1/1 Running 0 20s
deployment-nginx-6d84458cd8-4tzzs 1/1 Running 0 20s
deployment-nginx-6d84458cd8-l9vqv 1/1 Running 0 20s

如果将Replicaset资源删除会发生什么呢?

# 删除rs
[root@master01 ~/deploy]# kubectl delete rs deployment-nginx-6d84458cd8
replicaset.apps "deployment-nginx-6d84458cd8" deleted # 查看rs,发现数量没有变化,只不过查看AGE字段发现重启了
[root@master01 ~/deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 3 3 3 3s # 查看Pod,发现对应的Pod重新创建了三个
[root@master01 ~/deploy]# kubectl get po | grep deploy
deployment-nginx-6d84458cd8-69zg9 1/1 Running 0 20s
deployment-nginx-6d84458cd8-ljdxw 1/1 Running 0 20s
deployment-nginx-6d84458cd8-qqc48 1/1 Running 0 20s

验证Deployment的声明式更新和扩缩容

声明式更新表示用户只需要在 Deployment 的配置文件中描述期望的状态,例如 Pod 的数量、镜像版本等,Deployment 控制器会自动将实际状态调整为期望状态。

验证声明式更新和扩容

我们来将Pod的副本数量更改成10个,发现会发生什么呢?

[root@master01 ~/deploy]# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
namespace: default
spec:
# 将Pod的副本数量调整成10
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
containers:
- name: container-nginx
image: nginx:1.14.1
restartPolicy: Always
# 重新应用资源文件
[root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx configured

查看一下对应的资源变化发生了什么?

# 查看deploy
[root@master01 ~/deploy]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 10/10 10 10 15h
# 查看rs
[root@master01 ~/deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 10 10 10 5m1s
# 查看po
[root@master01 ~/deploy]# kubectl get po | grep deploy
deployment-nginx-6d84458cd8-69zg9 1/1 Running 0 5m33s
deployment-nginx-6d84458cd8-6vvzt 1/1 Running 0 40s
deployment-nginx-6d84458cd8-ljdxw 1/1 Running 0 5m33s
deployment-nginx-6d84458cd8-mkhlw 1/1 Running 0 40s
deployment-nginx-6d84458cd8-pnv9x 1/1 Running 0 40s
deployment-nginx-6d84458cd8-qqc48 1/1 Running 0 5m33s
deployment-nginx-6d84458cd8-rgngt 1/1 Running 0 40s
deployment-nginx-6d84458cd8-t7nms 1/1 Running 0 40s
deployment-nginx-6d84458cd8-wllqb 1/1 Running 0 40s
deployment-nginx-6d84458cd8-wrdmc 1/1 Running 0 40s

通过上述发现,通过deploy扩容,deploy和rs两个资源都不会产生变化,只不过将Pod的数量达到我们定义的副本数量

验证声明式更新和缩容

同理,我们将Pod的副本数量调整成1

[root@master01 ~/deploy]# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
namespace: default
spec:
# 将副本数量调整成1
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
containers:
- name: container-nginx
image: nginx:1.14.1
restartPolicy: Always
# 重新应用它
[root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx configured

查看一下对应的资源变化

# 查看deploy
[root@master01 ~/deploy]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 1/1 1 1 15h
# 查看rs
[root@master01 ~/deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 1 1 1 10m
# 查看Pod
[root@master01 ~/deploy]# kubectl get po | grep deploy
deployment-nginx-6d84458cd8-qqc48 1/1 Running 0 10m

Deployment的标签选择器

Deployment的标签选择器和Replicaset一样,分为两类,一类是等式选择器,另一类是集合选择器

等式选择器

等式选择器通过 ===(两者含义相同)或者 != 来筛选标签。其通过spec.selector.matchLabels来实现。

示例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
namespace: default
labels:
app: deploy-nginx
spec:
replicas: 1
selector:
# 等式选择器
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest

集合选择器

集合选择器借助 in、notin、exists、DoesNotExist 这些操作符来筛选标签。

  • in:用于选取标签值在指定集合内的 Pod。
  • notin:用于选取标签值不在指定集合内的 Pod。
  • exists:用于选取具有指定标签的 Pod,不考虑标签的值。
  • DoesNotExist:用于选取不具有指定标签的 Pod,不考虑标签的值。

其通过spec.selector.matchExpressions来实现

示例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-Deployment-set
spec:
replicas: 3
selector:
# 集合选择器
matchExpressions:
# key:指定Label的key,operator:表示操作符,value:表示Label的value
- {key: app, operator: In, values: [nginx]}
- {key: env, operator: NotIn, values: [development, testing]}
template:
metadata:
labels:
app: nginx
env: production
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

管理Deployment

查看Deployment

语法:

kubectl get deploy <deploy-name> -n <namespace-name>

示例:

[root@master01 ~/deploy]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 1/1 1 1 15h

修改Deployment

由两种方式,一种是通过kubectl edit rc <rc-name>来进行修改,会打开一个类似vim的界面,修改其对应的值即可,最后wq保存即可应用你的配置.

另一种方式则是修改对应的资源文件,最后使用kubectl apply -f <file>即可。

删除Deployment

删除Deployment时会删除对应的ReplicaSet和Pod,删除时请谨慎!!!

语法:

kubectl delete rc <rc-name> -n <namespace-name>

K8s新手系列之初始Deployment资源的更多相关文章

  1. 记录一次k8s环境尝试过程(初始方案,现在已经做过很多完善,例如普罗米修斯)

    记录一次Team k8s环境搭建过程(初始方案,现在已经做过很多完善,例如普罗米修斯) span::selection, .CodeMirror-line > span > span::s ...

  2. k8s入门系列之guestbook快速部署

    k8s集群以及一些扩展插件已经安装完毕,本篇文章介绍一下如何在k8s集群上快速部署guestbook应用. •实验环境为集群:master(1)+node(4),详细内容参考<k8s入门系列之集 ...

  3. k8s入门系列之扩展组件(一)DNS安装篇

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  4. k8s入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  5. Android新手系列教程(申明:来源于网络)

    Android新手系列教程(申明:来源于网络) 地址:http://blog.csdn.net/column/details/androidcoder666.html

  6. k8s 入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  7. struts2官方 中文教程 系列七:消息资源文件

    介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字 ...

  8. deployment资源

    目的:用rc在滚动升级之后,会造成服务访问中孤单,于是k8s引入了deploymentziyuan 创建deployment vim k8s_deploy.yml apiVersion: extens ...

  9. SignalR新手系列教程详解总结(转)

    SignalR新手系列教程详解总结 GlobalHost.ConnectionManager.GetHubContext<TodoListHub>() .Clients.Clients(l ...

  10. kubernets之Deployment资源

    一  声明式的升级应用 1.1  回顾一下kubernets集群里面部署一个应用的形态应该是什么样子的,通过一副简单的图来描述一下 通过RC或者RS里面的模板创建了三个pod,之后通过一个servci ...

随机推荐

  1. 《Indie Tools • 半月刊》第001期

    引言:独立开发者工具分享 <INDIE TOOLS>专注于分享独立开发出海精选.最新.最实用的工具. 欢迎订阅半月刊:<INDIE TOOLS • 半月刊> 如果本文能给你提供 ...

  2. 20 分钟高效掌握 cursor

    本身属于在前端小组的一次小分享,这里做个同步分享. 一.pro 权益说明 目前公司购买了 2 个 pro 月付账号,权益包括无限制 tab 补全与 ai 聊天,但每个月只有 500 个快速请求权益,如 ...

  3. C#反射机制学习

    参考原文链接:https://blog.csdn.net/xiaouncle/java/article/details/52983924 反射是.NET中的重要机制,通过反射可以得到*.exe或*.d ...

  4. mac电脑安装python配置系统环境变量

    首先安装对应的python版本 这边我安装的是python3.11.6版本 安装包地址:macOS 64-bit universal2 installer 安装包安装完成之后执行该安装包 一直点击继续 ...

  5. 克鲁斯焊机GL 270引弧困难维修

    克鲁斯焊机维修: 对于客户而言,其受益之处在于所有的机械手系统部件,从机械手控制.工件.定位器.传感器到电源和焊枪,都是由一家供应商开发和制造的.而诸如熔化极惰性气体/活性气体保护双丝焊接技术.等离子 ...

  6. 替换JSONObject某个对象的值

    有时候我们只想替换JSONObject某个对象的值,不想把所有对象的值都列出来.那就用for循环把所有的值重新赋值一遍.再单独给需要赋值的对象重新赋值 JSONObject itemObject = ...

  7. Typecho的Joe主题开启文章导航目录树

    引言 发现从typora复制过来的markdown代码中的目录导航[toc]语句没生效, 没有像typora或其他markdown编辑器生成导航目录树, 网上搜了下, 发现个解决方法, 在主题设置里插 ...

  8. mybatis - [13] 分页

    题记部分 001 || limit select * from mybatis.user limit 2,5; 2代表偏移量,从结果集的第3行开始. 5代表返回的记录数 UserMapper List ...

  9. 大数据之路Week08_day06 (Zookeeper初识)

    让我们来回顾一下我们在学习Hadoop中的HDFS的时候,肯定见过下面这样的两幅图: 这副图代表着什么呢?它介绍的是Hadoop集群的高可靠,也就是前面提过的HA,仔细观察一下这副图,我们发现有两个N ...

  10. xss学习及xss-lab解题记录

    什么是XSS(跨站脚本攻击) SQL注入是服务端将用户输入的数据当成SQL代码去执行 XSS可以理解为服务端把用户输入的数据当成前端代码去执行 前端代码->主要是js代码 两个关键条件: 第一个 ...