Bỏ qua

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)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:

  1. 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.
  2. Giải nén (Unzip): Giải nén file vừa tải.
  3. Chạy (Run): Chạy file thực thi etcd.
  4. Mặc định, etcd sẽ khởi động một dịch vụ và lắng nghe trên cổng 2379.

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ặc 3).

  • 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:

    export ETCDCTL_API=3
    

  • 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ới etcd.

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 khai etcd 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 namespace kube-system .
  • Nếu muốn tương tác với etcd bằng etcdctl, bạn sẽ cần phải thực hiện lệnh bên trong Pod etcd đó.

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ụm etcd (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ụm etcd.

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 namespace kube-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

export ETCDCTL_API=3

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ủa etcd (ví dụ: /etc/kubernetes/pki/etcd/ca.crt). Dùng để xác thực etcd 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 namespace kube-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ệnh etcdctl 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:

  1. Phiên bản API: Luôn đặt ETCDCTL_API=3.
  2. Certificate: Luôn cung cấp đủ 3 tham số --cacert, --cert, và --key với đường dẫn chính xác.
  3. Thực thi trong Pod: Nếu etcd chạy như một Pod, bạn phải dùng kubectl 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ả!

Bình luận