Kubernetes 部署入门:Deployment + YAML 完整实战(Nginx 示例 + 最佳实践 2026 版)
·
前言
继续我的学习输出,今天来攻克 Kubernetes 的部署核心:怎么把应用真正跑起来? K8s 里“部署”不是简单跑个容器,而是用 Deployment(或其他控制器)来管理 Pod 的生命周期,包括副本数、更新策略、健康检查等。 我花了半天时间把官方最新文档 + 社区实践过了一遍,下面是精华总结 + 实战示例(基于 K8s v1.28+,2026 年主流版本)。
1. K8s 常见部署方式对比(先搞清楚用哪个)
K8s 有多种控制器来管理 Pod,根据应用类型选对的才能少踩坑:
- Deployment:最常用,适合无状态应用(如 Web 服务、微服务 API)。支持滚动更新、回滚、自动扩缩容。
- StatefulSet:适合有状态应用(如数据库 MySQL、Redis、ZooKeeper)。Pod 有固定顺序、唯一身份、持久存储。
- DaemonSet:每个 Node 只跑一个 Pod,适合守护进程(如日志收集 agent、监控 agent、网络代理)。
- Job / CronJob:适合一次性任务或定时任务(如数据迁移、备份)。
我的快速选择口诀:
- 无状态、需要高可用 → Deployment
- 有状态、需要固定身份/顺序 → StatefulSet
- 每个节点都要跑一个 → DaemonSet
- 只跑一次或定时跑 → Job/CronJob
今天重点讲 Deployment,因为 80% 的场景都用它。
2. Deployment 核心概念
Deployment → ReplicaSet → Pod
- Deployment 管理 ReplicaSet(副本控制器)
- ReplicaSet 保证 Pod 数量始终等于 replicas
- Pod 是实际运行的容器实例
关键字段(YAML 里最常改的):
- replicas:想要的副本数
- selector:怎么找自己管理的 Pod(matchLabels)
- template:Pod 模板(镜像、端口、资源限制等)
- strategy:更新策略(RollingUpdate 最常用)
3. 实战:用 Deployment 部署 Nginx(完整 YAML 示例)
咱们来部署一个经典的 Nginx Web 服务器,三副本 + 服务暴露。
nginx-deployment.yaml(直接 kubectl apply -f 这个文件就能跑)
YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default # 可改成你的命名空间
labels:
app: nginx
spec:
replicas: 3 # 启动 3 个副本
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate # 滚动更新(默认)
rollingUpdate:
maxSurge: 1 # 最多多出 1 个 Pod
maxUnavailable: 0 # 更新时不允许有 Pod 不可用(高可用)
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25 # 用最新稳定版(2026 年推荐)
ports:
- containerPort: 80
resources: # 资源限制(生产必加,避免 OOM)
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
livenessProbe: # 存活探针(容器挂了自动重启)
httpGet:
path: /
port: 80
initialDelaySeconds: 15
periodSeconds: 10
readinessProbe: # 就绪探针(未就绪不加流量)
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
配套 Service(暴露服务) — nginx-service.yaml
YAML
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # Service 端口
targetPort: 80 # Pod 端口
type: LoadBalancer # 云上会自动创建 LB;在本地用 NodePort 或 ClusterIP 测试
部署命令(一步步来):
Bash
# 创建 Deployment
kubectl apply -f nginx-deployment.yaml
# 创建 Service
kubectl apply -f nginx-service.yaml
# 查看状态
kubectl get deployments
kubectl get pods -l app=nginx # 看 3 个 Pod 是否 Running
kubectl get svc nginx-service # 看 EXTERNAL-IP 或 NodePort
# 测试访问(云上直接 curl EXTERNAL-IP;本地用 minikube service 或 port-forward)
kubectl port-forward svc/nginx-service 8080:80
# 浏览器打开 http://localhost:8080 看到 Welcome to nginx!
4. 常用操作 & 最佳实践(生产必知)
- 扩容:kubectl scale deployment nginx-deployment --replicas=5
- 滚动更新镜像:改 YAML image 字段 → kubectl apply -f ...(自动滚动)
- 回滚:kubectl rollout undo deployment/nginx-deployment
- 查看历史:kubectl rollout history deployment/nginx-deployment
- 最佳实践(2026 最新总结):
- 永远加 resources requests/limits(防节点资源耗尽)
- 加 liveness/readiness probes(健康检查)
- 用 RollingUpdate + maxUnavailable=0(零宕机更新)
- YAML 存 Git,用 kubectl apply -f dir/ 批量管理
- 避免直接改 Pod,永远通过 Deployment 修改
5. 今日感悟 & 避坑总结
- 第一次自己写 Deployment YAML 时,我卡在了 selector 和 labels 必须匹配上,花了半小时 debug。
- 学完后最大的收获:Deployment 不是跑容器,而是“声明式运维”——你只告诉 K8s “我要 3 个 Nginx”,它自动帮你维护。
- 生产里别用默认镜像 tag :latest,固定版本如 nginx:1.25-alpine 更安全。
明日计划: 继续深挖 Service 类型(ClusterIP vs NodePort vs LoadBalancer vs Ingress),再部署一个带 Ingress 的多服务应用!
欢迎评论区交流:
- 你第一次部署 K8s 应用踩过什么坑?
- 工作中最常用 Deployment 还是 StatefulSet?
参考:Kubernetes 官方文档(2025-2026 更新)、CSDN 社区多篇最新实践。
更多推荐



所有评论(0)