云原生入门系列|第4集:K8s控制器全解析!零基础搞懂Deployment部署的底层逻辑
前言
各位云原生入门的小伙伴,欢迎继续跟进《云原生入门系列》专栏!上一集我们彻底吃透了Pod的完整生命周期,搞懂了Pod是K8s世界里最小的运行单元,也知道了Pod会经历“挂起→运行→终止→销毁”的全过程,以及K8s通过重启策略实现应用自愈的底层逻辑。
但这里有一个新手必问的核心问题:既然Pod是应用的运行载体,我们为什么不直接用kubectl命令手动创建Pod?反而在实际工作中,几乎看不到有人手动创建Pod?
答案很简单:手动创建的Pod“太脆弱”——它没有自愈能力(除非手动配置重启策略,但功能有限)、不能实现多副本扩容、无法完成版本更新与回滚、一旦Pod被删除就彻底消失,完全满足不了线上业务的高可用需求。
而解决这一切问题的核心,就是今天我们要讲的K8s灵魂组件——控制器(Controller),其中最常用、最基础、最适合零基础入门的,就是Deployment控制器。
今天这第4集,我们就抛开官方晦涩的定义,用大白话+生活化比喻,把Deployment控制器讲透:什么是Deployment?它和Pod是什么关系?为什么它是线上部署的首选?以及它的核心功能(多副本部署、版本更新、回滚、自愈)到底是怎么实现的?全程贴合前两集搭建的minikube实验环境,穿插简单实操,让你不仅懂原理,还能动手练,彻底打通K8s应用部署的核心逻辑。
一、先搞懂:什么是K8s控制器?Deployment又是什么?
在讲Deployment之前,我们先简单理解“控制器”的核心作用——控制器就像是K8s集群里的“管理员”,它的核心工作是监控Pod的状态,确保Pod的实际运行状态,始终和我们设定的“期望状态”保持一致。
用生活化的比喻来讲:你(用户)给控制器下达指令“我要3个运行Nginx的Pod,一直稳定运行”,这个“3个Nginx Pod”就是“期望状态”;控制器就会一直盯着集群里的Pod,一旦有1个Pod崩溃、被删除,控制器就会立刻新建1个Pod补位,始终维持3个Pod在运行——这就是控制器的“自愈”核心逻辑。
而Deployment,就是K8s中最常用的一种控制器,也是我们零基础入门、日常工作中最常接触的控制器。它的核心作用,是管理无状态应用的Pod(比如Web服务、接口服务、前端应用等,这类应用不需要固定的存储、固定的网络标识,多个副本完全一致),提供“多副本部署、版本更新、版本回滚、自动扩缩容”等一系列核心功能,是线上部署无状态应用的“标配工具”。
这里必须明确一个核心关系(新手必记):Deployment不直接运行应用,它是通过管理“ ReplicaSet(副本集)”,再由ReplicaSet管理Pod。简单来说,关系链是:Deployment → ReplicaSet → Pod。
举个例子:你通过Deployment配置“3个Nginx Pod”,Deployment会先创建一个ReplicaSet,ReplicaSet再根据配置,创建3个Pod;当Pod出现异常时,是ReplicaSet负责重启、新建Pod,而Deployment则负责管理ReplicaSet的版本、数量,以及实现版本更新、回滚等高级功能。
为什么要多一层ReplicaSet?核心是为了“版本管理”——每一次更新应用版本,Deployment都会创建一个新的ReplicaSet,旧的ReplicaSet不会被删除(默认保留),这样一旦更新出现问题,就能快速回滚到旧版本,保证服务稳定。
二、Deployment核心功能拆解(零基础大白话+实操引导)
Deployment的核心功能,全部围绕“让应用更稳定、运维更高效”展开,我们结合前两集搭建的minikube环境,逐个拆解,每个功能都配简单的实操命令,你可以跟着动手练习(全程无需复杂配置,新手也能上手)。
1. 核心功能1:多副本部署——实现应用高可用
这是Deployment最基础、最核心的功能。手动创建Pod时,只能创建1个副本,一旦这个Pod崩溃,服务就会中断;而Deployment可以轻松实现“多副本部署”,多个Pod同时运行,即使其中1个Pod崩溃,其他Pod依然能提供服务,不会影响业务。
比如我们部署Nginx应用,通过Deployment配置3个副本,集群里就会有3个运行Nginx的Pod,分布在不同的节点(如果集群有多个节点),实现“容灾备份”——这就是线上业务高可用的基础。
简单实操引导(跟着做,无需提前准备):
1. 打开你的minikube集群(如果没启动,执行命令:minikube start);
2. 用命令创建一个Deployment,部署3个Nginx副本:kubectl create deployment nginx-demo --image=nginx:1.24 --replicas=3;
3. 查看Deployment状态:kubectl get deployment;
4. 查看对应的Pod:kubectl get pods;
此时你会看到3个状态为“Running”的Nginx Pod,这就是Deployment的多副本部署功能。如果手动删除其中一个Pod(kubectl delete pod Pod名称),过几秒再查看,会发现Deployment会自动新建一个Pod,维持3个副本的状态——这就是控制器的自愈能力。
2. 核心功能2:版本更新——零停机升级应用
线上应用需要不断迭代升级(比如修复bug、新增功能),如果直接删除旧Pod、再创建新Pod,会导致服务中断——而Deployment的“滚动更新”功能,能实现“零停机升级”,在不中断服务的前提下,完成应用版本的更新。
滚动更新的底层逻辑(大白话):Deployment会先创建1个新版本的Pod,等新版本Pod正常运行后,再删除1个旧版本的Pod;重复这个过程,直到所有旧版本Pod都被替换成新版本Pod,全程不会出现“没有Pod运行”的情况,服务始终可用。
简单实操引导:
1. 我们把刚才部署的Nginx版本,从1.24更新到1.25:kubectl set image deployment/nginx-demo nginx=nginx:1.25;
2. 查看更新进度:kubectl rollout status deployment/nginx-demo;
3. 更新完成后,查看Pod镜像:kubectl get pods -o jsonpath='{range .items[*]}{.spec.containers[0].image}{"\n"}{end}';
此时你会发现,所有Pod的镜像都已经变成了nginx:1.25,而且更新过程中,服务始终没有中断——这就是滚动更新的优势,也是线上应用升级的标准方式。
3. 核心功能3:版本回滚——快速恢复故障版本
如果更新后的新版本出现bug、服务异常,怎么办?Deployment的“版本回滚”功能,可以快速将应用回滚到上一个稳定版本,避免故障扩大。
因为每一次更新,Deployment都会创建一个新的ReplicaSet,旧的ReplicaSet会被保留(默认保留10个),所以回滚本质上就是“切换到旧的ReplicaSet”,让旧版本的Pod重新运行。
简单实操引导:
1. 查看Deployment的更新历史:kubectl rollout history deployment/nginx-demo;
2. 回滚到上一个版本:kubectl rollout undo deployment/nginx-demo;
3. 回滚完成后,查看Pod镜像,会发现已经恢复到了nginx:1.24;
这个功能非常重要,线上更新出现问题时,能快速止损,保证业务稳定——这也是Deployment比手动创建Pod的核心优势之一。
4. 核心功能4:自动扩缩容——根据负载动态调整Pod数量
线上业务的流量是动态变化的(比如高峰期流量暴涨,低谷期流量减少),如果Pod数量固定,高峰期会出现服务卡顿、崩溃,低谷期会浪费服务器资源。Deployment可以配合HPA(自动扩缩容控制器),实现“根据负载动态调整Pod数量”——流量高时自动增加Pod,流量低时自动减少Pod,既保证服务稳定,又节省资源。
这里我们先简单了解逻辑(HPA的具体操作,我们会在后续剧集专门讲解):只要配置好“CPU使用率阈值”(比如CPU使用率超过70%就增加Pod,低于30%就减少Pod),HPA就会配合Deployment,自动完成Pod的扩缩容,全程无需人工干预。
三、新手必避坑:Deployment与手动创建Pod的核心区别
很多新手入门后,会疑惑“我手动创建Pod也能运行应用,为什么一定要用Deployment?”,这里我们用一张通俗的对比,帮你彻底分清两者的区别,避免踩坑:
1. 自愈能力:手动创建的Pod,只有配置了重启策略才会重启,且无法自动补位;Deployment管理的Pod,即使被手动删除,也会自动新建,始终维持期望副本数。
2. 多副本管理:手动创建Pod,需要一个个执行命令,无法批量管理;Deployment可以直接配置副本数,批量创建、管理Pod。
3. 版本管理:手动创建Pod,更新版本需要删除旧Pod、创建新Pod,会中断服务;Deployment支持滚动更新、版本回滚,零停机升级,故障可快速恢复。
4. 资源管控:手动创建Pod,无法实现自动扩缩容;Deployment可配合HPA,根据负载动态调整Pod数量,优化资源利用率。
总结一句话:手动创建Pod适合测试、临时验证;Deployment适合线上正式部署,能满足高可用、易运维、可扩展的需求——这也是实际工作中,几乎所有无状态应用都用Deployment部署的原因。
四、核心知识点复盘&系列预告
到这里,我们就彻底搞懂了Deployment控制器的核心逻辑、功能和实操方法,结合前3集的内容,我们已经打通了K8s应用部署的基础链路:
1. 核心知识点复盘:
- 控制器是K8s的“管理员”,核心是维持Pod的期望状态与实际状态一致;
- Deployment是最常用的控制器,用于管理无状态应用,关系链:Deployment → ReplicaSet → Pod;
- Deployment核心功能:多副本部署、滚动更新、版本回滚、支持自动扩缩容;
- 线上部署优先用Deployment,避免手动创建Pod,提升服务稳定性和运维效率。
弄懂了Deployment,你就掌握了K8s应用部署的核心技能,接下来我们就要深入学习K8s的网络通信——上一集我们提到,Service是K8s的“网络管家”,负责Pod之间、外部与Pod之间的通信。
下一集(第5集),我们就来详细拆解Service服务的核心原理,搞懂为什么Pod的IP会变化,而Service能实现“固定访问入口”,以及Service的几种类型(ClusterIP、NodePort、LoadBalancer)到底怎么用,手把手带你实现Pod之间的通信,敬请期待。