Deployment 管理
概述
Deployment 滚动更新、回滚、扩缩容等技能。
基础操作
查看 Deployment
列出 Deployment
kubectl get deployments kubectl get deploy -o wide kubectl get deploy -n namespace
详细信息
kubectl describe deploy deployment-name kubectl get deploy deployment-name -o yaml
创建 Deployment
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.20 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "100m" limits: memory: "128Mi" cpu: "200m"
kubectl apply -f deployment.yaml kubectl create deployment nginx --image=nginx:1.20 --replicas=3
删除 Deployment
kubectl delete deploy deployment-name kubectl delete -f deployment.yaml
扩缩容
手动扩缩容
kubectl scale deploy deployment-name --replicas=5
自动扩缩容 (HPA)
kubectl autoscale deploy deployment-name --min=2 --max=10 --cpu-percent=80
查看 HPA
kubectl get hpa kubectl describe hpa deployment-name
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: 80
- type: Resource resource: name: memory target: type: Utilization averageUtilization: 80
滚动更新
更新策略配置
spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% # 最多超出期望副本数 maxUnavailable: 25% # 最多不可用副本数
执行更新
更新镜像
kubectl set image deploy/deployment-name container-name=nginx:1.21
更新环境变量
kubectl set env deploy/deployment-name ENV_VAR=value
更新资源限制
kubectl set resources deploy/deployment-name -c container-name --limits=cpu=200m,memory=256Mi
应用配置文件更新
kubectl apply -f deployment.yaml
记录更新原因
kubectl set image deploy/deployment-name container-name=nginx:1.21 --record
查看更新状态
查看滚动更新状态
kubectl rollout status deploy/deployment-name
查看更新历史
kubectl rollout history deploy/deployment-name kubectl rollout history deploy/deployment-name --revision=2
暂停/恢复更新
kubectl rollout pause deploy/deployment-name kubectl rollout resume deploy/deployment-name
回滚
回滚到上一版本
kubectl rollout undo deploy/deployment-name
回滚到指定版本
kubectl rollout undo deploy/deployment-name --to-revision=2
查看回滚状态
kubectl rollout status deploy/deployment-name
高级配置
健康检查
spec: template: spec: containers: - name: app livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 15 periodSeconds: 10 failureThreshold: 3 readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 5 startupProbe: httpGet: path: /startup port: 8080 failureThreshold: 30 periodSeconds: 10
亲和性配置
spec: template: spec: affinity: # Pod 反亲和(分散部署) podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app: nginx topologyKey: kubernetes.io/hostname # 节点亲和 nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-type operator: In values: - worker
容忍度
spec: template: spec: tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule"
常见场景
场景 1:蓝绿部署
创建新版本 Deployment
kubectl apply -f deployment-v2.yaml
切换 Service 到新版本
kubectl patch service my-service -p '{"spec":{"selector":{"version":"v2"}}}'
验证后删除旧版本
kubectl delete deploy deployment-v1
场景 2:金丝雀发布
创建金丝雀 Deployment(少量副本)
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-canary spec: replicas: 1 selector: matchLabels: app: nginx track: canary template: metadata: labels: app: nginx track: canary spec: containers: - name: nginx image: nginx:1.21
场景 3:批量重启 Pod
触发滚动重启
kubectl rollout restart deploy/deployment-name
或添加注解触发更新
kubectl patch deploy deployment-name -p '{"spec":{"template":{"metadata":{"annotations":{"date":"'$(date +%s)'"}}}}}'
场景 4:查看 Pod 分布
查看 Pod 所在节点
kubectl get pods -l app=nginx -o wide
按节点统计
kubectl get pods -l app=nginx -o jsonpath='{range .items[*]}{.spec.nodeName}{"\n"}{end}' | sort | uniq -c
故障排查
问题 排查方法
更新卡住 kubectl rollout status , 检查 Pod 状态
Pod 无法调度 kubectl describe pod , 检查资源和亲和性
更新后服务异常 检查健康检查配置、回滚
HPA 不生效 检查 metrics-server、资源配置
查看 Deployment 事件
kubectl describe deploy deployment-name | grep -A 20 Events
查看 ReplicaSet
kubectl get rs -l app=nginx kubectl describe rs rs-name