1. Chuẩn bị môi trường
Bảng cấu hình ban đầu:
| Tên máy | Địa chỉ IP | Vai trò |
|---|---|---|
| control-node | 192.168.10.10 | Quản trị |
| worker-01 | 192.168.10.11 | Xử lý |
| worker-02 | 192.168.10.12 | Xử lý |
2. Đặt tên máy chủ
Thực hiện trên từng node:
# Trên máy chủ quản trị
sudo hostnamectl set-hostname control-node
exec bash
# Trên worker-01
sudo hostnamectl set-hostname worker-01
exec bash
# Trên worker-02
sudo hostnamectl set-hostname worker-02
exec bash
3. Cấu hình đồng bộ thời gian
sudo timedatectl set-ntp true
sudo systemctl restart systemd-timesyncd
4. Cấu hình Docker trên node quản trị
Sửa file service để kích hoạt API:
sudo sed -i 's|ExecStart=/usr/bin/dockerd|ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock|' /lib/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
Kiểm tra cổng hoạt động:
sudo netstat -tuln | grep 2375
5. Khởi tạo cụm Swarm
Trên control-node:
docker swarm init --advertise-addr 192.168.10.10 --listen-addr 192.168.10.10:2377
Output mẫu:
Swarm initialized: current node (abc123) is now a manager.
To add a worker to this swarm, run:
docker swarm join --token SWMTKN-1-xyz 192.168.10.10:2377
6. Thêm node vào cụm
Trên worker-01 và worker-02:
# Mở cổng cần thiết trước
sudo ufw allow 2377/tcp
sudo ufw allow 7946/tcp
sudo ufw allow 7946/udp
sudo ufw allow 4789/udp
# Tham gia cụm
docker swarm join --token SWMTKN-1-xyz 192.168.10.10:2377
Kiểm tra trạng thái:
docker node ls
# Output:
# ID HOSTNAME STATUS AVAILABILITY MANAGER
# abc123 * control-node Ready Active Leader
# def456 worker-01 Ready Active
# ghi789 worker-02 Ready Active
7. Triển khai dịch vụ Nginx
Tạo mạng overlay:
docker network create --driver overlay web-net
Triển khai dịch vụ:
docker service create \
--name web-service \
--replicas 3 \
--network web-net \
--publish published=8080,target=80 \
nginx:alpine
Kiểm tra phân bố tác vụ:
docker service ps web-service
# Output:
# NAME NODE STATUS
# web-service.1 control-node Running
# web-service.2 worker-01 Running
# web-service.3 worker-02 Running
8. Điều chỉnh số lượng bản sao
# Mở rộng thành 5 instance
docker service scale web-service=5
# Thu nhỏ về 2 instance
docker service scale web-service=2
9. Xử lý sự cố node
Khi worker-02 ngừng hoạt động:
docker node ls
# worker-02 sẽ hiển thị trạng thái 'Down'
Swarm tự động di chuyển tác vụ sang node còn hoạt động. Khi node phục hồi:
# Node sẽ tự động kết nối lại
docker node inspect worker-02 --format '{{.Status.State}}'
# Output: Ready
10. Sử dụng volume chia sẻ
Tạo volume trên tất cả node:
docker volume create shared-data
Triển khai dịch vụ với volume:
docker service create \
--name nginx-shared \
--replicas 3 \
--mount type=volume,source=shared-data,destination=/usr/share/nginx/html \
--network web-net \
--publish 9090:80 \
nginx:alpine
Thêm nội dung kiểm thử:
# Trên mỗi node
echo "Node: $(hostname)" | sudo tee /var/lib/docker/volumes/shared-data/_data/index.html
Kiểm tra cân bằng tải:
for i in {1..6}; do curl http://192.168.10.10:9090; done
# Output sẽ luân phiên tên các node
11. Tối ưu hiệu năng
Điều chỉnh thời gian kiểm tra trạng thái:
docker swarm update --dispatcher-heartbeat 30s
Giải pháp thay thế cho môi trường mạng chậm:
docker swarm join-token worker | sed 's/2377/2377 --heartbeat 15s/g' | bash