ETCD defragmentation

Defragment etcd members from the console; defragment the leader last.

If etcd runs out of space, defragment it from the console.

1. Determining the ETCD leader in the cluster

This must be done first, since the leader must be defragmented last!

First get a list of ETCD pods.

kubectl -n kube-system get pod -l component=etcd -o wide
Output example
NAME                 READY   STATUS    RESTARTS   AGE     IP              NODE            NOMINATED NODE   READINESS GATES
etcd-10-XX-XXX-112   1/1     Running   0          4h17m   10.XX.XXX.112   10-XX-XXX-112   <none>           <none>
etcd-10-XX-XXX-144   1/1     Running   0          4h17m   10.XX.XXX.144   10-XX-XXX-144   <none>           <none>
etcd-10-XX-XXX-97    1/1     Running   0          4h17m   10.XX.XXX.97    10-XX-XXX-97    <none>           <none>

Contact any pod (for example, etcd-10-XX-XXX-112) to list etcd cluster members.

kubectl -n kube-system exec -it etcd-10-XX-XXX-112 -- etcdctl \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  endpoint status --cluster -w table
Output example
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|          ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://10.XX.XXX.144:2379 | 9b99fe49341767e1 |   3.5.9 |   84 MB |     false |      false |         2 |     182220 |             182220 |        |
|  https://10.XX.XXX.97:2379 | c27fc518bba10abd |   3.5.9 |   84 MB |      true |      false |         2 |     182222 |             182222 |        |
| https://10.XX.XXX.112:2379 | e6fa42dc23d4ac7d |   3.5.9 |   85 MB |     false |      false |         2 |     182222 |             182222 |        |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

The leader is https://10.XX.XXX.97:2379 (IS LEADER=true).

2. Defragment etcd members

Run the command to defragment the database.

kubectl -n kube-system exec -it etcd-10-XX-XXX-112 -- etcdctl \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --command-timeout=30s --endpoints=https://localhost:2379 defrag
Output example
Finished defragmenting etcd member[https://localhost:2379]

If a timeout error occurs, increase the value of –command-timeout until the command executes successfully.

Make sure the database size is reduced.

kubectl -n kube-system exec -it etcd-10-XX-XXX-112 -- etcdctl \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  endpoint status --cluster -w table
Output example
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|          ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://10.XX.XXX.144:2379 | 9b99fe49341767e1 |   3.5.9 |   84 MB |     false |      false |         2 |     198808 |             198808 |        |
|  https://10.XX.XXX.97:2379 | c27fc518bba10abd |   3.5.9 |   84 MB |      true |      false |         2 |     198808 |             198808 |        |
| https://10.XX.XXX.112:2379 | e6fa42dc23d4ac7d |   3.5.9 |   42 MB |     false |      false |         2 |     198808 |             198808 |        |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

Initially, the database on node 10.XX.XXX.112 was 85 MB, but has now decreased to 42 MB.

After defragmenting the database, it is recommended to wait at least one minute so that the etcd module can recover.

Repeat for the remaining members. Defragment the leader last.

3. Check and clear NOSPACE alarms

Check if there are any NOSPACE alarms.

kubectl -n kube-system exec -it etcd-10-XX-XXX-112 -- etcdctl \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  alarm list
Output example
memberID:12345678912345678912 alarm:NOSPACE

Reset alarms.

kubectl -n kube-system exec -it etcd-10-XX-XXX-112 -- etcdctl \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  alarm disarm