Phần 2 - Cách etcd hoạt động khi có và không có Kubernetes

1193
06-09-2021
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.

SHARE