1. 1. ReplicaSet(RS)
  2. 2. Deployment
  3. 3. Deployment资源配置
  4. 总结

  ‍

  在上一章节中,介绍了pod,以及介绍了如何使用命令行来创建一个pod。那么问题来了,一般来说,我们部署微服务不可能只部署一个噻,肯定是部署多个,但是我们总不可能说,写一个for循环,启动多个pod,并且如果pod挂了,我们又不能说实时观察,肯定是希望pod能够自动创建重启。那么这些如何做到呢?这便是今天我们介绍的Deployment的功能了。

1. ReplicaSet(RS)

  在介绍Deployment之前,首先需要介绍一下RS。RS,顾名思义,就是副本集,本质上就是一个资源对象,它定义了pod副本的数量,如何创建新pod,以及通过标签识别pod,目的就是确保集群中始终运行指定数量的pod副本。他的作用很简单:

  • Pod 挂了 → 自动重建
  • Pod 被删了 → 自动补上
  • Pod 数量 ≠ 期望值 → 调整到期望值

  看到上面这些问题,是不是似曾相似,这不就是之前在k8s基础概念[^1]提到的kube-controller-manager吗?YES,sir!是的,kube-controller-manager运行着多个控制器(controller,负责管理对应的资源对象),其中有一个就是Replication Controller,当我们创建一个ReplicaSet的时候,kube-controller-manager就是监听RS这个资源对象,然后检查。

  例如,如下yaml定义便是创建一个RS,在yaml定义中,我们会定义rs管理的标签,也就是nginx和prob,同时我们也会定义pod的创建模板,在模板中我们定义了pod的标签也为nginx和prob。 这样,RS在管理的时候,就是将对应标签的pod纳入到管理中。当他发现少了pod,则会创建,多了,则会删除。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
spec:
replicas: 3
selector: # ← 标签,这就是“认亲规则”
matchLabels:
app: nginx
env: prod
template: # 创建pod的规则
metadata:
labels:
app: nginx # ← 必须满足 selector!
env: prod
spec:
containers:
- name: nginx
image: nginx:latest

  下面是RS的工作原理图,可以结合前面章节的内容进行参考:

  ‍

2. Deployment

  在上面小节中,详细的介绍了ReplicaSet相关的作用以及工作流程,RS通过定义pod的数量相关资源对象,来确保集群中pod数量。那么有了这个,为什么我们还需要Deployment呢?

  Deployment提供了对pod和ReplicatSet的管理方式,从名字上我们就能看出,Deployment对应了的集群中的一次部署。当我们创建一个Deployment资源对象的时候,Deployment控制器就会自动创建一个RS资源对象。然后RS控制器又会根据RS里面定义的规则,最终创建对应数量的pod。看起来,似乎Deployment的功能和RS类似,但是相比于RS,deployment提供了更多的功能。

  让我们想想,RS有什么局限性?在实际的开发生产中,我们的应用需要更新或者在必要时进行回滚。那么就需要进行如下操作:

  1. 升级应用镜像版本:比如说nginx从1.0→2.0
  2. 滚动更新(逐步替换旧pod)
  3. 更新失败自动回滚到上一版本
  4. 更新速度控制(例如一次只更新一个pod)
  5. 灰度发布

  那么问题来了,RS能提供这些功能吗?答案是不能。如果我们需要更新镜像版本,那么必须要先创建新的RS,等新的pod启动后,再删除老的pod。但是却没法控制更新速度,以及进行自动归滚。当然,你要是说,我手动模拟这个过程,那确实也行,不过这样的,风险就太高了,毕竟手动操作怎么比得上程序自动操作的有序性和精准性。

  如下便是一个deployment的定义:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

  运行之后,则会生成3个pod:

  同时也生成了1个rs:

  如果我此时更新deployment对应的镜像,我们可以看到,k8s自动生成了新的rs,并且保留了之前版本的历史记录:

3. Deployment资源配置

  在Docker中,我们可以配置容器的计算资源,比如说CPU内存,当然在k8s中,我们也当然可以进行相关的配置。

apiVersion: apps/v1
kind: Deployment
meta
name: my-app
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
meta
labels:
app: my-app
spec:
containers:
- name: app-container
image: nginx:1.25
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"

  k8s调度器会根据 requests​ 值选择有足够资源的节点,表示容器至少需要这么多资源才能正常运行。limits则表示容器最多可以使用的上线,如果内存超过limit,则会OOMKilled,如果cpu超过limit,则会被节流。CPU的单位有点奇葩,是m,其中1000m=1核

  ​requests​和limit主要有以下用途:

  • 平时:Pod 按 requests 保证最低资源(用于调度和资源预留)。
  • 高峰期:如果节点有空闲资源,Pod 可以 临时使用更多资源(最多到 limits),实现“爆发”。
  • 资源紧张时:Kubernetes 会优先保障 requests,并可能限制或驱逐低 QoS 的 Pod。

  学过操作系统的我们知道,在Linux系统中,会实现某些调度器(比如CFS)来将cpu的时间分配给某些进程。因此,在k8s中配置pod的cpu资源大小,本质上就是在配置cpu的调度时间。具体的可以参考linux的cgroup是如何分配CPU资源。

  但是在使用中,我们需要注意,尽量让内存的requests和limits大小尽量不要偏差太大。因为cpu从limits大小的资源变成requests,无非就是算的慢一点。但是如果是内存从大变小,便可能会出现OOMKilled问题(因为本来程序占用了4G的内存资源,现在变成了1G,能不OOM吗?)。

