Kubernetes Deployment:应用部署与更新
Kubernetes Deployment:应用部署与更新
Deployment概述
Deployment是Kubernetes中管理无状态应用的核心对象,提供声明式更新、滚动升级和回滚能力。
创建Deployment
命令行创建
# 基本创建
kubectl create deployment nginx --image=nginx:1.25 --replicas=3
# 指定命名空间
kubectl create deployment nginx --image=nginx:1.25 -n production
# 从YAML创建
kubectl apply -f deployment.yaml
YAML声明式配置
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 15
periodSeconds: 20
更新策略
RollingUpdate(滚动更新)
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多多出1个Pod
maxUnavailable: 0 # 不允许Pod不可用
Recreate(重建)
strategy:
type: Recreate # 先删除所有旧Pod,再创建新Pod
滚动更新
# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
# 查看更新状态
kubectl rollout status deployment/nginx-deployment
# 查看更新历史
kubectl rollout history deployment/nginx-deployment
回滚操作
# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment
# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2
# 查看回滚状态
kubectl rollout status deployment/nginx-deployment
扩缩容
# 手动扩缩容
kubectl scale deployment nginx-deployment --replicas=5
# 自动扩缩容(HPA)
kubectl autoscale deployment nginx-deployment --min=3 --max=10 --cpu-percent=80
# 查看HPA
kubectl get hpa
暂停与恢复
# 暂停Deployment(用于批量修改)
kubectl rollout pause deployment/nginx-deployment
# 执行多次修改
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
kubectl set resources deployment/nginx-deployment -c nginx --limits=cpu=200m,memory=256Mi
# 恢复Deployment(只触发一次更新)
kubectl rollout resume deployment/nginx-deployment
高级配置
容器环境变量
spec:
template:
spec:
containers:
- name: app
env:
- name: APP_ENV
value: "production"
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: db-host
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
卷挂载
spec:
template:
spec:
containers:
- name: app
volumeMounts:
- name: config
mountPath: /app/config
- name: data
mountPath: /app/data
volumes:
- name: config
configMap:
name: app-config
- name: data
persistentVolumeClaim:
claimName: app-data-pvc
节点亲和性
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- zone1
tolerations:
- key: "dedicated"
operator: "Equal"
value: "special"
effect: "NoSchedule"
实践:生产级Deployment
# production-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web-app
version: v1
annotations:
deployment.kubernetes.io/revision: "1"
spec:
replicas: 3
selector:
matchLabels:
app: web-app
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: web-app
version: v1
spec:
terminationGracePeriodSeconds: 60
containers:
- name: web
image: myapp:1.0
ports:
- containerPort: 8080
env:
- name: APP_ENV
value: "production"
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 10"]
常用命令汇总
# 查看Deployment
kubectl get deployments
kubectl get deploy
# 查看详细信息
kubectl describe deployment nginx-deployment
# 查看Pod状态
kubectl get pods -l app=nginx
# 强制更新
kubectl rollout restart deployment/nginx-deployment
# 删除Deployment
kubectl delete deployment nginx-deployment
总结
Deployment是Kubernetes中管理应用部署的核心工具。掌握滚动更新、回滚和扩缩容策略,是实现应用持续交付的关键。