16.2.6 核心组件健康检查与故障处理

核心组件包括 apiserver、etcd、controller-manager、scheduler、kubelet、kube-proxy、CoreDNS 以及容器运行时。健康检查与故障处理遵循“先控制面、后节点面、再业务面”的顺序,结合日志、事件、指标与探针形成闭环。

0. 原理草图(控制面与节点面健康链路)

文章图片

1. 健康检查方法与关键指标(含命令示例)

  • kube-apiserver
  • 健康端点:/healthz/readyz
  • 关键指标:请求延迟、QPS、5xx 比例、认证鉴权失败次数
  • 示例命令:
    ```bash
    # 1) 通过 apiserver 进行健康检查(readyz 更严格)
    kubectl get --raw='/readyz?verbose'

    2) 获取 apiserver 组件状态#

    kubectl get componentstatuses
    `` - 预期效果:readyz输出ok或每个子检查均为ok;组件状态为Healthy`

  • etcd

  • 健康检查:etcdctl endpoint health
  • 关键指标:leader 变化、wal fsync 延迟、db size、延迟飙升
  • 示例命令(含安装与证书):
    ```bash
    # 安装 etcdctl(以二进制为例)
    ETCD_VER=v3.5.10
    wget -q https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz
    tar -xzf etcd-${ETCD_VER}-linux-amd64.tar.gz
    sudo mv etcd-${ETCD_VER}-linux-amd64/etcdctl /usr/local/bin/

    指定证书进行健康检查(kubeadm 默认路径)#

    export ETCDCTL_API=3
    etcdctl --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 \
    endpoint health
    `` - 预期效果:输出is healthy,无timeout`

  • controller-manager / scheduler

  • 健康端点:/healthz
  • 关键指标:reconcile 速率、调度失败/延迟
  • 示例命令:
    bash # 通过本地端口或 apiserver 代理查看 kubectl -n kube-system get pods -o wide | grep kube-controller-manager kubectl -n kube-system get pods -o wide | grep kube-scheduler
  • 预期效果:Pod 状态为 Running,重启次数不异常

  • kubelet

  • 健康端点:https://<node>:10250/healthz
  • 关键指标:节点 NotReady、Pod 启动失败率、镜像拉取失败
  • 示例命令:
    ```bash
    # 查看节点状态与条件
    kubectl get nodes -o wide
    kubectl describe node | sed -n '/Conditions:/,/Addresses:/p'

    本机检查 kubelet 服务状态#

    systemctl status kubelet --no-pager
    `` - 预期效果:Ready=True、无DiskPressure/MemoryPressure`

  • kube-proxy / CoreDNS

  • 关键指标:服务访问异常、DNS 解析失败率、iptables/ipvs 规则异常
  • 示例命令:
    ```bash
    # CoreDNS 日志
    kubectl -n kube-system logs -l k8s-app=kube-dns --tail=50

    kube-proxy 模式确认#

    kubectl -n kube-system get cm kube-proxy -o yaml | grep mode
    ```
    - 预期效果:DNS 解析正常、kube-proxy 模式符合预期(iptables/ipvs)

  • 容器运行时(containerd)

  • 关键指标:runtime socket 可用性、镜像拉取/解压失败、容器创建延迟
  • 示例命令:
    ```bash
    # 检查 containerd 服务
    systemctl status containerd --no-pager

    使用 crictl 进行运行时健康检查(需安装)#

    安装 crictl#

    VER=v1.28.0
    wget -q https://github.com/kubernetes-sigs/cri-tools/releases/download/${VER}/crictl-${VER}-linux-amd64.tar.gz
    tar -xzf crictl-${VER}-linux-amd64.tar.gz
    sudo mv crictl /usr/local/bin/

    查看运行时与镜像#

    crictl info
    crictl images
    `` - 预期效果:crictl info` 输出正常、镜像列表可见


  • 2. 常见故障现象与排查路径(含命令解释与结果)

  • apiserver 不可用
  • 现象:所有 kubectl 命令失败、控制面组件报错
  • 排查路径(示例):
    bash # 1) 确认 apiserver 静态 Pod ls -l /etc/kubernetes/manifests/ # 2) 查看 apiserver 容器日志 kubectl -n kube-system logs -l component=kube-apiserver --tail=200 # 3) 确认证书有效期 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates # 4) 验证 etcd 连接是否超时 curl -k https://127.0.0.1:6443/healthz
  • 预期效果:healthz 返回 ok;证书未过期

  • etcd 不健康

  • 现象:apiserver 频繁超时、集群写入失败
  • 排查路径:
    ```bash
    # 1) 检查 etcd 健康
    export ETCDCTL_API=3
    etcdctl --endpoints=https://127.0.0.1:2379 \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt \
    --cert=/etc/kubernetes/pki/etcd/peer.crt \
    --key=/etc/kubernetes/pki/etcd/peer.key \
    endpoint status -w table

    2) 查看磁盘压力与 IOPS#

    iostat -xm 1 3
    df -h /var/lib/etcd
    `` - 预期效果:endpoint status` 显示 leader 正常、延迟无异常

  • 节点 NotReady

  • 现象:Pod 驱逐、调度失败
  • 排查路径:
    ```bash
    # 1) 查看节点条件与事件
    kubectl describe node

    2) 查看 kubelet 日志#

    journalctl -u kubelet -n 200 --no-pager

    3) 检查 CNI 与容器运行时#

    ls /etc/cni/net.d/
    crictl ps -a | head
    `` - 预期效果:Ready=True,无NetworkUnavailable`

  • Pod 无法启动或反复重启

  • 现象:CrashLoopBackOff、ImagePullBackOff
  • 排查路径:
    ```bash
    # 1) 查看 Pod 事件与状态
    kubectl describe pod -n

    2) 查看容器日志(确认退出原因)#

    kubectl logs -n --previous
    ```
    - 预期效果:找到具体错误(镜像、探针、权限或资源)
  • 服务访问异常(ClusterIP/NodePort)

  • 现象:服务不可达、DNS 解析失败
  • 排查路径:
    ```bash
    # 1) DNS 测试
    kubectl run dns-test --image=busybox:1.36 -it --rm -- sh
    # 在 Pod 中执行:
    nslookup kubernetes.default

    2) kube-proxy 规则抽查(iptables 模式)#

    sudo iptables -t nat -L | grep KUBE-SVC | head
    ```
    - 预期效果:DNS 返回 IP;iptables 规则存在


  • 3. 典型故障处理流程(步骤 + 命令)

    1. 确认范围
      bash # 核心组件是否普遍异常 kubectl get pods -A | grep -E "kube-system|coredns|kube-proxy"

    2. 查看事件与状态
      bash kubectl get events -A --sort-by=.lastTimestamp | tail -n 20

    3. 查看核心日志
      bash journalctl -u kubelet -n 200 --no-pager kubectl -n kube-system logs -l component=kube-apiserver --tail=100 kubectl -n kube-system logs -l k8s-app=kube-dns --tail=100

    4. 恢复策略
      ```bash
      # 重启 kubelet(节点级异常)
      sudo systemctl restart kubelet

    # 重新生成证书(示例:kubeadm 管理)
    sudo kubeadm certs check-expiration
    sudo kubeadm certs renew all
    sudo systemctl restart kubelet

    # etcd 快照恢复(示例)
    export ETCDCTL_API=3
    etcdctl snapshot save /backup/etcd-$(date +%F).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
    ```

    1. 验证与回归
      bash kubectl get nodes kubectl get pods -A | grep -E "Running|Completed" kubectl get --raw='/readyz?verbose'

    4. 高危场景与预防策略(含可执行方案)

    • 证书过期
    • 预防:定期检查并续期
      bash kubeadm certs check-expiration
    • 磁盘压力
    • 预防:清理镜像与日志
      bash # 清理未使用镜像(containerd) crictl rmi --prune journalctl --vacuum-time=7d
    • etcd 膨胀
    • 预防:压缩与碎片整理
      ```bash
      export ETCDCTL_API=3
      etcdctl --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 \
      compact $(etcdctl endpoint status -w json | jq -r '.[0].Status.header.revision')

      etcdctl --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 \
      defrag
      - **时间漂移** - 预防:统一 NTPbash
      timedatectl status
      chronyc sources -v
      ```


    5. 日常巡检要点(基础 + 命令)

    # 1) 控制面健康
    kubectl get --raw='/readyz?verbose'
    
    # 2) etcd 健康
    ETCDCTL_API=3 etcdctl --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 \
      endpoint health
    
    # 3) 节点 Ready
    kubectl get nodes
    
    # 4) CoreDNS 解析测试
    kubectl run dns-test --image=busybox:1.36 -it --rm -- sh -c "nslookup kubernetes.default"
    

    6. 练习(含明确目标与预期)
    1. 练习1:模拟 CoreDNS 异常并定位
    - 操作:将 CoreDNS 副本数改为 0
    bash kubectl -n kube-system scale deployment coredns --replicas=0
    - 预期:DNS 解析失败;恢复后解析正常
    bash kubectl -n kube-system scale deployment coredns --replicas=2

    1. 练习2:模拟节点 NotReady
      - 操作:停止 kubelet
      bash sudo systemctl stop kubelet
      - 预期:节点变为 NotReady;恢复后 Ready
      bash sudo systemctl start kubelet

    2. 练习3:检查并续期证书
      - 操作:
      bash kubeadm certs check-expiration kubeadm certs renew all sudo systemctl restart kubelet
      - 预期:证书有效期更新,apiserver 正常响应