云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇!
在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时候在这片土地上播种、耕作了。
那么问题来了,我们该如何把之前用 Docker 打包好的应用(容器)种植到 K8s 这片广袤的土地上呢?直接扔进去吗?
当然不行。K8s 有一套自己的“种植”规则。今天,我们就来学习这套规则里最基本的两个概念:Pod 和 Deployment。它们是你在 K8s 世界里打交道最多的两个朋友。
一、 Pod:K8s 世界的“原子单位”,为什么不是直接部署容器?
在 Docker 的世界里,我们操作的最小单位是“容器”。但到了 K8s,你会发现最小的部署单位是一个叫 Pod 的东西。
一个常见的疑问是:为什么 K8s 不直接管理容器,非要引入一个 Pod 的概念呢?
为了回答这个问题,我们先来看一个比喻:
把一个容器想象成一个人。
那么 Pod 就像一套房子。
K8s 分配资源时,不是按“人头”(容器)分的,而是按“户口”(Pod)分的。它可以给一套房子(一个Pod)分配一个独立的 IP 地址、主机名和一套独立的“水电煤气”(网络、存储等资源)。
这套房子里,可以只住一个人(单容器 Pod),这也是最常见的用法。但 K8s 也允许你让多个人(多容器)合租在同一套房子里。
合租的好处是什么?
住在同一屋檐下的人,他们:
- 共享同一个“家庭住址”(共享网络命名空间):他们可以用
localhost
直接互相访问,就像家人之间串门一样,不需要出门绕到大街上(外部网络)。这对于需要紧密协作的程序(比如一个业务容器和一个日志收集容器)来说非常高效。 - 共享“储藏室”(共享存储卷 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
你会看到一个激动人心的场面:
- 你删除的那个 Pod 状态会变为
Terminating
(正在终止)。 - 几乎在同一时间,一个新的 Pod 会立刻出现,状态从
Pending
->ContainerCreating
->Running
。 - 最终,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 核心概念白话解读(下)》 中,我们将揭秘 Service 和 Ingress 这两个负责“对外暴露服务”和“管理流量”的关键角色。敬请期待!
相关文章:
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

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

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...