29·Deployment进阶

查看部署状态

kubernetesdeploymentstatus

查看部署状态

学习目标

  1. 掌握查看 Deployment 状态的各种方法
  2. 理解状态字段的含义
  3. 掌握调试部署问题的技巧

核心概念

基本状态查看

# 查看 Deployment 列表
$ kubectl get deployments
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           5m

# 查看详细信息
$ kubectl get deployment nginx-deployment -o wide

# 查看 YAML 配置
$ kubectl get deployment nginx-deployment -o yaml

状态字段说明

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           5m

READY:     当前就绪 Pod 数 / 期望 Pod 数
UP-TO-DATE: 已更新到最新版本的 Pod 数
AVAILABLE:  可用的 Pod 数(就绪且运行足够长时间)
AGE:        Deployment 创建时间

查看详情

# 查看 Deployment 详情
$ kubectl describe deployment nginx-deployment

# 输出包含:
# - 基本信息
# - 标签
# - 副本数
# - 更新策略
# - Pod 模板
# - Conditions(状态条件)
# - Events(事件)

Conditions 状态

$ kubectl describe deployment nginx-deployment

Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
Condition说明
Available是否有足够可用 Pod
Progressing是否正在更新

查看更新状态

# 实时查看更新进度
$ kubectl rollout status deployment/nginx-deployment

# 输出:
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out

查看 ReplicaSet

# 查看 ReplicaSet
$ kubectl get replicasets
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-5d8f4c4c5    3         3         3       5m

# 查看 Deployment 关联的 ReplicaSet
$ kubectl get rs -l app=nginx

# 查看详情
$ kubectl describe rs nginx-deployment-5d8f4c4c5

查看 Pod 状态

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

# 查看 Pod 详情
$ kubectl describe pod <pod-name>

# 查看 Pod 日志
$ kubectl logs <pod-name>

# 查看 Pod 事件
$ kubectl get events --field-selector involvedObject.name=<pod-name>

使用 jsonpath 查看特定字段

# 查看期望副本数
$ kubectl get deployment nginx-deployment -o jsonpath='{.spec.replicas}'

# 查看当前就绪副本数
$ kubectl get deployment nginx-deployment -o jsonpath='{.status.readyReplicas}'

# 查看更新策略
$ kubectl get deployment nginx-deployment -o jsonpath='{.spec.strategy.type}'

# 查看镜像版本
$ kubectl get deployment nginx-deployment -o jsonpath='{.spec.template.spec.containers[0].image}'

使用 jq 格式化输出

# 查看所有 Deployment 的状态
$ kubectl get deployments -o json | jq '.items[] | {name: .metadata.name, ready: .status.readyReplicas, desired: .spec.replicas}'

# 查看未就绪的 Deployment
$ kubectl get deployments -o json | jq '.items[] | select(.status.readyReplicas < .spec.replicas) | .metadata.name'

监控状态变化

# 实时监控 Pod 变化
$ kubectl get pods -w

# 实时监控 Deployment 变化
$ kubectl get deployments -w

# 监控特定 Deployment
$ kubectl get deployment nginx-deployment -w

查看历史版本

# 查看更新历史
$ kubectl rollout history deployment/nginx-deployment

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

# 查看当前版本
$ kubectl get deployment nginx-deployment -o jsonpath='{.metadata.annotations.deployment\.kubernetes\.io/revision}'

实践练习

练习 1:状态检查

# 1. 创建 Deployment
$ kubectl create deployment web --image=nginx:1.24 --replicas=3

# 2. 查看基本状态
$ kubectl get deployment web

# 3. 查看详细信息
$ kubectl describe deployment web

# 4. 查看 ReplicaSet
$ kubectl get rs

# 5. 查看 Pod
$ kubectl get pods

练习 2:监控更新过程

# 1. 开始更新
$ kubectl set image deployment/web nginx=nginx:1.25

# 2. 实时监控
$ kubectl rollout status deployment/web

# 3. 同时在另一个终端查看 Pod
$ kubectl get pods -w

# 4. 查看更新历史
$ kubectl rollout history deployment/web

练习 3:调试问题

# 1. 创建一个有问题的 Deployment
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: broken-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: broken
  template:
    metadata:
      labels:
        app: broken
    spec:
      containers:
      - name: app
        image: nginx:nonexistent-tag
EOF

# 2. 查看状态
$ kubectl get deployment broken-app

# 3. 查看 Pod 状态
$ kubectl get pods -l app=broken

# 4. 查看 Pod 详情
$ kubectl describe pod <pod-name>

# 5. 查看事件
$ kubectl get events --field-selector involvedObject.name=broken-app

常见问题

1. READY 显示 0/3

# 可能原因:
# - Pod 启动失败
# - 就绪探针失败
# - 资源不足

# 检查方法:
$ kubectl get pods
$ kubectl describe pod <pod-name>
$ kubectl logs <pod-name>

2. UP-TO-DATE 不等于 READY

# 说明更新正在进行中
# 可能原因:
# - 新 Pod 启动慢
# - 就绪探针未通过
# - minReadySeconds 未到

# 查看更新状态
$ kubectl rollout status deployment/web

3. Deployment 一直 Progressing

# 查看 Conditions
$ kubectl describe deployment web

# 可能原因:
# - 新版本无法启动
# - 就绪探针一直失败
# - 资源不足

# 查看事件
$ kubectl get events --field-selector involvedObject.name=web

小结

要点说明
基本状态kubectl get deployment
详细信息kubectl describe deployment
更新状态kubectl rollout status
查看历史kubectl rollout history
READY当前就绪 / 期望数量
ConditionsAvailable 和 Progressing
调试describe + logs + events

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「删除 Deployment」 以巩固所学知识。