K8S-Deployment资源对象

在 Kubernetes 生态中,Deployment 是管理无状态应用的核心资源对象,它为 Pod 和 ReplicaSet 提供了声明式的管理方式,极大简化了应用的部署、更新和维护流程。本文将全面解析 Deployment 的核心概念、配置细节及企业级应用实践。

一、Deployment 核心概念

Deployment 作为 Kubernetes 中更高层次的 API 对象,主要用于替代传统的 ReplicationController,其核心价值在于提供了声明式的应用管理能力。典型应用场景包括:

  • 定义 Deployment 以创建 Pod 和 ReplicaSet
  • 实现应用的滚动升级与版本回滚
  • 灵活进行应用的扩容和缩容
  • 支持暂停和继续 Deployment 更新操作

从工作原理来看,Deployment 通过管理 ReplicaSet 来间接管理 Pod。当需要滚动升级应用时,Deployment 会创建新的 ReplicaSet,逐步增加新副本数量并减少旧副本数量,整个过程保证服务持续可用。这种复合操作模式使其比单独使用 ReplicaSet 更适合长期运行的服务管理。

二、Deployment YAML 配置详解

一个完整的 Deployment 配置文件包含多个关键部分,以下是各核心字段的说明:

2.1 基础配置

复制代码
apiVersion: apps/v1  # 接口版本
kind: Deployment     # 接口类型
metadata:
  name: cango-demo   # Deployment 名称
  namespace: cango-prd  # 命名空间
  labels:
    app: cango-demo  # 标签
spec:
  replicas: 3        # 期望副本数
  selector:          # 标签选择器,匹配 Pod 模板
    matchLabels:
      app: cango-demo

2.2 升级策略配置

复制代码
strategy:
  rollingUpdate:  # 滚动更新策略
    maxSurge: 1      # 升级时可超出期望副本数的最大数量
    maxUnavailable: 1 # 升级时允许不可用的最大副本数

2.3 Pod 模板配置

Pod 模板是 Deployment 的核心,定义了应用的运行容器、资源限制等关键信息:

复制代码
template:
  metadata:
    labels:
      app: cango-demo  # 必须与 selector.matchLabels 匹配
  spec:
    containers:
    - name: cango-demo1  # 容器名称
      image: swr.cn-east-2.myhuaweicloud.com/cango-prd/cango-demo:0.0.1-SNAPSHOT  # 镜像地址
      command: ["/bin/sh","-c","cat /etc/config/path/to/special-key"]  # 启动命令
      args:  # 启动参数
        - '-storage.local.retention=$(STORAGE_RETENTION)'
        - '-config.file=/etc/prometheus/prometheus.yml'

2.4 健康检查配置

复制代码
livenessProbe:  # 存活探针
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 60  # 启动后延迟检测时间
  timeoutSeconds: 5        # 超时时间
  failureThreshold: 5      # 失败阈值

readinessProbe:  # 就绪探针
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  timeoutSeconds: 5

2.5 资源限制与环境变量

复制代码
resources:  # 资源限制
  requests:  # 资源请求
    cpu: 2
    memory: 2048Mi
  limits:    # 资源上限
    cpu: 2
    memory: 2048Mi
env:  # 环境变量
  - name: LOCAL_KEY
    value: value
  - name: CONFIG_MAP_KEY
    valueFrom:
      configMapKeyRef:
        name: special-config
        key: special.type

2.6 存储挂载配置

复制代码
volumeMounts:  # 容器内挂载点
- name: log-cache
  mountPath: /tmp/log
- name: nfs-client-root
  mountPath: /mnt/nfs

volumes:  # 定义存储卷
- name: log-cache
  emptyDir: {}
- name: nfs-client-root
  nfs:
    server: 10.42.0.55
    path: /opt/public
- name: example-volume-config
  configMap:
    name: example-volume-config

三、企业级应用实践

3.1 基础部署流程

  1. 创建 Deployment 配置文件(my-blue.yaml)

  2. 创建 Service 配置文件(my-blue-service.yaml)

  3. 应用配置并验证部署结果:

    应用部署配置

    kubectl apply -f my-blue.yaml
    kubectl apply -f my-blue-service.yaml

    验证部署

    kubectl get pod
    kubectl get svc

3.2 应用扩缩容

通过修改 Deployment 配置中的 replicas 字段实现:

复制代码
spec:
  replicas: 5  # 修改副本数为5

修改后执行 kubectl apply -f my-blue.yaml 即可生效。

3.3 滚动更新

通过更新容器镜像版本实现应用升级:

复制代码
spec:
  template:
    spec:
      containers:
      - name: myapp-blue
        image: janakiramm/myapp:v2  # 升级镜像版本

应用配置后,Deployment 会按照预设的滚动策略自动完成升级。

3.4 版本回滚

当升级出现问题时,可以快速回滚到历史版本:

复制代码
# 查看历史版本
kubectl rollout history deployment <deployment-name>

# 回滚到指定版本
kubectl rollout undo deployment <deployment-name> --to-revision=1

四、自定义更新策略

Deployment 的滚动更新行为可通过以下两个参数精细控制:

  • maxSurge:允许超出期望副本数的最大比例或数量,值越大更新速度越快
  • maxUnavailable:允许不可用的最大比例或数量,值越小服务越稳定

配置示例:

复制代码
strategy:
  rollingUpdate:
    maxSurge: 1        # 允许超出1个副本
    maxUnavailable: 1  # 允许1个副本不可用

参数可设置为绝对值(如 1)或百分比(如 20%),但两者不能同时为 0。

相关推荐
lichenyang4533 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4533 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4533 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事6 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson8 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生8 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭8 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美9 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵10 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程