首页 / Kubernetes (k8s) 入门教程 / Deployment 基础

Kubernetes (k8s) 入门教程

Deployment 基础

本教程共 65 篇 · 第 18 篇 · 更新于 2026-08-14 · 约 10 分钟阅读

KubernetesDeployment无状态工作负载ReplicaSet

本节目标:学完你能创建一个 Deployment 跑无状态应用,说清它、ReplicaSet、Pod 三层谁管谁,并用一条命令完成扩缩容。

如果你只学一个工作负载,就学 Deployment。绝大多数 Web 服务、API 服务都是无状态的,Deployment 就是为它们量身做的。

18-1 Deployment 管什么

Deployment(部署)是 Kubernetes 里最常用的无状态工作负载。它干两件事:维持副本数、管理版本发布。

它不直接管 Pod,而是管 ReplicaSet(第 17 章)。每次你改了镜像或配置,Deployment 就新建一个 ReplicaSet,让新 RS 起新 Pod,旧的慢慢退场。

打个比方:Deployment 是”项目经理”,ReplicaSet 是”班组长”,Pod 是”干活的”。你跟项目经理说要新版,他派新班组长带人上,旧班组长带人撤。

kubectl get deployment
kubectl get rs
kubectl get pods

三条命令一起看,能清楚看到这三层:一个 Deployment 对应一个当前 RS,RS 下挂着 N 个 Pod。

18-2 创建一个 Deployment

最省事的办法是用命令生成,再转成 YAML 文件:

kubectl create deployment nginx --image=nginx:1.27 --replicas=3 --dry-run=client -o yaml > deploy.yaml
kubectl apply -f deploy.yaml

标准 YAML 长这样:

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

注意 selector.matchLabelstemplate 里的标签得对上,Deployment 靠它认领自己的 RS 和 Pod。

Note

Deployment 的 selector 创建后也不能改,和 ReplicaSet 一样。标签设计一开始就要想好。

18-3 自愈是怎么发生的

Deployment 把”自愈”这件事完全交给 ReplicaSet。某个 Pod 挂了,RS 补一个;节点宕了,RS 在别处补。

你作为用户完全不用管 Pod 的生死,只管描述”我要 3 个副本、跑这个镜像”。这种”只说想要什么,不说怎么做”的方式,叫声明式

kubectl get pods
# 随便删一个,再看,又冒出来一个
kubectl delete pod <某个pod>
kubectl get pods
Tip

删 Pod 时最好连着 RS 一起看。如果删完不补,八成是 RS 的 replicas 或选择器有问题。

18-4 扩缩容

扩到 5 个副本,一行搞定:

kubectl scale deployment nginx --replicas=5

或者改 YAML 里的 spec.replicasapply。Deployment 会让 RS 调和到 5 个。

看实时状态:

kubectl rollout status deployment/nginx

这条命令会一直等到所有新副本就绪才返回,脚本里常用它卡发布流程。

18-5 更新镜像

改镜像也是声明式,Deployment 自动走滚动更新(第 19 章细讲):

kubectl set image deployment/nginx nginx=nginx:1.28

set image 等于改了模板里的镜像,Deployment 据此新建 RS、逐步替换。你不用手动一个个删 Pod。

18-6 常见坑

一是 selectortemplate.labels 不一致,Deployment 起不来,报控制器认领不到 Pod。

二是副本数和节点资源不匹配。要 10 个副本但节点只剩 2 核,剩下的一直 Pending

三是把有状态应用(数据库、带盘的中间件)用 Deployment 跑。Deployment 不保证存储稳定,这类请用 StatefulSet(第 20 章)。

Warning

不要手动 kubectl edit 改 Pod 的镜像来”更新”。Pod 由 RS 管,你改的 Pod 一重启就回到模板原样。改模板(Deployment)才是正道。

Deployment 解决了”跑几个、挂了补”,但”怎么平滑换版本、换坏了怎么回退”是下一章的主题。