ETCD集群key超出200w给etcd压力太大,导致集群调度器延迟

发布时间 2023-10-24 00:03:43作者: 百因必有果

背景:

  业务在做测试的时候,突然集群不可用了,无法做出变更了,找到我们平台侧,经过排查,发现controller-manager调度器出现问题,经过查看,调度器不可使用,

处理 方案:

  删除etcd集群的key

       查询etcd集群中的key的数量:

        

#etcd的命令行
etcdctl="/opt/etcd/bin/etcdctl --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --endpoints=https://127.0.0.1:2379"
#把etcd集群key的数据写入到k8s集群中
$etcdctl get /registry/events --prefix --keys-only --command-timeout=100s | grep registry > keys.txt
#逐个查询每个namespaces 下key 列表
kubectl get namespaces -A  | grep Active | awk '$0=$1' > namespaces.txt
# 查询
for ns in `cat namespaces.txt`;do $etcdctl get /registry/events/$ns --prefix --keys-only --command-timeout=100s | grep registry ;done > keys.txt 
# sed -i '/^$/d' keys.txt
# 分析key 数量,"/"$2"/"$3"/"$4 可根据结果调整
awk -F \/ '{keys["/"$2"/"$3"/"$4]+=1}END{for(key in keys)print key" "keys[key]}' keys.txt  | sort -nk2

  删除key:

    找到要删除key,需要在etcd机器上 执行删除命令:/opt/etcd/bin/etcdctl --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --endpoints=https://127.0.0.1:2379 del ${key}

          因为key太多只能并发删除:

nohup cat key_list | xargs -P 4 -I {} /opt/etcd/bin/etcdctl --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --endpoints=https://127.0.0.1:2379 del {} &
# nohup & 在后台运行,因为key少说也有100w 需要删除最少几个小时,所以需要在后台运行
#-P 4  表示允许同时允许4个进程 
# -I {} 选项用于指定替换的字符串,这样的xargs 会将每一行的内容替换到{}的位置