04.etcd
1. etcd
là gì?¶
Bạn có thể nghĩ về etcd
như một cơ sở dữ liệu đặc biệt. Theo định nghĩa, nó là một kho lưu trữ khóa-giá trị (key-value store) có các đặc tính sau:
- Phân tán (Distributed): Dữ liệu được trải rộng trên nhiều máy chủ.
- Đáng tin cậy (Reliable): Đảm bảo dữ liệu không bị mất mát.
- Đơn giản, an toàn và nhanh chóng.
Trong Kubernetes, etcd
chính là "bộ não" lưu trữ toàn bộ trạng thái và cấu hình của cả cụm.
2. Key-Value Store khác gì Cơ sở dữ liệu truyền thống (SQL)? 🤔¶
Đây là điểm khác biệt cốt lõi bạn cần nắm:
-
Cơ sở dữ liệu truyền thống (SQL):
-
Lưu dữ liệu dưới dạng bảng (table) với các hàng (row) và cột (column) được định nghĩa nghiêm ngặt.
-
Ví dụ: Một bảng thông tin nhân viên. Nếu bạn muốn thêm một loại thông tin mới (ví dụ:
lương
), bạn phải thêm một cột mới cho toàn bộ bảng, ảnh hưởng đến tất cả các hàng, kể cả những người không có thông tin lương (dẫn đến nhiều ô trống). -
Kho lưu trữ Key-Value (như
etcd
): -
Lưu thông tin dưới dạng các cặp Khóa (Key) = Giá trị (Value), giống như các tài liệu (document) riêng lẻ.
- Ví dụ: Mỗi người có một "tài liệu" riêng. Người đi làm thì có trường
lương
trong tài liệu của họ. Học sinh thì có trườngđiểm
trong tài liệu của họ. - Lợi ích: Cấu trúc rất linh hoạt. Bạn có thể thêm một trường mới vào một tài liệu mà không ảnh hưởng gì đến các tài liệu khác. Dữ liệu phức tạp thường được lưu dưới dạng JSON hoặc YAML.
3. Bắt đầu với etcd
¶
Việc cài đặt và chạy etcd
rất đơn giản:
- Tải về (Download): Lấy file nhị phân (binary) phù hợp với hệ điều hành của bạn từ trang GitHub của
etcd
. - Giải nén (Unzip): Giải nén file vừa tải.
- Chạy (Run): Chạy file thực thi
etcd
. - Mặc định,
etcd
sẽ khởi động một dịch vụ và lắng nghe trên cổng2379
.
Sau khi chạy, bạn có thể dùng một "client" để giao tiếp với nó. Client mặc định đi kèm là etcdctl
.
4. "Cú lừa" về phiên bản: etcdctl
v2 vs. v3 ⚠️¶
Đây là phần quan trọng nhất và dễ gây nhầm lẫn nhất cho người mới bắt đầu!
Giữa phiên bản etcd
v2 và v3 có sự thay đổi lớn về API, dẫn đến các lệnh etcdctl
cũng thay đổi theo.
-
Làm sao để biết
etcdctl
đang dùng API phiên bản nào? -
Chạy lệnh:
etcdctl version
-
Lệnh này sẽ hiển thị phiên bản của công cụ
etcdctl
và quan trọng hơn là phiên bản API mà nó đang được cấu hình để sử dụng (là2
hoặc3
). -
Làm sao để chuyển sang dùng API v3?
-
Các phiên bản
etcdctl
mới hơn thường mặc định dùng API v3. Nhưng nếu bạn gặp phiên bản cũ hơn, bạn cần ra lệnh cho nó dùng API v3. -
Cách tốt nhất là đặt biến môi trường cho toàn bộ phiên làm việc của bạn bằng lệnh:
-
So sánh lệnh giữa v2 và v3:
Tác vụ | Lệnh API v2 | Lệnh API v3 |
---|---|---|
Lưu giá trị | etcdctl set key1 value1 |
etcdctl put key1 value1 |
Lấy giá trị | etcdctl get key1 |
etcdctl get key1 |
Xem phiên bản | etcdctl --version (là một tùy chọn) |
etcdctl version (là một lệnh) |
Việc set
đổi thành put
là thay đổi dễ nhận thấy nhất.
5. "Chốt hạ" cho người mới bắt đầu 📝¶
etcd
là một kho lưu trữ key-value linh hoạt, là "bộ não" của Kubernetes.- Việc cài đặt và chạy nó khá đơn giản, mặc định ở cổng 2379.
- Khi sử dụng
etcdctl
, hãy luôn chắc chắn rằng bạn đang làm việc với API v3 bằng cách kiểm tra (etcdctl version
) và thiết lập biến môi trường (export ETCDCTL_API=3
). Đây là mẹo thực tế quan trọng nhất để tránh lỗi không đáng có.
1. Vai trò của etcd
trong Kubernetes - "Bộ não" của Cụm 🧠¶
Trong một cụm Kubernetes, etcd
chính là nguồn chân lý duy nhất (single source of truth) .
- Nó lưu trữ TOÀN BỘ thông tin về cụm, bao gồm:
- Nodes, Pods, Configs, Secrets, Accounts, Roles, Role Bindings, và nhiều thứ khác.
- Mọi thông tin bạn thấy khi chạy lệnh
kubectl get ...
đều được lấy từetcd
. - Mọi thay đổi bạn thực hiện với cụm (thêm node, triển khai pod,...) chỉ được coi là hoàn tất khi nó đã được cập nhật thành công vào
etcd
.
2. Cách etcd
được triển khai trong Kubernetes¶
etcd
được cài đặt như thế nào còn phụ thuộc vào cách bạn dựng cụm Kubernetes của mình. Có hai cách chính:
a. Triển khai "Thủ công" (From Scratch)¶
Đây là cách bạn tự tay làm mọi thứ.
- Bạn sẽ phải tự tải file nhị phân (binary) của
etcd
về. - Tự cài đặt và cấu hình
etcd
như một service chạy trên Master Node. - Khi cấu hình, có một tham số rất quan trọng cần lưu ý:
--advertise-client-urls
: Đây là địa chỉ màetcd
sẽ lắng nghe các kết nối từ client (ví dụ:https://<IP-của-master-node>:2379
).kube-api-server
(thành phần trung tâm của Kubernetes) phải được cấu hình để trỏ đến đúng URL này thì mới có thể nói chuyện được vớietcd
.
b. Triển khai bằng kubeadm
(Cách dễ hơn)¶
kubeadm
là một công cụ giúp tự động hóa việc cài đặt cụm Kubernetes.
- Khi bạn dùng
kubeadm
, nó sẽ tự động triển khaietcd
cho bạn . - Điều đặc biệt là
etcd
sẽ được triển khai dưới dạng một Pod chạy trong namespacekube-system
. - Nếu muốn tương tác với
etcd
bằngetcdctl
, bạn sẽ cần phải thực hiện lệnh bên trong Podetcd
đó.
3. Dữ liệu được lưu trữ như thế nào? 📂¶
Kubernetes không lưu dữ liệu một cách lộn xộn trong etcd
. Nó tổ chức theo một cấu trúc thư mục cụ thể:
- Thư mục gốc là
/registry
. - Bên dưới là các thư mục con cho từng loại tài nguyên, ví dụ:
/registry/nodes
/registry/pods
/registry/deployments
- ...
4. etcd
trong môi trường High Availability (HA) 🏰¶
- Trong một môi trường HA, bạn sẽ có nhiều Master Node để dự phòng cho nhau.
- Tương ứng, bạn cũng sẽ có nhiều instance
etcd
chạy trên các Master Node này, tạo thành một cụmetcd
(etcd cluster). - Để các instance
etcd
này biết về nhau và hoạt động như một cụm, bạn cần cấu hình tham số--initial-cluster
. Tham số này sẽ liệt kê địa chỉ của tất cả các thành viên trong cụmetcd
.
5. "Chốt hạ" cho Kỳ thi 📝¶
etcd
là cơ sở dữ liệu, là trái tim, là bộ não của Kubernetes , lưu trữ mọi trạng thái của cụm.- Hiểu rõ hai phương pháp triển khai chính:
- Thủ công (From Scratch): Bạn tự cài, nhớ tham số
--advertise-client-urls
. - Dùng
kubeadm
:etcd
được triển khai như một Pod trong namespacekube-system
. - Trong môi trường HA,
etcd
chạy dưới dạng một cụm (cluster) và được cấu hình qua tham số--initial-cluster
.
1. etcdctl
- "Vũ khí" tương tác với etcd
¶
Như chúng ta đã biết, etcdctl
là công cụ dòng lệnh (CLI) để "nói chuyện" với cơ sở dữ liệu etcd
. Tuy nhiên, để "nói chuyện" thành công, bạn cần biết hai điều quan trọng: "ngôn ngữ" và "giấy thông hành".
2. Hai "Thế giới" API: Version 2 vs. Version 3¶
etcdctl
có thể giao tiếp với etcd
server bằng 2 phiên bản API: v2 và v3. Điều quan trọng là bộ lệnh của hai phiên bản này khác nhau .
Tác vụ | Lệnh API v2 | Lệnh API v3 |
---|---|---|
Lưu giá trị | etcdctl set |
etcdctl put |
Backup | etcdctl backup |
etcdctl snapshot save |
Kiểm tra "sức khỏe" | etcdctl cluster-health |
etcdctl endpoint health |
Mặc định, etcdctl
có thể được cấu hình để dùng API v2. Khi đó, nếu bạn gõ lệnh của v3 (ví dụ: put
), nó sẽ báo lỗi và ngược lại.
👉 Làm thế nào để chắc chắn dùng API v3?
Cách tốt nhất là đặt biến môi trường sau cho phiên làm việc của bạn:
Bash
3. "Giấy thông hành" - Xác thực bằng Certificate 🔑¶
Trong một cụm Kubernetes được cài đặt đúng cách, etcd
server sẽ yêu cầu xác thực an toàn. Bạn không thể "tay không" vào nói chuyện được mà cần có "giấy thông hành" là các file certificate.
etcdctl
cần bạn chỉ định đường dẫn đến 3 file certificate quan trọng:
--cacert
: Đường dẫn đến file CA certificate củaetcd
(ví dụ:/etc/kubernetes/pki/etcd/ca.crt
). Dùng để xác thựcetcd
server.--cert
: Đường dẫn đến file certificate của client (ví dụ:/etc/kubernetes/pki/etcd/server.crt
). Dùng đểetcd
server xác thực bạn.--key
: Đường dẫn đến file key riêng của client (ví dụ:/etc/kubernetes/pki/etcd/server.key
).
Lưu ý: Trong một cụm kubeadm
, các file này thường nằm ở đường dẫn /etc/kubernetes/pki/etcd/
trên master node.
4. Cú pháp "Full Option" - Lệnh etcdctl
hoàn chỉnh¶
Kết hợp tất cả những điều trên, một lệnh etcdctl
hoàn chỉnh để tương tác với etcd
(đang chạy dưới dạng Pod trong một cụm kubeadm
) sẽ trông như thế này:
Bash
kubectl exec etcd-master -n kube-system -- sh -c "ETCDCTL_API=3 etcdctl get / --prefix --keys-only --limit=10 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key"
Hãy "mổ xẻ" nó:
kubectl exec etcd-master -n kube-system --
: Chạy một lệnh bên trong Pod tên làetcd-master
thuộc namespacekube-system
.sh -c "..."
: Thực thi chuỗi lệnh bên trong dấu ngoặc kép.ETCDCTL_API=3
: Đảm bảo chúng ta đang dùng API v3.etcdctl get / --prefix --keys-only --limit=10
: Lệnhetcdctl
thực tế để lấy 10 key đầu tiên từ thư mục gốc.--cacert ... --cert ... --key ...
: Cung cấp 3 "giấy thông hành" cần thiết để xác thực.
5. "Chốt hạ" cho Kỳ thi CKA 📝¶
Khi làm bài thi CKA, nếu bạn cần tương tác trực tiếp với etcd
bằng etcdctl
, hãy luôn nhớ "thần chú" 3 điều sau:
- Phiên bản API: Luôn đặt
ETCDCTL_API=3
. - Certificate: Luôn cung cấp đủ 3 tham số
--cacert
,--cert
, và--key
với đường dẫn chính xác. - Thực thi trong Pod: Nếu
etcd
chạy như một Pod, bạn phải dùngkubectl exec
để vào trong Pod đó và thực thi lệnh.
Quên một trong những điều này gần như chắc chắn sẽ khiến lệnh của bạn thất bại. Hy vọng phần giải thích chi tiết này sẽ giúp bạn tự tin hơn khi làm việc với etcd
! Chúc bạn buổi chiều học tập hiệu quả!