云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇!

在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时候在这片土地上播种、耕作了。

那么问题来了,我们该如何把之前用 Docker 打包好的应用(容器)种植到 K8s 这片广袤的土地上呢?直接扔进去吗?

当然不行。K8s 有一套自己的“种植”规则。今天,我们就来学习这套规则里最基本的两个概念:PodDeployment。它们是你在 K8s 世界里打交道最多的两个朋友。


一、 Pod:K8s 世界的“原子单位”,为什么不是直接部署容器?

在 Docker 的世界里,我们操作的最小单位是“容器”。但到了 K8s,你会发现最小的部署单位是一个叫 Pod 的东西。

一个常见的疑问是:为什么 K8s 不直接管理容器,非要引入一个 Pod 的概念呢?

为了回答这个问题,我们先来看一个比喻:

把一个容器想象成一个

那么 Pod 就像一套房子

K8s 分配资源时,不是按“人头”(容器)分的,而是按“户口”(Pod)分的。它可以给一套房子(一个Pod)分配一个独立的 IP 地址、主机名和一套独立的“水电煤气”(网络、存储等资源)。

这套房子里,可以只住一个人(单容器 Pod),这也是最常见的用法。但 K8s 也允许你让多个人(多容器)合租在同一套房子里。

合租的好处是什么?
住在同一屋檐下的人,他们:

  1. 共享同一个“家庭住址”(共享网络命名空间):他们可以用 localhost 直接互相访问,就像家人之间串门一样,不需要出门绕到大街上(外部网络)。这对于需要紧密协作的程序(比如一个业务容器和一个日志收集容器)来说非常高效。
  2. 共享“储藏室”(共享存储卷 Volume):他们可以轻松地共享文件,就像家人共用一个冰箱一样。

总结一下:Pod 是 K8s 调度、管理和资源分配的最小单位。它将一个或多个紧密关联的容器打包在一起,为它们提供共享的存储和网络资源,形成一个内聚的服务单元。

动手:编写并运行你的第一个 Pod

在 K8s 中,我们通常不使用命令行直接创建资源,而是通过编写 YAML 文件来“声明”我们想要的状态。这就像给 K8s 一张建筑蓝图,它会负责照着蓝图施工。

创建一个名为 nginx-pod.yaml 的文件,内容如下:

# nginx-pod.yaml# API 版本,表明这个对象属于哪个 API 组
apiVersion: v1
# 资源类型,我们正在创建一个 Pod
kind: Pod
# 元数据,包含资源的名称、标签等信息
metadata:name: nginx-hello-podlabels:app: web
# 规格,定义了这个 Pod 的期望状态
spec:# Pod 中包含的容器列表containers:# 第一个容器- name: nginx-container# 使用的 Docker 镜像image: nginx:1.21# 容器需要暴露的端口ports:- containerPort: 80

现在,打开你的终端,使用 kubectl 来应用这个蓝图:

# 确保你的 kubectl 已经连接到 Minikube 或 kind 集群
kubectl apply -f nginx-pod.yaml

执行后,K8s 就会开始创建这个 Pod。我们可以查看它的状态:

kubectl get pods# 你会看到类似下面的输出:
# NAME              READY   STATUS    RESTARTS   AGE
# nginx-hello-pod   1/1     Running   0          15s

Running 状态表示我们的 Nginx Pod 已经成功运行起来了!


二、 Deployment:应用的“状态维护者”与“智能管家”

我们现在有了一个正在运行的 Pod。但是,如果这个 Pod 因为某些原因(比如程序 Bug、节点故障)挂掉了怎么办?它就真的消失了,没有人会去管它。这在生产环境中是绝对无法接受的。

我们需要一个更高级的“管家”,它能确保我们的应用:

  • 永不宕机:如果一个 Pod 挂了,它能自动创建一个新的来替代。
  • 数量可控:我们可以告诉它,“请确保始终有3个相同的 Pod 在运行”,它就会自动维护这个数量。
  • 轻松更新:当我们想更新应用版本时,它能平滑地、滚动地用新版 Pod 替换旧版 Pod,保证业务不中断。
  • 一键回滚:如果新版本有问题,它能一键回退到上一个稳定版本。

