在 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 基础部署流程
-
创建 Deployment 配置文件(my-blue.yaml)
-
创建 Service 配置文件(my-blue-service.yaml)
-
应用配置并验证部署结果:
应用部署配置
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。