Defragmentation ETCD
If the ETCD is full, you must defragment it. This can only be done 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.
Command
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 of the pods (etcd-10-XX-XXX-112 as an example) for a list of ETCD cluster members.
Command
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 | |
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
From this output it is clear (IS LEADER=true) that at the moment the leader is the node https://10.XX.XXX.97:2379
2. Defragmentation of ETCD cluster members.
Run the command to defragment the database.
Command
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.
Command
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 the steps in this paragraph with the following ETCD cluster members. We remind you that the leader must be defragmented last!
3. Check and clear triggered NOSPACE alarms.
Check if there are any NOSPACE alarms.
Command
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.
Command
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