这个智能管家,就是 Deployment

再次使用比喻:

如果 Pod 是一间公寓,那么 Deployment 就是这栋公寓的物业经理

你不会亲自去管理每一间公寓的入住和维修。你只需要告诉物业经理:“我需要这栋楼里始终有50间公寓是租出去并且正常运作的,租户是 Nginx v1.21”。

经理会负责招租(创建 Pod),检查水电(监控 Pod 健康),如果租户跑了(Pod 挂了)就立刻找新租户(创建新 Pod),如果你想升级所有公寓的装修(更新应用版本),经理会一间一间地施工(滚动更新)。

动手:用 Deployment 部署应用

让我们来创建一个 nginx-deployment.yaml 文件,用 Deployment 的方式来部署 Nginx。

# nginx-deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:# 期望的 Pod 副本数量replicas: 3# 选择器,告诉 Deployment 要管理哪些 Pod# Deployment 通过这个标签找到它应该管理的 Podselector:matchLabels:app: nginx-server# Pod 模板,这就是 Deployment 创建新 Pod 时使用的“蓝图”# 注意,这里的结构和我们上面定义的 Pod YAML 的 spec 部分几乎一样template:metadata:# Pod 的标签,必须和上面的 selector.matchLabels 匹配labels:app: nginx-serverspec:containers:- name: nginximage: nginx:1.21ports:- containerPort: 80

应用这个 YAML 文件:

kubectl apply -f nginx-deployment.yaml

查看 Deployment 和它创建的 Pods:

kubectl get deployment# 输出:
# NAME               READY   UP-TO-DATE   AVAILABLE   AGE
# nginx-deployment   3/3     3            3           20skubectl get pods# 输出: (注意,Pod 名称是 Deployment 名称加上随机字符串)
# NAME                                READY   STATUS    RESTARTS   AGE
# nginx-deployment-6b6c47948c-7v9d8   1/1     Running   0          25s
# nginx-deployment-6b6c47948c-8l9f4   1/1     Running   0          25s
# nginx-deployment-6b6c47948c-k5z2x   1/1     Running   0          25s

看!Deployment 严格按照我们的要求 replicas: 3,创建并维护了3个 Nginx Pod。


三、实战演练:见证 Deployment 的“魔法时刻”

现在,让我们亲眼见证 Deployment 作为“智能管家”的神奇能力。

1. 魔法一:故障自愈 (Self-healing)

我们来手动“干掉”一个 Pod,模拟一次故障。

首先,获取 Pod 列表,随便挑一个名字记下来:
kubectl get pods

然后,无情地删除它:

# 将 <your-pod-name> 替换为你复制的 Pod 名称
kubectl delete pod <your-pod-name>

现在,立刻、马上再次查看 Pod 列表,并使用 -w (watch) 参数持续观察变化:

kubectl get pods -w

你会看到一个激动人心的场面:

  1. 你删除的那个 Pod 状态会变为 Terminating(正在终止)。
  2. 几乎在同一时间,一个新的 Pod 会立刻出现,状态从 Pending -> ContainerCreating -> Running
  3. 最终,Pod 的总数依然是3个!

这就是 K8s 的故障自愈能力,由 Deployment 精确执行。

2. 魔法二:滚动更新 (Rolling Update)

我们的应用要发布新版本了,比如把 Nginx 从 1.21 升级到 1.22

直接编辑 nginx-deployment.yaml 文件,将 image: nginx:1.21 修改为 image: nginx:1.22

# ...spec:containers:- name: nginximage: nginx:1.22 # <--- 修改这里ports:- containerPort: 80

保存文件后,再次执行 apply 命令:
kubectl apply -f nginx-deployment.yaml

再次用 -w 观察 Pod 变化:kubectl get pods -w

你会看到 K8s 正在进行“滚动更新”:
它会先创建一个新版本的 Pod,等新 Pod 启动并准备就绪后,再优雅地终止一个旧版本的 Pod。如此循环,直到所有 Pod 都被更新为新版本。整个过程服务不中断!

