Hãy mở rộng những gì chúng ta đã bắt đầu với CentOS 7.2 vài tuần trước. Trong hướng dẫn đó, chúng ta đã học cách khởi tạo và chạy chức năng clustering và orchestration native được tích hợp sẵn trong Docker 1.12. Nhưng lúc đó chúng ta chỉ có manager node và không có worker nào. Hôm nay, chúng ta sẽ mở rộng điều này.
Tôi sẽ chỉ cho bạn cách thêm các node không đối xứng vào swarm, ví dụ một Fedora 24 sẽ nằm bên cạnh CentOS box của chúng ta, và cả hai sẽ tham gia vào cluster, với tất cả các tính năng load balancing đẳng cấp đi kèm. Tất nhiên, điều này sẽ không hề đơn giản, và chúng ta sẽ gặp một vài rắc rối, nên hứa hẹn sẽ khá thú vị. Theo chân mình nhé.
Điều kiện tiên quyết
Có một số việc cần làm trước khi có thể join thêm node vào swarm thành công. Thứ nhất, lý tưởng nhất tất cả các node nên chạy cùng phiên bản Docker, và phiên bản đó phải ít nhất là 1.12 để hỗ trợ orchestration native. Giống như CentOS, Fedora không có phiên bản mới nhất trong repo, nên bạn sẽ cần thủ công thêm và cài đặt phiên bản phần mềm phù hợp, hoặc dùng repo Docker, sau đó fix một vài xung đột dependency. Tôi đã chỉ cho bạn cách làm với CentOS, và bài tập này hoàn toàn tương tự.
Hơn nữa, tất cả node của bạn cần có thể giao tiếp với nhau. Phải có routing và rule firewall để manager và worker có thể nói chuyện với nhau. Nếu không, bạn sẽ không thể join node vào swarm. Cách dễ nhất để workaround vấn đề là tạm thời flush rule firewall (iptables -F), nhưng điều này có thể làm giảm bảo mật. Hãy chắc chắn bạn hiểu hoàn toàn những gì bạn đang làm, và tạo đúng rule cho node và cổng của bạn.
Error response from daemon: Timeout was reached before node was joined. The attempt to join the swarm will continue in the background. Use the "docker info" command to see the current swarm status of your node.
Bạn cần có cùng Docker image trên các host. Trong hướng dẫn trước, chúng ta đã tạo image Apache, và bạn sẽ cần làm tương tự trên worker node, hoặc phân phối các image đã tạo. Nếu không làm vậy, bạn sẽ gặp lỗi. Nếu cần giúp đỡ thiết lập Docker, hãy đọc hướng dẫn intro và bài mạng của tôi.
7vwdxioopmmfp3amlm0ulimcu \_ websky.11 my-apache2:latest
localhost.localdomain Shutdown Rejected 7 minutes ago
"No such image: my-apache2:lat&"
Bắt đầu thôi
Vậy là chúng ta có CentOS box chạy ngon lành, và nó đang spawn container thành công. Bạn có thể kết nối đến dịch vụ dùng cổng host, và mọi thứ trông "peachy". Lúc này, swarm của bạn chỉ có manager.
Join Worker
Để thêm node mới, bạn sẽ cần dùng lệnh join. Nhưng trước tiên bạn phải khám phá token, địa chỉ IP và cổng nào bạn phải cung cấp trên worker node để chúng authenticate đúng với swarm manager. Sau đó thực thi (trên Fedora):
[root@localhost ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0xvojvlza90nrbihu6gfu3qm34ari7lwnza ... \
192.168.2.100:2377
Nếu bạn không fix firewall và routing rule, bạn sẽ gặp lỗi timeout. Nếu bạn đã join swarm, lặp lại lệnh join sẽ tạo ra noise riêng:
Error response from daemon: This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one.
Nếu bao giờ nghi ngờ, bạn có thể leave swarm và thử lại:
[root@localhost ~]# docker swarm leave
Node left the swarm.
docker swarm join --token
SWMTKN-1-0xvojvlza90nrbihu6gfu3qnza4 ... 192.168.2.100:2377
This node joined a swarm as a worker.
Trên worker node, bạn có thể dùng docker info để kiểm tra trạng thái:
Swarm: active
NodeID: 2i27v3ce9qs2aq33nofaon20k
Is Manager: false
Node Address: 192.168.2.103
Tương tự, trên manager:
Swarm: active
NodeID: cneayene32jsb0t2inwfg5t5q
Is Manager: true
ClusterID: 8degfhtsi7xxucvi6dxvlx1n4
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Node Address: 192.168.2.100
Tạo hoặc Scale Service
Bây giờ, chúng ta cần xem Docker phân phối container giữa các node như thế nào. Test của tôi cho thấy thuật toán balancing khá đơn giản dưới tải nhẹ. Một hoặc hai lần, Docker không cố gắng re-distribute service đang chạy đến worker mới, ngay cả sau khi tôi thử scale và update chúng. Tương tự, một lần, nó tạo một service hoàn toàn mới trên worker node. Có lẽ đó là lựa chọn tốt nhất. Sau một thời gian, có sự re-distribution container cho các service hiện có giữa hai node, nhưng mất một chút thời gian. Service mới hoạt động tốt. Đây chỉ là quan sát ban đầu, nên tôi không thể nói thêm nhiều lúc này. Hiện tại, đây là điểm khởi đầu tốt để bắt đầu khám phá và tinh chỉnh.
Kết luận
Docker là một "con quái" nhỏ nhé, và nó chỉ sẽ tiếp tục lớn hơn, phức tạp hơn, mạnh mẽ hơn, và tất nhiên, thanh lịch hơn. Chỉ là vấn đề thời gian trước khi nó bị "nuốt" bởi một enterprise lớn, ngon lành. Khi nói đến orchestration native, swarm mode hoạt động khá tốt, nhưng cần nhiều hơn chỉ vài container để khai thác hoàn toàn sức mạnh của thuật toán và scalability của nó.
Hướng dẫn của tôi cho thấy cách thêm node Fedora vào cluster do CentOS box quản lý, và hai bên làm việc tốt bên cạnh nhau. Có một vài câu hỏi quanh load balancing, nhưng đây là điều tôi sẽ khám phá trong các bài viết tương lai. Tóm lại, hy vọng đây là một bài học đáng giá. Chúng ta đã giải quyết một số điều kiện tiên quyết và vấn đề thường gặp khi thiết lập swarm, đã chạy một đống container, và thậm chí chạm nhẹ đến cách scale và phân phối service. Và nhớ, 't chỉ mới là khởi đầu thôi.
Chúc vui.