Note_Tech

All technological notes.


Project maintained by simonangel-fong Hosted on GitHub Pages — Theme by mattgraham

Kubernetes Cluster - etcd

Back


etcd



CLI: etcdctl


How it Works - kubectl apply


How it Works - kubectl get


Common commands

kubectl get pods -n kube-system
# NAME                                     READY   STATUS    RESTARTS        AGE
# ...
etcd-docker-desktop                      1/1     Running   124 (41s ago)   147d
# ...

CMD DESC
etcdctl backup  
etcdctl cluster-health  
etcdctl mk  
etcdctl mkdir  
etcdctl set  
CMD DESC
etcdctl snapshot save  
etcdctl endpoint health  
etcdctl get  
etcdctl put  

Starting etcd clusters

Single-node etcd cluster

# PRIVATE_IP is set to your etcd client IP
etcd --listen-client-urls=http://$PRIVATE_IP:2379 --advertise-client-urls=http://$PRIVATE_IP:2379

Multi-node etcd cluster

etcd --listen-client-urls=http://$IP1:2379,http://$IP2:2379,http://$IP3:2379,http://$IP4:2379,http://$IP5:2379 \
  --advertise-client-urls=http://$IP1:2379,http://$IP2:2379,http://$IP3:2379,http://$IP4:2379,http://$IP5:2379

Backing up an etcd cluster


Restoring an etcd cluster


Lab: Install etcdctl

# install
sudo apt install etcd-client

# confirm
etcdctl version
# etcdctl version: 3.4.30
# API version: 3.4

ETCD Deployment Type


Lab: Backup & Restore etcd

Create Resources Before Backup

kubectl create deploy before --image=nginx --replicas=2
# deployment.apps/before created

kubectl get deploy
# NAME     READY   UP-TO-DATE   AVAILABLE   AGE
# before   2/2     2            2           24s

Lab: Backup a Snapshot

sudo cat /etc/kubernetes/manifests/etcd.yaml
# apiVersion: v1
# kind: Pod
# metadata:
#   name: etcd
#   namespace: kube-system
# spec:
#   containers:
#   - command:
#     - etcd
#     - --advertise-client-urls=https://192.168.10.150:2379
#     - --cert-file=/etc/kubernetes/pki/etcd/server.crt
#     - --data-dir=/var/lib/etcd
#     - --key-file=/etc/kubernetes/pki/etcd/server.key
#     - --listen-client-urls=https://127.0.0.1:2379,https://192.168.10.150:2379
#     - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

# backup etcd to /opt/etcd-backup.db
sudo -i 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 /opt/etcd-backup.db
# {"level":"info","ts":1768457316.0622098,"caller":"snapshot/v3_snapshot.go:119","msg":"created temporary db file","path":"/opt/etcd-backup.db.part"}
# {"level":"info","ts":"2026-01-15T01:08:36.065703-0500","caller":"clientv3/maintenance.go:212","msg":"opened snapshot stream; downloading"}
# {"level":"info","ts":1768457316.0657685,"caller":"snapshot/v3_snapshot.go:127","msg":"fetching snapshot","endpoint":"https://127.0.0.1:2379"}
# {"level":"info","ts":"2026-01-15T01:08:36.090634-0500","caller":"clientv3/maintenance.go:220","msg":"completed snapshot read; closing"}
# {"level":"info","ts":1768457316.0953746,"caller":"snapshot/v3_snapshot.go:142","msg":"fetched snapshot","endpoint":"https://127.0.0.1:2379","size":"2.7 MB","took":0.033098198}
# {"level":"info","ts":1768457316.0954528,"caller":"snapshot/v3_snapshot.go:152","msg":"saved","path":"/opt/etcd-backup.db"}
# Snapshot saved at /opt/etcd-backup.db

# confirm
export ETCDCTL_API=3
sudo etcdctl --write-out=table snapshot status /opt/etcd-backup.db
# +----------+----------+------------+------------+
# |   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
# +----------+----------+------------+------------+
# | c3a39352 |     1744 |       1764 |     3.3 MB |
# +----------+----------+------------+------------+

Change Resources After Backup

kubectl delete deploy before
# deployment.apps "before" deleted

kubectl create deploy after --image=nginx --replicas=2
# deployment.apps/after created

kubectl get deploy
# NAME    READY   UP-TO-DATE   AVAILABLE   AGE
# after   2/2     2            2           12s

Restore a Snapshot

sudo rm -rf /var/lib/etcd-restore
sudo ETCDCTL_API=3 etcdctl snapshot restore /opt/etcd-backup.db --data-dir=/var/lib/etcd-restore
# {"level":"info","ts":1768460423.4175081,"caller":"snapshot/v3_snapshot.go:306","msg":"restoring snapshot","path":"/opt/etcd-backup.db","wal-dir":"/var/lib/etcd-restore/member/wal","data-dir":"/var/lib/etcd-restore","snap-dir":"/var/lib/etcd-restore/member/snap"}
# {"level":"info","ts":1768460423.4347312,"caller":"membership/cluster.go:392","msg":"added member","cluster-id":"cdf818194e3a8c32","local-member-id":"0","added-peer-id":"8e9e05c52164694d","added-peer-peer-urls":["http://localhost:2380"]}
# {"level":"info","ts":1768460423.440487,"caller":"snapshot/v3_snapshot.go:326","msg":"restored snapshot","path":"/opt/etcd-backup.db","wal-dir":"/var/lib/etcd-restore/member/wal","data-dir":"/var/lib/etcd-restore","snap-dir":"/var/lib/etcd-restore/member/snap"}

sudo vi /etc/kubernetes/manifests/etcd.yaml
# find:
# - name: etcd-data
#   hostPath:
#     path: /var/lib/etcd
# update:
# - name: etcd-data
#   hostPath:
#     path: /var/lib/etcd-restore

# confirm the "before" deployment restored
kubectl get deploy
# NAME     READY   UP-TO-DATE   AVAILABLE   AGE
# before   2/2     2            2           7m44s