你可以通过以下命令查看更新状态:
kubectl rollout status deployment/nginx-deployment

3. 魔法三:一键回滚 (Rollback)

糟糕!新版本 1.22 有一个重大 Bug,我们需要紧急回退到上一个版本!

别慌,Deployment 已经为我们记录了历史版本。执行回滚命令即可:

kubectl rollout undo deployment/nginx-deployment

再次观察 Pod 变化 kubectl get pods -w,你会发现 K8s 又开始了一次滚动操作,这次是把 1.22 版本的 Pod 逐个替换回 1.21 版本。危机解除!


总结

今天我们学习了 K8s 中两个最核心、最基础的概念:

  • Pod: K8s 的原子调度单元,是容器的“家”,为内部容器提供共享的网络和存储。
  • Deployment: Pod 的“智能管家”,负责保证 Pod 的数量(副本)、实现故障自愈、并以安全、平滑的方式进行应用更新和回滚。

你现在已经掌握了在 K8s 中部署、更新和维护无状态应用的基本技能。我们已经成功地让应用在集群内部“活起来”并且“活得很好”。

但是,新的问题又来了:现在这些 Nginx 服务都运行在 K8s 集群内部,我们作为外部用户,如何才能访问到它们呢?

别急,这正是我们下一篇文章要解决的问题。在下一篇 《K8s 核心概念白话解读(下)》 中,我们将揭秘 ServiceIngress 这两个负责“对外暴露服务”和“管理流量”的关键角色。敬请期待!

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

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

相关文章

华为云Flexus+DeepSeek征文 | 基于ModelArts Studio、DeepSeek大模型和Dify搭建网站智能客服助手

目录 一、前言 二、ModelArts Studio&#xff08;MaaS&#xff09;介绍与应用场景 2.1ModelArts Studio&#xff08;MaaS&#xff09;介绍 2.2 ModelArts Studio&#xff08;MaaS&#xff09;使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、华为云Flexus简介 3.1 …

『uniapp』url拦截屏蔽 避免webview中打开淘宝店铺自动跳转淘宝

目录 分析1. wv.overrideUrlLoading2. 参数 `mode: allow`3. 参数 `match: ^(http|https)://.*`4. 回调函数 `function(e) { console.warn(allow url:, e.url); }`作用:可能的应用场景:核心代码总结欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新…

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…

Zookeeper 和 Kafka 版本与 JDK 要求

Apache Zookeeper 和 Apache Kafka 在不同版本中对 JDK 的要求如下表所示(基于官方文档和历史版本记录整理): 1. Zookeeper 版本与 JDK 要求 Zookeeper 版本要求的最低 JDK 版本说明3.4.x 系列JDK 6生产环境建议用 JDK 8(旧版兼容性强)。3.5.x 系列(3.5.5+)JDK 83.5.0 …

V837s-SDK Telnetd服务连接不上异常解决

目录 前言 一、检查 Telnetd 服务是否启动 二、问题解决 总结 前言 在基于 V837s-SDK 进行开发的过程中,Telnetd 服务连接不上是一个较为常见且棘手的问题。Telnet 作为一种远程登录协议,在开发调试时为我们提供了便捷的远程操作方式。若其连接出现异常,将严重影响开发进度…

滑动窗口最大值和最小值

题目&#xff1a; 思路&#xff1a; 窗口进行滑动时&#xff0c;需要快速获取min和max&#xff0c;因此需要一个结构来保存最值&#xff0c;而不是临时计算。动态的最值更新容易联想到单调栈&#xff0c;但是这里需要频繁增删元素&#xff0c;因此用双端队列&#xff0c;front…

JVM——对象创建全家桶:JVM中对象创建的模式及最佳实践

引入 在 Java 应用开发中&#xff0c;对象创建是最基础且高频的操作&#xff0c;但往往也是性能优化的关键切入点。想象一个在线阅读平台&#xff0c;每天需要创建数百万个 Book 对象来统计阅读数据。如果每个对象的创建过程存在内存浪费或性能瓶颈&#xff0c;累积效应将导致…

VSCode中PHP使用Xdebug

