故障现象

[root@jenkins k8s_yaml]# kubectl get pods -n aqsc
Error from server: etcdserver: request timed out
  • 1.
  • 2.

Kubernetes 集群执行 kubectl get pods 时返回 etcdserver: request timed out 错误,表明 APIServer 无法与 etcd 集群正常通信。此问题通常由 etcd 集群故障、网络问题或资源瓶颈引发。以下是系统化的排查与解决方案:

一、排查

1.首先开始检查etcd集群是否异常
[root@jenkins k8s_yaml]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE   ERROR
scheduler            Healthy   ok        
controller-manager   Healthy   ok        
etcd-0               Healthy   ok
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
2.切换etcd服务器
# 以表格形式安全地查询指定 etcd 集群的成员信息

ETCDCTL_API=3 etcdctl   --endpoints=https://xx.xx.xx.xx:2379,https://xx.xx.xx.xx:2379,https://xx.xx.xx.xx:2379   --cacert=/etc/kubernetes/ssl/ca.pem   --cert=/etc/kubernetes/ssl/etcd.pem   --key=/etc/kubernetes/ssl/etcd-key.pem   member list --write-out=table

ETCDCTL_API=3
# 指定 API 版本
--endpoints
# 集群访问地址 指定三个 etcd 节点的客户端通信地址(端口 2379),支持高可用连接
--cacert
# TLS 根证书
--cert--key
# 客户端证书与私钥
member list
#查询 etcd 集群的成员列表,包括每个成员的 ID、状态、名称、网络地址等关键信息
--write-out=table
#指定输出格式为表格
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
#以表格形式安全地查询 etcd 集群中所有节点的详细状态信息

ETCDCTL_API=3 etcdctl   --endpoints=https://xx.xx.xx.xx:2379,https://xx.xx.xx.xx:2379,https://xx.xx.xx.xx:2379   --cacert=/etc/kubernetes/ssl/ca.pem   --cert=/etc/kubernetes/ssl/etcd.pem   --key=/etc/kubernetes/ssl/etcd-key.pem   endpoint status --cluster --write-out=table

ETCDCTL_API=3
# 指定 API 版本
--endpoints
# 集群访问地址 指定三个 etcd 节点的客户端通信地址(端口 2379),支持高可用连接
--cacert
# TLS 根证书
--cert--key
# 客户端证书与私钥
endpoint status --cluster
# 核心命令功能    查询集群所有节点的状态
--write-out=table
# 输出格式 以表格形式展示结果
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

从etcdserver: request timed ot到毫秒响应:三节点集群SSD存储迁移全记录_kubernetes

查询结果为正常

3.检查是否有慢查询

apply request took too long

journalctl-u etcd | grep "apply request took too long"
  • 1.

从etcdserver: request timed ot到毫秒响应:三节点集群SSD存储迁移全记录_存储_02

sudo yum install sysstat -y
  • 1.
iostat -xm 1 | grep -E "await|sda"
  • 1.

从etcdserver: request timed ot到毫秒响应:三节点集群SSD存储迁移全记录_ssd_03

二、更换ssd

etcd-1操作
1.增加ssd硬盘
# 进行关机操作
[root@k8s-etcd1 ~]# init 0

#然后进行增加ssd硬盘

# 开机查看增加的ssd
[root@k8s-etcd1 ~]# lsblk 
NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                   8:0    0   400G  0 disk 
├─sda1                8:1    0    1G  0 part /boot
└─sda2                8:2    0   390G  0 part 
  ├─klas-root       253:0    0   350G  0 lvm  /
  └─klas-swap       253:1    0    4G  0 lvm  
sdb                   8:16   0  30T  0 disk 
└─sdb1                8:17   0  30T  0 part 
  └─vg_data-lv_data 253:2    0  30T  0 lvm  /data
sdc                   8:32   0  30T  0 disk 
sr0                  11:0    1 1024M  0 rom
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
2.parted分区
parted /dev/sdc mklabel gpt              # 创建 GPT 分区表
parted /dev/sdc mkpart primary 0% 100%   # 使用整个磁盘创建一个主分区
parted /dev/sdc set 1 lvm on             # 标记分区为 LVM 类型(关键!)
parted /dev/sdc print                    # 验证分区信息
  • 1.
  • 2.
  • 3.
  • 4.
3.使用lvm模式
# 创建物理卷(PV)
pvcreate /dev/sdc1
# 将 PV 加入卷组(VG)
vgcreate vg_etcd_ssd /dev/sdc1   # 创建新卷组 vg_new

# 创建或扩展逻辑卷(LV)
lvcreate -n lv_etcd  -l 100%FREE vg_etcd_ssd  # 占用全部空间
mkfs.xfs /dev/vg_etcd_ssd/lv_etcd             # 格式化(推荐 XFS 或 ext4)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
4.进行更换etcd存储
[root@k8s-etcd1 ~]# systemctl stop etcd
[root@k8s-etcd1 ~]# mkdir /data-bak/
[root@k8s-etcd1 ~]# mv /data/etcd /data-bak/
[root@k8s-etcd1 ~]# mv /data/etcd_wal/ /data-bak/
[root@k8s-etcd1 ~]# umount /data 
[root@k8s-etcd1 ~]# mount /dev/vg_etcd_ssd/lv_etcd /data # 挂载
[root@k8s-etcd1 ~]# cp -a /data-bak/etcd /data/
[root@k8s-etcd1 ~]# cp -a /data-bak/etcd_wal/ /data/
[root@k8s-etcd1 ~]# systemctl start etcd.service
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
5.验证
[root@k8s-etcd1 ~]# systemctl status etcd.service 
● etcd.service - Etcd Server
   Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2025-06-26 13:40:15 CST; 2min 41s ago
     Docs: https://github.com/coreos
 Main PID: 2872 (etcd)
    Tasks: 8
   Memory: 126.4M
   CGroup: /system.slice/etcd.service
           └─2872 /opt/kube/bin/etcd --name=etcd-10.10.8.13 --cert-file=/etc/kubernetes/ssl/etcd.pem --key-file=/etc/kubernetes/ssl/etcd-key.pem --peer-cert-file=/etc>
.....
.....
.....
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
6.固化挂载
修改/etc/fstab文件
[root@k8s-10-10-8-13 ~]# vim /etc/fstab
/dev/vg_etcd_ssd/lv_etcd        /data   xfs     defaults        0 0
  • 1.
  • 2.
7.调优
# 调整I/O调度策略
# 临时生效
echo deadline > /sys/block/sda/queue/scheduler

# 永久生效(GRUB配置)
grubby --update-kernel=ALL --args="elevator=deadline"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
# 提升进程I/O优先级
# 赋予etcd最高实时优先级(减少阻塞)
ionice -c2 -n0 -p $(pgrep etcd)
  • 1.
  • 2.
  • 3.
三台机器做同样操作,停一台做好了启动运行后,再停第二台,最终三台完成

三、验证

kubectl可以正常使用了
[root@master-01 ~]# kubectl get nodes
NAME        STATUS                     ROLES    AGE   VERSION
master-01   Ready,SchedulingDisabled   master   60d   v1.30.1
master-02   Ready,SchedulingDisabled   master   60d   v1.30.1
master-03   Ready,SchedulingDisabled   master   60d   v1.30.1
.....
.....
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.