跳到主要内容

Deployment 部署

Deployment 是 Kubernetes 中最常用的资源对象,用于管理应用的部署和扩缩容。

什么是 Deployment?

Deployment 为 Pod 和 ReplicaSet 提供声明式更新能力,是管理无状态应用的首选方式。

创建 Deployment

基础 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
# Pod 副本数
replicas: 3

# 选择器
selector:
matchLabels:
app: nginx

# Pod 模板
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80

使用 kubectl 创建

# 使用 YAML 创建
kubectl apply -f deployment.yaml

# 使用命令创建(不推荐用于生产)
kubectl create deployment nginx --image=nginx:1.25 --replicas=3

# 从文件模板生成
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deployment.yaml

Deployment 策略

RollingUpdate(滚动更新)

默认策略,逐步替换旧版本 Pod:

spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 允许超过期望副本数最多1个
maxUnavailable: 0 # 不可用的 Pod 数量(0保证服务不中断)

Recreate(重建)

先删除所有旧 Pod,再创建新 Pod:

spec:
replicas: 3
strategy:
type: Recreate

滚动更新过程:

扩缩容

命令行扩缩容

# 扩容到 5 个副本
kubectl scale deployment nginx-deployment --replicas=5

# 缩容到 2 个副本
kubectl scale deployment nginx-deployment --replicas=2

自动扩缩容(HPA)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
# 创建 HPA
kubectl apply -f hpa.yaml

# 查看 HPA 状态
kubectl get hpa

# 手动触发扩容
kubectl scale deployment nginx-deployment --replicas=5

更新 Deployment

镜像更新

# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.26

# 查看更新状态
kubectl rollout status deployment/nginx-deployment

# 查看历史版本
kubectl rollout history deployment/nginx-deployment

暂停和恢复

# 暂停更新
kubectl rollout pause deployment/nginx-deployment

# 恢复更新
kubectl rollout resume deployment/nginx-deployment

回滚

# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment

# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2

# 查看回滚状态
kubectl rollout status deployment/nginx-deployment

Deployment 生命周期

Deployment 配置详解

完整配置示例

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: production
labels:
app: my-app
version: v1
spec:
replicas: 3
revisionHistoryLimit: 5 # 保留的历史版本数
progressDeadlineSeconds: 600 # 最大等待时间(秒)

selector:
matchLabels:
app: my-app

strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0

template:
metadata:
labels:
app: my-app
version: v1
spec:
# 副本亲和性
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: my-app
topologyKey: kubernetes.io/hostname

containers:
- name: app
image: my-app:v1
imagePullPolicy: Always

ports:
- name: http
containerPort: 8080
protocol: TCP

# 资源配额
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"

# 健康检查
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10

readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5

# 环境变量
env:
- name: APP_ENV
value: "production"

# 卷挂载
volumeMounts:
- name: config
mountPath: /app/config

# 初始化容器
initContainers:
- name: init-db
image: busybox:1.36
command: ['sh', '-c', 'echo Waiting for DB']

# 亲和性
tolerations:
- key: "dedicated"
value: "app"
effect: NoSchedule

# 存储卷
volumes:
- name: config
configMap:
name: app-config

# 终止GracePeriod
terminationGracePeriodSeconds: 30

管理命令

查看 Deployment

# 查看 Deployment
kubectl get deployment

# 查看详细信息
kubectl describe deployment nginx-deployment

# 查看 Pod
kubectl get pods -l app=nginx

# 查看 ReplicaSet
kubectl get replicaset -l app=nginx

更新策略

# 设置更新策略
kubectl patch deployment nginx-deployment \
-p '{"spec":{"strategy":{"type":"Recreate"}}}'

# 设置镜像并记录
kubectl set image deployment/nginx-deployment \
nginx=nginx:1.26 --record=true

调试

# 查看特定版本的详情
kubectl rollout history deployment/nginx-deployment --revision=2

# 查看实时状态
kubectl rollout status -w deployment/nginx-deployment

# 进入 Pod 调试
kubectl exec -it <pod-name> -- /bin/sh

最佳实践

1. 使用合适的副本数

spec:
replicas: 3 # 生产环境至少3个

2. 设置资源限制

resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"

3. 使用探针

livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080

4. 保留历史版本

spec:
revisionHistoryLimit: 5

5. 使用标签管理版本

template:
metadata:
labels:
app: my-app
version: v1.0.0

其他 Controller

ReplicaSet

ReplicaSet 确保指定数量的 Pod 副本运行:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
# ... Pod 模板

StatefulSet

用于有状态应用:

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
# ... Pod 模板
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi

DaemonSet

确保每个节点都运行一个 Pod:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: logging-agent
spec:
selector:
matchLabels:
app: logging
template:
# ... Pod 模板

小结

本章我们学习了:

  1. Deployment 概念:声明式管理 Pod
  2. 创建 Deployment:YAML 配置和命令
  3. 更新策略:RollingUpdate 和 Recreate
  4. 扩缩容:手动和自动(HPA)
  5. 更新和回滚:版本管理
  6. 最佳实践:资源限制、健康检查、历史版本

练习

  1. 创建一个包含 3 个副本的 Deployment
  2. 使用 kubectl 扩缩容
  3. 更新镜像版本并观察滚动更新过程
  4. 回滚到上一个版本

准备好继续学习了吗?点击下一章了解 Service 和网络!