本地环境 windows10php8.2 ntsxdebug v3thinkphp v8 下载Xdebug Xdebug下载地址 从xdebug下载地址,下载最新的xdebug,解压后将php_xdebug.dll放入php目录的ext目录下 配置php.ini [Xdebug] zend_extension php_xdebug xdebug.client_host 127.0.0.1 xdebug.client_port…

金融系统渗透测试

金融系统渗透测试是保障金融机构网络安全的核心环节&#xff0c;它的核心目标是通过模拟攻击手段主动发现系统漏洞&#xff0c;防范数据泄露、资金盗取等重大风险。 一、金融系统渗透测试的核心框架 合规性驱动 需严格遵循《网络安全法》《数据安全法》及金融行业监管要求&am…

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…

PHP 项目中新增定时任务类型的详细步骤(以 CRMEB 为例)

1.首先需要在下面文件中增加定时任务类型 2.在app\services\system\crontab\CrontabRunServices类中增加第一步中与定时任务类型同名的方法&#xff0c;注意需要下划线转小驼峰 例如定时任务的类型为&#xff1a;order_tick,而在CrontabRunServices类中的方法名称为&#xff1…

Day27 函数专题2:装饰器

1.装饰器的思想&#xff1a;进一步复用 装饰器&#xff08;Decorator&#xff09;是 Python 中一种强大的编程工具&#xff0c;核心作用是在不修改原函数代码的前提下&#xff0c;为函数添加额外功能&#xff08;如日志记录、性能统计、权限校验等&#xff09;。它充分利用了 …

Qt进阶开发:动画框架的介绍和使用

文章目录 一、QPropertyAnimation 简介二、基本用法三、常用属性和方法四、支持的属性&#xff08;部分常用&#xff09;五、多个动画组合六、使用缓和曲线七、状态机框架 一、QPropertyAnimation 简介 #include <QPropertyAnimation>QPropertyAnimation 可以让你在一段…

IP选择注意事项

IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时&#xff0c;需要考虑以下参数&#xff0c;然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…

filebeat原理架构

Filebeat 是基于 Golang 开发的轻量级日志采集 Agent&#xff0c;其核心架构设计围绕高效、可靠地采集与转发日志数据&#xff0c;主要组件和工作流程如下&#xff1a; ‌一、核心架构组件‌ ‌输入 (Inputs)‌ 负责监控指定的日志源&#xff08;如文件路径、日志文件&#x…

Air8000开发板新资料开放!多功能+高扩展特性全面解锁

Air8000开发板最新技术资料正式向开发者开放。这个开发板集多功能与高扩展性于一身&#xff0c;将为物联网、嵌入式系统等领域的创新项目提供更强大的技术支持&#xff0c;助力开发者快速实现创意落地。 工程师朋友们&#xff0c;Air8000开发板“多功能集成高扩展性”&#xff…

如何迁移Cordova应用到HarmonyOS 5 以及迁移时常见的问题?

以下是 Cordova 应用迁移至 HarmonyOS 5 的完整方案及常见问题解决方案&#xff0c;结合最新技术实践整理&#xff1a; 一、迁移流程 1. ‌方案选择‌ ‌方案‌‌适用场景‌‌操作复杂度‌‌Android 兼容层方案‌简单应用快速上线低&#xff08;无需修改代码&#xff09;‌原…

板凳-------Mysql cookbook学习 (十--4)

6.3 设置客户端时区 --客户端位于不同时区需要注意&#xff0c;如果位于同一时区则不需要关心 mysql> drop table if exists t; Query OK, 0 rows affected (0.06 sec)mysql> create table t (ts timestamp); Query OK, 0 rows affected (0.05 sec)mysql> insert int…

如何根据excel表生成sql的insert脚本

根据excel自带的vba宏进行操作 首先altF11 点击插入~模块 录取执行语句 Sub GenerateSQL()Dim lastRow As IntegerlastRow Cells(Rows.Count, 1).End(xlUp).RowFor i 2 To lastRow 假设第一行是标题Cells(i, "S").Value "INSERT INTO table_name (ID, RE…