ETCD
1. etcd là gì?
Key – value store
etcd lưu dữ liệu theo cặp khóa – giá trị. Biết key là lấy ra được value.
name → John
location → New York
age → 45
Value có thể là cả một tài liệu:
key: /users/john
value: { "name": "John", "age": 45, "location": "New York" }
Distributed & Reliable
-
Distributed (phân tán): etcd có thể chạy trên nhiều máy, cùng giữ dữ liệu.
-
Reliable (đáng tin cậy): các thành viên phối hợp để thống nhất dữ liệu, nên hệ thống chịu được một số sự cố.
-
Cổng mặc định cho client là
2379. Các thành viên etcd nói chuyện với nhau qua cổng2380.
2. etcd trong Kubernetes
etcd lưu toàn bộ trạng thái cluster: nodes, pods, configs, secrets, accounts, roles, role bindings…
kube-apiserver là thành phần DUY NHẤT nói chuyện trực tiếp với etcd. Trong cấu hình apiserver có dòng:
--etcd-servers=https://127.0.0.1:2379
Install
| Cách dựng cluster | etcd chạy dưới dạng | Xem cấu hình ở đâu |
|---|---|---|
| kubeadm | Static pod etcd-<tên-master> trong kube-system | /etc/kubernetes/manifests/etcd.yaml |
| Hard way | systemd service | /etc/systemd/system/etcd.service |
Ví dụ service file (hard way):
ExecStart=/usr/local/bin/etcd \
--name controller-0 \
--cert-file=/etc/etcd/kubernetes.pem \ # certificate
--key-file=/etc/etcd/kubernetes-key.pem \ # certificate
--trusted-ca-file=/etc/etcd/ca.pem \ # certificate
--advertise-client-urls https://10.0.0.11:2379 \ # ⭐ CẦN NHỚ: địa chỉ client gọi tới
--initial-cluster controller-0=https://10.0.0.11:2380,controller-1=https://10.0.0.12:2380 \ # HA
--data-dir=/var/lib/etcd
| Option | Ý nghĩa |
|---|---|
--advertise-client-urls | Địa chỉ etcd lắng nghe client. apiserver phải trỏ --etcd-servers tới đây |
--initial-cluster | Danh sách các thành viên etcd khi chạy HA (nhiều master) |
--data-dir | Nơi lưu dữ liệu trên đĩa – quan trọng khi backup/restore |
Data Structures
Thư mục gốc là /registry, key được đặt như đường dẫn:
/registry/minions/k8s-worker1 # node (minion là tên cũ của node)
/registry/pods/default/nginx # pod "nginx" trong namespace "default"
/registry/deployments/kube-system/coredns
/registry/secrets/default/my-secret
Quy tắc chung: /registry/<resource_type>/<namespace>/<name>.
Kết quả thật trên cluster lab khi liệt kê toàn bộ key (lệnh ở mục 3): mọi key đều bắt đầu bằng /registry. Những dòng đầu là các CRD mà Calico cài vào cluster (*.crd.projectcalico.org).

3. etcdctl
etcd là server (nơi lưu dữ liệu), etcdctl là client gửi lệnh tới server – giống cặp MySQL server và lệnh mysql.
API v2 và v3
| API v2 (cũ) | API v3 (dùng hiện nay) | |
|---|---|---|
| Ghi | etcdctl set key value | etcdctl put key value |
| Đọc | etcdctl get key | etcdctl get key |
| Backup | etcdctl backup | etcdctl snapshot save |
- Đặt biến môi trường
ETCDCTL_API=3để chắc chắn dùng v3 (bản mới đã mặc định là v3).
Liệt kê mọi key Kubernetes đang lưu
Vì etcd bật TLS, mọi lệnh phải kèm 3 file chứng chỉ:
kubectl exec etcd-k8s-master -n kube-system -- sh -c "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 \
get / --prefix --keys-only --limit=10"
Kết quả trên cluster lab: --limit=10 chỉ in 10 key đầu tiên, dễ đọc hơn khi chỉ muốn kiểm tra etcd có trả lời hay không.

| Flag | Ý nghĩa |
|---|---|
--cacert | CA để xác minh server etcd |
--cert / --key | Chứng chỉ của client (chính mình) |
--prefix --keys-only | Lấy mọi key bắt đầu bằng /, chỉ in tên key |