2. Deployment 创建与配置
Deployment 是 Kubernetes 中最常用的工作负载控制器,负责声明式地管理 Pod 副本、滚动更新与回滚。本节将围绕 kubectl create deployment 命令、YAML 文件定义以及镜像拉取策略三个核心维度展开,帮助学员掌握从命令行到声明式配置的完整创建流程。
2.1 使用 kubectl create deployment 快速创建
kubectl create deployment 是入门级命令,适合快速启动一个无状态服务。其基本语法如下:
kubectl create deployment <deployment-name> --image=<image-name> [--replicas=<count>] [--port=<port>]
常用参数说明:
| 参数 | 示例值 | 说明 |
|---|---|---|
--image |
nginx:1.25 | 指定容器镜像,必填 |
--replicas |
3 | Pod 副本数,默认 1 |
--port |
80 | 容器暴露端口,用于 Service 关联 |
--dry-run |
client | 预检模式,不实际创建 |
实战技巧:使用
--dry-run=client -o yaml 可以快速导出 YAML 模板,再手动修改,兼顾效率与可维护性。
示例:创建 3 副本的 Nginx Deployment
kubectl create deployment nginx-deploy --image=nginx:1.25 --replicas=3 --port=80
执行后,Kubernetes 会自动创建 Deployment 对象,并生成对应的 ReplicaSet 和 Pod。可通过以下命令验证:
kubectl get deployment nginx-deploy
kubectl get pods -l app=nginx-deploy
2.2 YAML 文件定义:声明式配置核心
YAML 是 Kubernetes 声明式管理的标准格式。一个完整的 Deployment YAML 包含四个核心字段:apiVersion、kind、metadata、spec。其中 spec 内部又分为 replicas、selector、template 三大部分。
标准 Deployment YAML 结构:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app-container
image: my-app:v1.0
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent
关键字段解析:
| 字段路径 | 作用 | 注意事项 |
|---|---|---|
spec.replicas |
期望 Pod 副本数 | HPA 会自动覆盖此值 |
spec.selector.matchLabels |
标签选择器,关联 Pod | 必须与 template 标签一致,不可变更 |
spec.template.spec.containers |
容器定义列表 | 支持多容器,但生产建议单容器 |
imagePullPolicy |
镜像拉取策略 | 影响 Pod 启动行为 |
常见陷阱:
selector.matchLabels 一旦创建即不可修改。如果标签需要变更,必须删除 Deployment 重建。因此,设计标签时应预留足够的扩展空间。
下面通过一张流程图展示从 YAML 提交到 Pod 运行的全链路关系:
2.3 镜像拉取策略(imagePullPolicy)
镜像拉取策略决定了 Kubelet 在启动容器时如何获取镜像。该策略在容器定义中通过 imagePullPolicy 字段设置,支持三种模式:
| 策略值 | 行为描述 | 适用场景 |
|---|---|---|
Always |
每次启动容器都从镜像仓库拉取 | 镜像标签为 :latest 或需要强制更新 |
IfNotPresent |
本地不存在镜像时才拉取 | 生产环境固定版本标签(如 :v1.0.0) |
Never |
仅使用本地镜像,不拉取 | 离线环境或预加载镜像场景 |
默认行为规则:
- 如果镜像标签为
:latest或未指定标签,默认策略为Always。 - 如果镜像标签为具体版本(如
:v1.0.0),默认策略为IfNotPresent。 - 显式设置
imagePullPolicy会覆盖默认行为。
生产环境最佳实践:
- 始终使用固定版本标签,避免使用
:latest,确保环境一致性。 - 显式设置
imagePullPolicy: IfNotPresent,减少不必要的镜像拉取,加快 Pod 启动速度。 - 在 CI/CD 流水线中,每次构建生成唯一标签(如 Git commit SHA),配合
IfNotPresent实现精准版本控制。
下面通过对比图展示不同策略下的镜像拉取决策路径:
2.4 综合实战:从 YAML 到运行验证
以下是一个完整的实战步骤,将前面三个知识点串联起来:
- 编写 YAML 文件:定义 Deployment,副本数 3,镜像
nginx:1.25,拉取策略IfNotPresent。 - 提交到集群:
kubectl apply -f deployment.yaml - 验证状态:
kubectl get deployment查看 READY 列是否达到 3/3。 - 查看 Pod 详情:
kubectl describe pod <pod-name>确认镜像拉取事件。 - 测试滚动更新:修改镜像版本为
nginx:1.26,再次kubectl apply,观察滚动过程。
排障提示:如果 Pod 状态为
ImagePullBackOff,首先检查镜像仓库地址是否正确、认证是否配置、拉取策略是否导致镜像不存在。使用 kubectl logs <pod-name> 查看容器日志,kubectl describe pod 查看 Events 段。