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 运行的全链路关系:

Deployment YAML 提交到 Pod 运行流程 YAML 定义 kubectl apply API Server etcd Controller Manager Scheduler Kubelet Pod 运行 说明: YAML 通过 kubectl 提交至 API Server,持久化到 etcd;Controller Manager 创建 ReplicaSet,Scheduler 分配节点, Kubelet 调用 CRI 接口拉取镜像并启动容器,最终 Pod 进入 Running 状态。

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 实现精准版本控制。

下面通过对比图展示不同策略下的镜像拉取决策路径:

镜像拉取策略决策流程 容器启动请求 策略判断 Always → 拉取镜像 IfNotPresent → 检查本地 Never → 仅用本地

2.4 综合实战:从 YAML 到运行验证

以下是一个完整的实战步骤,将前面三个知识点串联起来:

  1. 编写 YAML 文件:定义 Deployment,副本数 3,镜像 nginx:1.25,拉取策略 IfNotPresent。
  2. 提交到集群:kubectl apply -f deployment.yaml
  3. 验证状态:kubectl get deployment 查看 READY 列是否达到 3/3。
  4. 查看 Pod 详情:kubectl describe pod <pod-name> 确认镜像拉取事件。
  5. 测试滚动更新:修改镜像版本为 nginx:1.26,再次 kubectl apply,观察滚动过程。
排障提示:如果 Pod 状态为 ImagePullBackOff,首先检查镜像仓库地址是否正确、认证是否配置、拉取策略是否导致镜像不存在。使用 kubectl logs <pod-name> 查看容器日志,kubectl describe pod 查看 Events 段。