Docker Swarm là gì?
Docker Swarm là công cụ native clustering cho Docker. Cho phép ta có thể gom một số Docker host lại với nhau thành dạng cụm (cluster) và ta có xem nó như một máy chủ Docker ảo (virtual Docker host) duy nhất. Và một Swarm là một cluster của một hoặc nhiều Docker Engine đang chạy.
Swarm bao gồm nhiều Docker Host chạy trong swarm mode hoạt động ở hai vai trò:
- manager: Có chức năng quản lý các host trong cluster, các dịch vụ,…
- worker: Có chức năng chạy services,…
Một Docker host có thể là một manager node, worker hoặc thậm chí có cả hai vai trò. Khi ta tạo ra service, ta cần phải xác định trạng thái tối ưu của nó (số lượng replicas, network và tài nguyên storage cung cấp cho nó, ports cho containers,…). Docker hoạt động để duy trì các trạng thái mong muốn. Ví dụ, nếu một worker node trở nên không khả dụng, các task của node sẽ được thêm mới tới các node khác.
Các tính năng nổi bật của Docker Swarm:
- Quản lý Cluster được tích hợp với Docker Engine: Sử dụng Docker CLI để tạo ra swarm để triển khai các dịch vụ. Không cần thiết phải có thêm các phần mềm khác để tạo và quản lý swarm.
- Triển khai phân tán: Thay vì xử lý các khác biệt giữa vai trò của các node trong thời gian triển khai, Docker Engine sẽ xử lý bất kỳ tác vụ nào đang chạy. Ta có thể triển khai cả hai loại node là manager và workers sử dụng Docker Engine. Điều này có nghĩa ta có thể tạo ra một Docker Swarm hoàn chỉnh chỉ từ một image duy nhất.
- Scaling: Đối với mỗi dịch vụ triển khai trong Docker Swarm, bạn có thể khai báo số lượng task muốn chạy. Khi bạn mở rộng quy mô hay ngược lại, Docker Swarm sẽ tự động điều chỉnh bằng cách thêm hoặc xóa task để duy trì trạng thái mong muốn – tình trạng hệ thống ta cần đạt được.
- Failover: Docker Swarm sẽ liên tục giám sát trạng thái của cluster và giải quyết bất kỳ sự thay đổi nào giữa trạng thái thực tế và trạng thái mong muốn dựa trên các quyết định của bạn. Ví dụ: Ta thiết lập một dịch vụ với 5 bản sao containers và worker node có lưu trữ 2 bản sao containers. Manager node sẽ tự động tạo ra 2 bản sao containers khác nếu như 2 bản sao containers trong worker node bị lỗi,… Manager Node sẽ luôn luôn đảm bảo các bản sao containers mới cho worker đang chạy hoặc được cung cấp.
- Multi-host networking: Có thể khai báo overlay network cho các dịch vụ trong Swarm. Docker Swarm sẽ tự động quản lý và gán địa chỉ IP cho mỗi container trên overlay network khi nó khởi tạo hoặc update ứng dụng.
Service discovery
: Swarm manager node sẽ chỉ định mỗi dịch vụ trong Docker Swarm ứng với một tên DNS duy nhất và cân bằng tải các containers đang chạy. Ta có thể thực hiện truy vấn tất các containers đang chạy trong Swarm thông qua một DNS Server được nhúng vào Swarm.- Service discovery: Swarm manager node sẽ chỉ định mỗi dịch vụ trong Docker Swarm ứng với một tên DNS duy nhất và cân bằng tải các containers đang chạy. Ta có thể thực hiện truy vấn tất các containers đang chạy trong Swarm thông qua một DNS Server được nhúng vào Swarm.
- Load Balancing: Bạn có thể expose ports cho các dịch vụ tới một load balancer bên ngoài. Trong Swarm, cho phép bạn chỉ định làm thể nào để phân phối services giữa các node.
- Rolling Update: Tại một thời điểm, ta có thể áp dụng việc cập nhật ứng dụng cho các node một cách tăng dần. Swarm manager cho phép ta kiểm soát được thời gian delay giữa việc triển khai services tới các node khác. Nếu có lỗi phát sinh xảy ra, ta có thể quay lại phiên bản trước của services.
- High Availability, State Replication: Docker Swarm cho phép nhân bản trạng thái của Docker node trong Swarm. Hãy theo dõi thứ tự các hình ảnh sau để hiểu rõ hơn về tính năng này của Docker.
Nếu bạn nào đã tìm hiểu Kubernetes rồi thì thấy nó khá là giống cách vận hành chung của một Container Orchestration.
Một số khái niệm khi làm việc với Swarm
- node: Docker engine trên 1 máy tính hoặc cloud tham gia vào swarm
- manager node điều hành và quản lý các chức năng yêu cầu của cluster để duy trì trạng thái mong muốn trong swarm. manager node sẽ chọn một leader duy nhất để quản lý và điều hành tasks
- worker node có chức năng nhận và thực hiện tasks từ manager node.
- Service: định nghĩa một task được thực thi trong manager node hoặc worker node. Có 2 loại service
- replicated services: phân phối các bản sao của task với số lượng node (mặc định)
- global services: một task cho service trên tất cả các node trong cluster
- Task: là một container đang chạy, được coi là đơn vị dịch vụ swarm, được quản lý bởi Swarm manager, trái ngược với container độc lập. Task được gán cho một node, ta không thể thực hiện di chuyển nó đến node khác
- Load balancing: Swarm manager sử dụng ingress load balancing để expose services bạn ra bên ngoài. Có thể chỉ định PublishedPort hoặc sẽ lấy mặc định 30000-32676. Swarm manager sử dụng internal load balancing để phân phối request giữa các service trong cluster dựa trên tên DNS của service
- Routing mesh: Với Docker Swarm, tất cả các node đều được sử dụng routing mesh định tuyến tất cả các request tới một node có container đang chạy, tức là có thể truy cập tới service theo bất kỳ địa chỉ IP của node nào
Triển khai Docker Swarm
Trong Lab này, mình sử dụng 3 máy CentOS đã cài Docker engine
curl -sSL https://get.docker.com/ | sudo sh
sudo usermod -aG docker `whoami`
systemctl start docker.service
systemctl enable docker.service
docker version
Cần mở các port sau (bạn có thể disable firewalld/iptables) hoặc mở rules với Security Group (với cloud):
Port | Protocol | Function |
---|---|---|
2377 | TCP | cluster management communications |
7946 | TCP/UDP | communication among nodes |
4789 | UDP | overlay network traffic |
firewall-cmd --add-port=2377/tcp --permanent
firewall-cmd --add-port=7946/tcp --permanent
firewall-cmd --add-port=7946/udp --permanent
firewall-cmd --add-port=4789/udp --permanent
firewall-cmd --reload
Ở đây mình có 3 máy docker node:
- test-swarm-1: 172.31.27.41 (manager)
- test-swarm-2: 172.31.29.21 (worker)
- test-swarm-3: 172.31.31.137 (worker)
Khởi tạo Docker Swarm
sudo docker swarm init --advertise-addr 172.31.27.41
Chạy lệnh trên để 2 node còn lại join swarm (xem lại bằng docker swarm join-token manager
)
Kiểm tra các node trong swarm
sudo docker node ls
Triển khai dịch vụ
Để triển khai dịch vụ trong Swarm sẽ sử dụng docker service thay vì docker container
sudo docker service create --name docker-nginx -p 8080:80 --replicas 2 nginx
sudo docker service ls
Mở trình duyệt và kiểm tra tại port 8080
Scale service trong Swarm
sudo docker service scale docker-nginx=3
sudo docker service ls