Kubernetes Deployment详解
Kubernetes Deployment详解
Deployment概述
Deployment提供声明式的Pod更新,支持滚动更新和回滚。
Deployment配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
# 更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多多出的Pod数
maxUnavailable: 0 # 最多少的Pod数
# Pod模板
template:
metadata:
labels:
app: myapp
version: v1
spec:
containers:
- name: myapp
image: myapp:v1
ports:
- containerPort: 8080
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
更新策略
RollingUpdate
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25% # 滚动更新时最多增加25%的Pod
maxUnavailable: 25% # 滚动更新时最多减少25%的Pod
Recreate
strategy:
type: Recreate # 先删除旧Pod,再创建新Pod
更新应用
更新镜像
# 更新镜像
kubectl set image deployment/myapp myapp=myapp:v2
# 或修改yaml后应用
kubectl apply -f deployment.yaml
查看更新状态
# 查看滚动更新状态
kubectl rollout status deployment/myapp
# 查看更新历史
kubectl rollout history deployment/myapp
# 查看特定版本详情
kubectl rollout history deployment/myapp --revision=2
回滚操作
# 回滚到上一版本
kubectl rollout undo deployment/myapp
# 回滚到特定版本
kubectl rollout undo deployment/myapp --to-revision=2
# 暂停/恢复滚动更新
kubectl rollout pause deployment/myapp
kubectl rollout resume deployment/myapp
自动伸缩
水平Pod伸缩(HPA)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
# 创建HPA
kubectl autoscale deployment myapp --min=2 --max=10 --cpu-percent=70
# 查看HPA
kubectl get hpa
实践:零停机更新
# v1版本
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: myapp
version: v1
spec:
containers:
- name: myapp
image: myapp:v1
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
# 执行更新
kubectl apply -f deployment-v2.yaml
# 监控更新过程
kubectl rollout status deployment/myapp
# 如果有问题,立即回滚
kubectl rollout undo deployment/myapp
Deployment调试
# 查看Pod状态
kubectl get pods -l app=myapp
# 查看Pod事件
kubectl describe pod pod_name
# 查看Deployment状态
kubectl describe deployment myapp
# 查看ReplicaSet
kubectl get rs
总结
Deployment是Kubernetes中最常用的 workload。掌握其更新策略和回滚机制,可以实现应用的安全、零停机更新。