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。

相关推荐
我不是8神几秒前
Docker知识点总结
运维·docker·容器
新手小白*1 小时前
K8S-Deployment 资源对象
云原生·容器·kubernetes
喜欢你,还有大家2 小时前
k8s——日志采集方案
云原生·容器·kubernetes
weixin_46682 小时前
Docker 概述与安装
docker·容器·eureka
Gogo8162 小时前
docker 容器
运维·docker·容器
一条懒鱼6662 小时前
K8S-Deployment资源对象
docker·容器·kubernetes
做运维的阿瑞2 小时前
K8s 1.28.2 + Containerd + CentOS7.9 集群部署
云原生·容器·kubernetes
为什么要内卷,摆烂不香吗3 小时前
Dockerfile 与 Docker Compose 在 CI/CD 管道中的分工与配合方式
ci/cd·docker·容器
启明真纳3 小时前
Longhorn-k8s存储
云原生·容器·kubernetes