Context: kubeadm-managed cluster, etcd as a static pod on the control plane node, using etcdctl v3.
Run this on the control plane node (usually via SSH):
sudo 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 \
snapshot save /tmp/etcd-snapshot.db
ETCDCTL_API=3 is required for snapshot commands./etc/kubernetes/pki/etcd/ are standard for kubeadm./tmp/etcd-snapshot.db to any writable path.Restore the snapshot into a fresh data directory:
sudo ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-snapshot.db \
--data-dir=/var/lib/etcd
sudo mv /var/lib/etcd /var/lib/etcd.broken.$(date +%s)
sudo chown -R etcd:etcd /var/lib/etcd
sudo systemctl restart kubelet
sudo 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
kubectl get nodes
kubectl get pods -A
snapshot save with TLS flags and ETCDCTL_API=3.snapshot restore into /var/lib/etcd.endpoint health.