Phần 2 - Cách etcd hoạt động khi có và không có Kubernetes
Ở bài trước chúng ta đã biết được tại sao Kubernetes sử dụng etcd làm cơ sở dữ liệu bằng cách xây dựng một cụm etcd 3 nút. Vậy trong bài viết này, hãy cùng Bizfly Cloud đi tìm hiểu cách sử dụng etcd trong thực tế.
Bắt đầu với etcd
Bạn có thể tải xuống tệp nhị phân etcd trực tiếp từ trang phát hành:
Ví dụ cho Linux:
curl-LO https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
tar xzvf etcd-v3.5.0-linux-amd64.tar.gz
cd etcd-v3.5.0-linux-amd64
Nếu bạn kiểm tra nội dung của bản phát hành, bạn có thể thấy ba tệp nhị phân:
- etcd, chạy máy chủ etcd thực tế.
- etcdctl, là một tệp nhị phân máy khách để tương tác với máy chủ.
- etcdutl, cung cấp một số tiện ích trợ giúp cho các hoạt động như sao lưu.
Bắt đầu một "cụm" etcd một nút dễ dàng như đang chạy:
./etcd
...
{"level":"info","caller":"etcdserver/server.go:2027","msg":"published local member..." }
{"level":"info","caller":"embed/serve.go:98","msg":"ready to serve client requests"}
{"level":"info","caller":"etcdmain/main.go:47","msg":"notifying init daemon"}
{"level":"info","caller":"etcdmain/main.go:53","msg":"successfully notified init daemon"}
{"level":"info","caller":"embed/serve.go:140","msg":"serving client traff...","address":"127.0.0.1:2379"}
Bạn có thể thấy từ nhật ký rằng etcd đã thiết lập một "cụm" và bắt đầu phân phối lưu lượng truy cập một cách không an toàn 127.0.0.1:2379.
Để làm việc với "cụm" đang chạy này, bạn có thể sử dụng etcdctl nhị phân.
Có một điều phức tạp cần lưu ý: API etcd đã thay đổi đáng kể giữa v2 và v3.
Để sử dụng API mới, bạn phải đặt biến môi trường một cách rõ ràng trước khi chạy etcdctl.
Để sử dụng API v3, bạn có thể sử dụng lệnh sau trong mọi cửa sổ đầu cuối mà bạn sử dụng:
export ETCDCTL_API=3
Bây giờ bạn thực sự có thể sử dụng etcdctl để ghi và đọc dữ liệu khóa-giá trị:
./etcdctl put foo bar
OK
./etcdctl get foo
foo
bar
Như bạn có thể thấy, etdctl get sẽ lặp lại khóa và giá trị; bạn có thể sử dụng --print-value-only cờ để vô hiệu hóa hành vi này.
Để nhận được câu trả lời chi tiết hơn, bạn có thể sử dụng --write-out=json tùy chọn:
./etcdctl get --write-out=json foo
{
"header": {
"cluster_id": 14841639068965180000,
"member_id": 10276657743932975000,
"revision": 2,
"raft_term": 2
},
"kvs": [
{
"key": "Zm9v",
"create_revision": 2,
"mod_revision": 2,
"version": 1,
"value": "YmFy"
}
],
"count": 1
}
Tại đây, bạn sẽ có một cái nhìn rõ hơn về siêu dữ liệu mà etcd duy trì.
Dữ liệu tại:
- version: 1
- create_revision: 2, và
- mod_revision: 2.
Mỗi khi thao tác ghi xảy ra trong cụm, etcd sẽ tạo một phiên bản mới của tập dữ liệu và số sửa đổi được tăng lên.
Tuy nhiên bạn cần lưu ý rằng cả khóa và giá trị đều được trả về mã hóa base64. Điều này là do các khóa và giá trị trong etcd là mảng byte tùy ý thay vì chuỗi. Cũng không giống như MySQL, không có khái niệm mã hóa chuỗi tích hợp trong etcd.
Trả về nhiều kết quả cùng một lúc
Một tính năng hay của etcd bạn cần biết đó chính là khả năng trả về nhiều giá trị cùng một lúc.
Để thử điều này, trước tiên hãy tạo một vài khóa và giá trị:
./etcdctl put myprefix/key1 thing1
OK
./etcdctl put myprefix/key2 thing2
OK
./etcdctl put myprefix/key3 thing3
OK
./etcdctl put myprefix/key4 thing4
OK
Nếu bạn cung cấp hai đối số etdctctl get, nó sẽ sử dụng một truy vấn phạm vi để trả về tất cả các cặp khóa/giá trị trong phạm vi đó.
Theo dõi các thay đổi
Một tính năng chính của etcd mà bạn chưa thấy là etcdctl watch lệnh, lệnh này hoạt động ít nhiều giống như etcdctl get nhưng luồng thay đổi trở lại máy khách.
Ví dụ: Trong một cửa sổ dòng lệnh, hãy để ý những thay đổi đối với bất kỳ thứ gì có tiền tố myprefix/:
./etcdctl watch --prefix myprefix/
Và sau đó trong một thiết bị đầu cuối khác, hãy thay đổi một số dữ liệu và xem điều gì
sẽ xảy ra:
./etcdctl put myprefix/key1 anewthing
OK
./etcdctl put myprefix/key5 thing5
OK
./etcdctl del myprefix/key5
1
./etcdctl put notmyprefix/key thing
OK
Trong cửa sổ ban đầu, bạn sẽ thấy một luồng tất cả các thay đổi đã xảy ra trong myprefix tiền tố, ngay cả đối với các khóa trước đó không tồn tại:
PUT
myprefix/key1
anewthing
PUT
myprefix/key5
thing5
DELETE
myprefix/key5
Nhưng watch lệnh không chỉ giới hạn ở các thay đổi trong thời gian thực - bạn cũng có thể xem phiên bản trước của các sự kiện bằng cách sử dụng --rev tùy chọn này, sẽ truyền trực tuyến tất cả các thay đổi kể từ bản sửa đổi đó.
Hãy xem lịch sử của foo khóa trước đó:
./etcdctl watch --rev=2 foo
PUT
foo
bar
PUT
foo
baz
DELETE
Foo
Tính năng tiện dụng này có thể cho phép khách hàng không bỏ lỡ các bản cập nhật dù họ đang ngoại tuyến.
Thiết lập một cụm etcd nhiều nút
Chúng ta hãy thử thiết lập một cụm 3 nút và xem tính khả dụng cao hoạt động như thế nào trong thực tế nhé.
Tất cả các nút sẽ nằm trên các máy chủ riêng biệt trong một cụm thực, nhưng bạn có thể thiết lập một cụm với tất cả các nút trên cùng một máy tính bằng cách cung cấp cho mỗi nút các cổng duy nhất của nó.
Đầu tiên, hãy tạo thư mục dữ liệu cho mỗi nút:
mkdir -p /tmp/etcd/data{1..3}
Khi thiết lập một cụm etcd, bạn phải biết trước địa chỉ IP và cổng của các nút sẽ như thế nào để các nút có thể phát hiện ra nhau.
Hãy liên kết với localhost cho cả ba nút, cung cấp các cổng "máy khách" là 2379, 3379 và 4379 và các cổng "ngang hàng" là 2380, 3380 và 4380.
Khởi động nút etcd đầu tiên:
./etcd --data-dir=/tmp/etcd/data1 --name node1 \
--initial-advertise-peer-urls http://127.0.0.1:2380 \
--listen-peer-urls http://127.0.0.1:2380 \
--advertise-client-urls http://127.0.0.1:2379 \
--listen-client-urls http://127.0.0.1:2379 \
--initial-cluster node1=http://127.0.0.1:2380,node2=http://127.0.0.1:3380,node3=http://127.0.0.1:4380 \
--initial-cluster-state new \
--initial-cluster-token mytoken
Bắt đầu nút thứ hai:
./etcd --data-dir=/tmp/etcd/data2 --name node2 \
--initial-advertise-peer-urls http://127.0.0.1:3380 \
--listen-peer-urls http://127.0.0.1:3380 \
--advertise-client-urls http://127.0.0.1:3379 \
--listen-client-urls http://127.0.0.1:3379 \
--initial-cluster node1=http://127.0.0.1:2380,node2=http://127.0.0.1:3380,node3=http://127.0.0.1:4380 \
--initial-cluster-state new \
--initial-cluster-token mytoken
Nút thứ ba trong thiết bị đầu cuối thứ ba:
./etcd --data-dir=/tmp/etcd/data3 --name node3 \
--initial-advertise-peer-urls http://127.0.0.1:4380 \
--listen-peer-urls http://127.0.0.1:4380 \
--advertise-client-urls http://127.0.0.1:4379 \
--listen-client-urls http://127.0.0.1:4379 \
--initial-cluster node1=http://127.0.0.1:2380,node2=http://127.0.0.1:3380,node3=http://127.0.0.1:4380 \
--initial-cluster-state new \
--initial-cluster-token mytoken
Để giao tiếp với một cụm etcd, bạn phải cho biết etcdctl điểm cuối nào cần chia sẻ bằng cách sử dụng --endpoints tùy chọn, đây chỉ là danh sách các điểm cuối etcd.
Hãy xác minh rằng tất cả các nút đã tham gia thành công bằng member list lệnh:
export ENDPOINTS=127.0.0.1:2379,127.0.0.1:3379,127.0.0.1:4379
./etcdctl --endpoints=$ENDPOINTS member list --write-out=table
+------------------+---------+-------+-----------------------+-----------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+-------+-----------------------+-----------------------+------------+
| 3c969067d90d0e6c | started | node1 | http://127.0.0.1:2380 | http://127.0.0.1:2379 | false |
| 5c5501077e83a9ee | started | node3 | http://127.0.0.1:4380 | http://127.0.0.1:4379 | false |
| a2f3309a1583fba3 | started | node2 | http://127.0.0.1:3380 | http://127.0.0.1:3379 | false |
+------------------+---------+-------+-----------------------+-----------------------+------------+
Bạn có thể thấy rằng tất cả ba nút đã tham gia thành công cụm!
Tiếp theo, hãy xác nhận rằng cụm thực sự có thể đọc và ghi dữ liệu:
./etcdctl --endpoints=$ENDPOINTS put mykey myvalue
OK
./etcdctl --endpoints=$ENDPOINTS get mykey
mykey
myvalue
Qua bài viết này chúng ta có thể thấy etcd là nơi Kubernetes (K8s) lưu trữ tất cả thông tin về trạng thái của một cụm. etcd cung cấp một bộ tính năng phù hợp hoàn hảo cho Kubernetes. Nó có tính nhất quán mạnh mẽ, có thể hoạt động như một điểm điều phối trung tâm cho cụm, nhưng nó cũng rất sẵn có nhờ vào thuật toán đồng thuận Raft.
Hãy thường xuyên theo dõi Bizfly Cloud để cùng chúng tôi cập nhật những kiến thức công nghệ mỗi ngày.