4. 总结

  在 Kubernetes 中,​Pod 是调度和运行的最小单元​,但由于其缺乏自愈和管理能力,​生产环境中绝不应直接部署裸 Pod​。对于​无状态应用​(如 Web 服务、微服务),​Deployment 是事实上的标准部署单元。它通过管理 ReplicaSet 实现副本保障、滚动更新和版本回滚,是云原生应用发布的基石。

Kubernetes Deployment:部署与管理应用指南的更多相关文章

  1. 简化kubernetes应用部署工具之Helm应用部署

    介绍 微服务和容器化给复杂应用部署与管理带来了极大的挑战.Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的a ...

  2. 简化Kubernetes应用部署工具-Helm

    [编者的话]微服务和容器化给复杂应用部署与管理带来了极大的挑战.Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernete ...

  3. 容器云平台监控告警体系(三)—— 使用Prometheus Operator部署并管理Prometheus Server

    1.概述 Prometheus Operator是一种基于Kubernetes的应用程序,用于管理Prometheus实例和相关的监控组件.它是由CoreOS开发的开源工具,旨在简化Prometheu ...

  4. Helm, 在Kubernetes中部署应用的利器

    一.背景 Kubernetes(k8s)是一个基于容器技术的分布式架构领先方案.它在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大规模容器 ...

  5. Kubernetes Deployment故障排除图解指南

     个人K8s还在学习中,相关博客还没有写,准备学第二遍再开始学,发现这篇文章挺好,先转载一下. 原创: 白明的赞赏账户 下面是一个示意图,可帮助你调试Kubernetes Deployment(你可以 ...

  6. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...

  7. 使用 Helm 包管理工具简化 Kubernetes 应用部署

    当在 Kubernetes 中已经部署很多应用时,后续需要对每个应用的 yaml 文件进行维护操作,这个过程会变的很繁琐,我们可以使用 Helm 来简化这些工作.Helm 是 Kubernetes 的 ...

  8. kubernetes有状态集群服务部署与管理

    有状态集群服务的两个需求:一个是存储需求,另一个是集群需求.对存储需求,Kubernetes的解决方案是:Volume.Persistent Volume .对PV,除了手动创建PV池外,还可以通过S ...

  9. Kubernetes容器集群管理环境 - 完整部署(中篇)

    接着Kubernetes容器集群管理环境 - 完整部署(上篇)继续往下部署: 八.部署master节点master节点的kube-apiserver.kube-scheduler 和 kube-con ...

  10. Kubernetes容器集群管理环境 - 完整部署(下篇)

    在前一篇文章中详细介绍了Kubernetes容器集群管理环境 - 完整部署(中篇),这里继续记录下Kubernetes集群插件等部署过程: 十一.Kubernetes集群插件 插件是Kubernete ...

随机推荐

  1. opengl 学习 之 06 lesson

    opengl 学习 之 06 lesson 简介 随着键盘和鼠标来控制显示效果. link http://www.opengl-tutorial.org/uncategorized/2017/06/0 ...

  2. FastAPI遇上GraphQL:异步解析器如何让API性能飙升?

    扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ GraphQL与RESTful ...

  3. linux下.tar.gz如何解压--九五小庞

    1)使用命令 tar -xzvf XXX.tar.gz 如果解压出现 gzip:stdin:not in gzip format tar:Child returned status 1 tar:Err ...

  4. 2025智能BI⼯具竞品深度解析:DataFocus如何挑Tableau与PowerBI的霸主地位?

    2025智能BI⼯具竞品深度解析:DataFocus如何挑Tableau与PowerBI的霸主地位? 第⼀部分:引⾔:智能浪潮下的BI新纪元 在2025年的今天,企业数字化转型的浪潮正推动我们从⼀个& ...

  5. vscode AC5编译出错:Error: L6406E

    Error: L6406E: No space in execution regions with .ANY selector matching main.o(i.main). 解决办法: 在构建配置 ...

  6. vue写后台登录出现Error in v-on handler: "TypeError: Cannot read property 'validate' of undefined"

    原因1: 看一下表单验证的代码,找到这一句: this.$refs[formName].validate((valid) => { 看看这里refs的值与el-form上绑定的ref值一直不一致 ...

  7. E - Everything Has Changed HDU - 6354

    https://vjudge.net/contest/314399#problem/E   Edward is a worker for Aluminum Cyclic Machinery. His ...

  8. 为 Prometheus 告警规则增加 UI 管理能力

    Prometheus 体系貌似已经成为新时代的监控标准,运维出去找工作,很多公司都要求掌握 Prometheus 相关知识. 但是,Prometheus 实际在应用时,通常会遇到一个典型问题:告警规则 ...

  9. C#/.NET/.NET Core技术前沿周刊 | 第 49 期(2025年8.1-8.10)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  10. 手把手教你用Tableau制作超酷炫能源数据可视化图表

    什么是 Tableau? Tableau 是一个可视化分析平台,它改变了我们使用数据解决问题的方式,使个人和组织能够充分利用自己的数据. Tableau 帮助个人和组织提高数据驱动水平 作为现代商业智 ...