跳到主要内容
EN

Kubernetes 运维与排障

12 分钟阅读

常见故障模式

K8s 故障通常遵循特定的模式,快速识别模式是高效排障的关键。

Pod 级别故障

状态 原因 排查方向
ImagePullBackOff 镜像拉取失败 检查镜像名、凭证、网络
CrashLoopBackOff 容器启动后崩溃 查看容器日志、资源限制
OOMKilled 内存不足被杀 增大 limits 或优化内存使用
Pending 无法调度 检查资源、亲和性、PVC
Completed 主进程正常退出 检查是否应为长时间运行

节点级别故障

状态 原因 排查方向
NotReady kubelet 异常 检查 kubelet 日志和证书
DiskPressure 磁盘压力 清理镜像和日志
MemoryPressure 内存压力 驱逐低优先级 Pod
PIDPressure 进程数过多 检查是否有进程泄漏

排障决策树

面对 K8s 故障,按以下流程逐步排查:

graph TD
    Start[故障发生] --> Q1{Pod 状态?}
    Q1 -->|Pending| A1[检查资源请求与节点容量]
    Q1 -->|CrashLoopBackOff| A2[查看容器日志和事件]
    Q1 -->|ImagePullBackOff| A3[检查镜像和拉取凭证]
    Q1 -->|Running 但异常| Q2{服务可达?}
    A1 --> Fix1[调整资源/添加节点/修改亲和性]
    A2 --> Fix2[修复应用 Bug/调整探针/增加资源]
    A3 --> Fix3[修正镜像名/创建 imagePullSecrets]
    Q2 -->|不可达| A4[检查 Service 和 Endpoints]
    Q2 -->|可达但错误| A5[检查应用日志和配置]
    A4 --> Fix4[修复 selector/检查 NetworkPolicy]
    A5 --> Fix5[检查 ConfigMap/Secret/环境变量]

排障工具链

基础命令速查

# === Pod 排障 ===
kubectl get pods -A -o wide                    # 全局 Pod 状态
kubectl describe pod <name>                    # 事件和状态详情
kubectl logs <pod> -c <container> --previous   # 上一次崩溃的日志
kubectl logs <pod> --all-containers            # 所有容器日志
kubectl exec -it <pod> -- /bin/sh              # 进入容器

# === 网络排障 ===
kubectl get endpoints <service>                # Service 后端 Pod
kubectl get networkpolicies -A                 # 网络策略
kubectl run tmp --image=busybox --rm -it -- wget -qO- http://svc:80  # 临时测试

# === 节点排障 ===
kubectl describe node <name>                   # 节点条件和资源
kubectl top nodes                              # 资源使用率
kubectl get events --field-selector involvedObject.kind=Node  # 节点事件

# === 集群排障 ===
kubectl get componentstatuses                  # 组件健康状态
kubectl get apiservices                        # API 服务状态

临时诊断 Pod

快速创建诊断工具 Pod:

# 网络诊断
kubectl run nettool --image=nicolaka/netshoot --rm -it -- bash

# 在诊断 Pod 中
nslookup api-service.production.svc.cluster.local
curl -v http://api-service:8080/health
traceroute db-service

日志聚合查询

# 使用 stern 并行查看多 Pod 日志
stern "app=api" -n production --since 1h

# 使用 kubectl 插件 kubectl-logs
kubectl logs -l app=api -n production --since=1h --tail=100

集群运维

证书管理

K8s 集群证书默认有效期 1 年,需定期轮换:

# 检查证书过期时间
kubeadm certs check-expiration

# 续签所有证书
kubeadm certs renew all

# 重启控制面组件使新证书生效
docker restart $(docker ps | grep kube- | awk '{print $1}')

etcd 备份与恢复

etcd 是集群状态的核心,必须定期备份:

# 备份 etcd 快照
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-$(date +%Y%m%d).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 查看快照状态
ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-20260501.db --write-table

# 恢复(在所有 etcd 节点执行)
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-20260501.db \
  --data-dir=/var/lib/etcd/restore

节点维护

# 标记节点不可调度
kubectl cordon node-1

# 驱逐节点上的 Pod(维护前)
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data

# 维护完成后恢复
kubectl uncordon node-1

集群升级流程

# 1. 升级 kubeadm
apt-mark unhold kubeadm
apt-get update && apt-get install -y kubeadm=1.29.4-*
apt-mark hold kubeadm

# 2. 验证升级计划
kubeadm upgrade plan

# 3. 升级控制面
kubeadm upgrade apply v1.29.4

# 4. 逐个升级工作节点
kubectl drain node-1 --ignore-daemonsets
apt-get install -y kubelet=1.29.4-* kubectl=1.29.4-*
systemctl restart kubelet
kubectl uncordon node-1

资源配额

ResourceQuota — 命名空间级配额

apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-quota
  namespace: team-a
spec:
  hard:
    requests.cpu: "10"
    requests.memory: 20Gi
    limits.cpu: "20"
    limits.memory: 40Gi
    pods: "50"
    services: "10"
    persistentvolumeclaims: "20"

LimitRange — 默认资源限制

apiVersion: v1
kind: LimitRange
metadata:
  name: default-limits
  namespace: team-a
spec:
  limits:
    - type: Container
      default:           # 默认 limits
        cpu: 500m
        memory: 256Mi
      defaultRequest:    # �定义 requests
        cpu: 100m
        memory: 128Mi
      max:               # 最大允许值
        cpu: "2"
        memory: 2Gi
      min:               # 最小允许值
        cpu: 50m
        memory: 64Mi

集群监控

监控体系架构

graph TB
    subgraph 数据采集
        NodeExp[Node Exporter]
        KubeState[Kube State Metrics]
        CAdvisor[cAdvisor]
        AppExp[应用 Exporter]
    end
    subgraph 存储与查询
        Prom[Prometheus]
        Thanos[Thanos / VictoriaMetrics]
    end
    subgraph 可视化与告警
        Grafana[Grafana 仪表盘]
        AlertMgr[Alertmanager]
        PagerDuty[PagerDuty / 飞书]
    end
    NodeExp --> Prom
    KubeState --> Prom
    CAdvisor --> Prom
    AppExp --> Prom
    Prom --> Thanos
    Prom --> Grafana
    Prom --> AlertMgr
    AlertMgr --> PagerDuty

关键监控指标

类别 指标 告警阈值建议
Pod kube_pod_container_status_restarts_total > 3 次/10min
Pod kube_pod_status_phase{phase="Pending"} > 5min
节点 node_cpu_seconds_total 利用率 > 85%
节点 node_memory_MemAvailable_bytes 可用 < 10%
节点 node_filesystem_avail_bytes 可用 < 15%
K8s kube_node_status_condition NotReady > 3min
etcd etcd_disk_wal_fsync_duration_seconds P99 > 10ms

必备告警规则

groups:
  - name: k8s-critical
    rules:
      - alert: PodCrashLooping
        expr: rate(kube_pod_container_status_restarts_total[15m]) > 0
        for: 15m
        labels:
          severity: critical
        annotations:
          summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} is crash looping"

      - alert: NodeNotReady
        expr: kube_node_status_condition{condition="Ready",status="true"} == 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Node {{ $labels.node }} is not ready"

      - alert: PVAlmostFull
        expr: |
          (kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes) > 0.85
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "PVC {{ $labels.namespace }}/{{ $labels.persistentvolumeclaim }} is {{ $value | humanizePercentage }} full"

K8s 运维和排障是一项系统性能力。掌握故障模式识别、排障决策树和工具链的使用,结合完善的监控和告警体系,才能在故障发生时快速定位并恢复服务。

编辑此页

评论