Thiết lập cụm Docker Swarm và triển khai dịch vụ tự động

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

Thẻ: docker-swarm overlay-network service-scaling load-balancing volume-mounting

Đăng vào ngày 13 tháng 6 lúc 03:59