Sunday, September 29, 2024

[Docker] Phần 14 – Chạy dịch vụ trên Swarm

-

Docker Swarm là một công cụ quản lý container được tích hợp sẵn trong Docker để quản lý các ứng dụng đa-container trên một số máy chủ. Khi chạy dịch vụ trên Docker Swarm, có một số lưu ý sau đây:

  • Cần chắc chắn rằng môi trường Swarm đã được thiết lập và chạy trên tất cả các nút máy chủ trong Swarm cluster. Nếu chưa có, bạn có thể bắt đầu bằng cách chạy lệnh “docker swarm init” để khởi tạo một nút quản trị.
  • Khi triển khai dịch vụ trên Swarm, cần đảm bảo rằng ứng dụng của bạn đã được đóng gói vào một hoặc nhiều container.
  • Cần tạo một dịch vụ mới bằng cách sử dụng lệnh “docker service create” và đặt các tùy chọn và tham số cho dịch vụ đó.
  • Để tạo các container trên các nút máy chủ, Swarm sử dụng các máy chủ từ pool máy chủ được chỉ định trước đó. Các máy chủ này cần có đủ tài nguyên để chạy các container được yêu cầu.
  • Cần đảm bảo rằng mô hình dịch vụ của bạn được thiết kế sao cho dịch vụ của bạn sẽ hoạt động đúng cách trong môi trường Swarm. Ví dụ: cần cân nhắc các yêu cầu về mạng, bảo mật và tài nguyên của ứng dụng.
  • Để giám sát và quản lý dịch vụ của bạn, có thể sử dụng các công cụ như Docker CLI, Docker Compose hoặc các công cụ mở rộng khác như Portainer.
  • Cần đảm bảo rằng các container trong dịch vụ của bạn đang chạy và hoạt động đúng cách bằng cách sử dụng các công cụ giám sát container như Prometheus hoặc cài đặt các giải pháp giám sát của bên thứ ba.

Ví dụ để chạy Prometheus trên Swarm với replicas 5, bạn sử dụng cú pháp như dưới:

$ docker service create --replicas 5 -p 9090:9090 -p 9091:9091 --name=monitor prom/prometheus
fwnplmpqbthx9ag7g5q25xa4f
overall progress: 5 out of 5 tasks
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged 

Các trường trong lệnh “docker service create –replicas 5 -p 9090:9090 –name=monitor prom/prometheus” được giải thích như sau:

  • “docker service create”: Tạo một dịch vụ mới trong Docker Swarm.
  • “–replicas 5”: Định nghĩa số lượng container được tạo ra cho dịch vụ này. Trong trường hợp này, có 5 container được tạo ra.
  • “-p 9090:9090”: Cài đặt ánh xạ cổng (port mapping) để liên kết cổng 9090 của container với cổng 9090 trên máy chủ Docker host. Điều này cho phép bạn truy cập vào dịch vụ từ bên ngoài container.
  • “–name=monitor”: Đặt tên cho dịch vụ được tạo ra, trong trường hợp này là “monitor”.
  • “prom/prometheus”: Đây là tên của hình ảnh container mà Docker sẽ sử dụng để tạo container cho dịch vụ. Trong trường hợp này, hình ảnh được sử dụng là “prom/prometheus”, được sử dụng để triển khai Prometheus – một hệ thống giám sát mã nguồn mở.

Kết quả khi triển khai thành công:

$ docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                     PORTS
hldh1597j7z0   monitor   replicated   10/10      prom/prometheus:latest   *:9090-9091->9090-9091/tcp

Bạn sử dụng lệnh “docker service ps <tên service>”, bạn sẽ có kết quả trả về của lệnh Docker CLI để hiển thị thông tin về các replica của dịch vụ đang chạy trên Docker Swarm.

$ docker service ps monitor
ID             NAME        IMAGE                    NODE                 DESIRED STATE   CURRENT STATE           ERROR     PORTS
r3pslfaidp2r   monitor.1   prom/prometheus:latest   docker-swarm-1.com   Running         Running 6 minutes ago             
l2m2nxkph6q8   monitor.2   prom/prometheus:latest   docker-swarm-3.com   Running         Running 6 minutes ago             
qr6p580v64j3   monitor.3   prom/prometheus:latest   docker-swarm-2.com   Running         Running 6 minutes ago             
yinp2o8zpmvr   monitor.4   prom/prometheus:latest   docker-swarm-3.com   Running         Running 6 minutes ago             
7fchszaewtz1   monitor.5   prom/prometheus:latest   docker-swarm-2.com   Running         Running 6 minutes ago 

Một số trường giải thích cho bảng thông tin này:

  • ID: là mã duy nhất được tạo để xác định replica, nó được sử dụng trong các lệnh khác để định danh replica đó.
  • NAME: là tên của replica, nó được tạo bằng cách kết hợp tên dịch vụ và số thứ tự của replica.
  • IMAGE: là tên và phiên bản của image được sử dụng để tạo ra các replica của dịch vụ.
  • NODE: là tên của nút Swarm mà replica đang chạy trên đó.
  • DESIRED STATE: là trạng thái mong muốn của replica, có thể là “Running” hoặc “Shutdown”.
  • CURRENT STATE: là trạng thái hiện tại của replica, có thể là “Running”, “Pending”, “Shutdown”, hoặc “Failed”.
  • ERROR: là thông báo lỗi (nếu có) được liên kết với replica đó.
  • PORTS: là cổng được liên kết với replica đó (nếu có).

Trong trường hợp này, dịch vụ “monitor” có 5 replica đang chạy trên các nút Swarm khác nhau. Tất cả các replica đều đang ở trạng thái “Running” và không có lỗi nào được phát hiện. Mỗi replica đang sử dụng image “prom/prometheus:latest” để tạo ra container của nó.

Trong trường hợp của mình đang có 2 container đang chạy trên Node 3, chúng ta kiểm tra và kết quả như dưới.

root@docker-swarm-3:~# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                        NAMES
83eced29853d   prom/prometheus:latest   "/bin/prometheus --c…"   9 minutes ago   Up 9 minutes   *:9090-9091->9090-9091/tcp   monitor.4.yinp2o8zpmvrbrjd1496uikdy
0fb69184a9a7   prom/prometheus:latest   "/bin/prometheus --c…"   9 minutes ago   Up 9 minutes   *:9090-9091->9090-9091/tcp   monitor.2.l2m2nxkph6q8zb4j6n150za3x

Nếu chúng ta xóa một container trong Docker Swarm, việc xử lý sẽ phụ thuộc vào cách replica của dịch vụ được cấu hình.

Nếu replica đang được cấu hình để sử dụng chế độ “replicated”, tức là chạy nhiều bản sao của container trên các nút khác nhau của Swarm, thì một replica mới sẽ được tạo ra để thay thế cho replica đã bị xóa. Điều này sẽ đảm bảo rằng số lượng replica của dịch vụ luôn đạt mức mong muốn và các replica sẽ được phân bố đều trên các nút của Swarm.

Nếu replica đang sử dụng chế độ “global”, tức là chỉ chạy một bản sao của container trên mỗi nút của Swarm, thì container bị xóa sẽ không được thay thế. Tuy nhiên, nếu một nút bị hỏng hoặc mất kết nối, Docker Swarm sẽ tự động tạo ra một container mới trên một nút khác để đảm bảo rằng dịch vụ vẫn hoạt động đúng như mong muốn.

Tóm lại, khi xóa một container trong Docker Swarm, hệ thống sẽ tự động xử lý để đảm bảo rằng số lượng replica đủ để đáp ứng nhu cầu và dịch vụ vẫn hoạt động đúng như mong muốn.

Ví dụ mình xóa đi 1 container trên Node 3, chúng ta dùng lệnh docker ps để lấy ID Container trước.

root@docker-swarm-3:~# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                        NAMES
83eced29853d   prom/prometheus:latest   "/bin/prometheus --c…"   9 minutes ago   Up 9 minutes   *:9090-9091->9090-9091/tcp   monitor.4.yinp2o8zpmvrbrjd1496uikdy
0fb69184a9a7   prom/prometheus:latest   "/bin/prometheus --c…"   9 minutes ago   Up 9 minutes   *:9090-9091->9090-9091/tcp   monitor.2.l2m2nxkph6q8zb4j6n150za3x

Sau đó tiến hành xóa container.

root@docker-swarm-3:~# docker rm -f 83eced29853d

Kết quả sau khi xóa, container có id là 83eced29853d đã bị xóa khỏi Node 3.

root@docker-swarm-3:~# docker ps 
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                        NAMES
0fb69184a9a7   prom/prometheus:latest   "/bin/prometheus --c…"   13 minutes ago   Up 13 minutes   *:9090-9091->9090-9091/tcp   monitor.2.l2m2nxkph6q8zb4j6n150za3x

Vào node leader kiểm tra, Swarm đã phát hiện container bị down.

$ docker service ps monitor
ID             NAME            IMAGE                    NODE                 DESIRED STATE   CURRENT STATE            ERROR                         PORTS
r3pslfaidp2r   monitor.1       prom/prometheus:latest   docker-swarm-1.com   Running         Running 13 minutes ago                                 
l2m2nxkph6q8   monitor.2       prom/prometheus:latest   docker-swarm-3.com   Running         Running 13 minutes ago                                 
qr6p580v64j3   monitor.3       prom/prometheus:latest   docker-swarm-2.com   Running         Running 13 minutes ago                                 
fojbsyn7nkfn   monitor.4       prom/prometheus:latest   docker-swarm-1.com   Running         Running 44 seconds ago                                 
yinp2o8zpmvr    \_ monitor.4   prom/prometheus:latest   docker-swarm-3.com   Shutdown        Failed 51 seconds ago    "task: non-zero exit (137)"   
7fchszaewtz1   monitor.5       prom/prometheus:latest   docker-swarm-2.com   Running         Running 13 minutes ago

Và nó đã tạo lại container bổ sung trên node 1.

root@docker-swarm-1:~# docker ps 
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                        NAMES
85ee9ad9d306   prom/prometheus:latest   "/bin/prometheus --c…"   37 seconds ago   Up 30 seconds   *:9090-9091->9090-9091/tcp   monitor.4.fojbsyn7nkfna40x5r6wv0tu4
e54802ec661b   prom/prometheus:latest   "/bin/prometheus --c…"   13 minutes ago   Up 13 minutes   *:9090-9091->9090-9091/tcp   monitor.1.r3pslfaidp2rqyvto8d70derk

Sử dụng lệnh dưới để kiểm tra logs service.

docker service logs monitor

Để kiểm tra resource, bạn sử dụng lệnh:

$ docker stats
CONTAINER ID   NAME                                  CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O    PIDS
85ee9ad9d306   monitor.4.fojbsyn7nkfna40x5r6wv0tu4   0.00%     25.41MiB / 15.66GiB   0.16%     1.34kB / 250B     0B / 0B      9
e54802ec661b   monitor.1.r3pslfaidp2rqyvto8d70derk   0.00%     29.24MiB / 15.66GiB   0.18%     88.7kB / 2.29MB   254kB / 0B   10

Để xóa dịch vụ, bạn sử dụng lệnh.

docker service rm <tên-service>

Bạn có thể thay đổi số lượng container để chạy dịch vụ bằng lệnh dưới.

$ docker service scale monitor=10
monitor scaled to 10
overall progress: 10 out of 10 tasks 
1/10: running   [==================================================>] 
2/10: running   [==================================================>] 
3/10: running   [==================================================>] 
4/10: running   [==================================================>] 
5/10: running   [==================================================>] 
6/10: running   [==================================================>] 
7/10: running   [==================================================>] 
8/10: running   [==================================================>] 
9/10: running   [==================================================>] 
10/10: running   [==================================================>] 
verify: Service converged

Trong trường hợp này, lệnh “docker service scale monitor=10” được sử dụng để tăng số lượng replica của dịch vụ “monitor” lên 10. Điều này có nghĩa là Docker Swarm sẽ tạo ra thêm 5 replica mới của dịch vụ này để đáp ứng nhu cầu, vì trước đó dịch vụ chỉ có 5 replica.

Khi số lượng replica được tăng lên, Docker Swarm sẽ tự động tạo các replica mới trên các nút khác nhau của Swarm để đảm bảo rằng số lượng replica được phân bố đồng đều và dịch vụ vẫn hoạt động đúng như mong muốn.

Việc tăng số lượng replica của dịch vụ này có thể giúp tăng hiệu suất và đáp ứng nhu cầu của ứng dụng mà dịch vụ đó đang phục vụ. Tuy nhiên, cần lưu ý rằng việc tăng replica cũng sẽ tăng tài nguyên tiêu thụ của ứng dụng, bao gồm CPU, bộ nhớ và dung lượng lưu trữ.

Bây giờ chúng ta thử login Prometheus bằng trình duyệt node 1.

Node 2.

Và node 3.

Bây giờ chúng ta thử cập nhật phiên bản mới cho container, mình sẽ sử dụng 1 image khác làm ví dụ cho version mới, ví dụ là Pushgateway.

docker service update —-image=prom/pushgateway monitor

“Docker service update” là một lệnh Docker CLI để cập nhật một dịch vụ đang chạy trên Docker Swarm. Trong trường hợp này, lệnh “docker service update –image=prom/pushgateway monitor” được sử dụng để cập nhật hình ảnh của dịch vụ “monitor” bằng hình ảnh mới từ registry “prom/pushgateway”.

Việc cập nhật hình ảnh của một dịch vụ có thể là cần thiết để đảm bảo rằng ứng dụng của chúng ta đang sử dụng phiên bản mới nhất của hình ảnh. Khi chúng ta cập nhật hình ảnh, Docker Swarm sẽ tự động tải hình ảnh mới từ registry và triển khai các bản sao mới của container trên các nút của Swarm.

Trong trường hợp này, khi chúng ta chạy lệnh “docker service update –image=prom/pushgateway monitor”, Docker Swarm sẽ cập nhật hình ảnh của dịch vụ “monitor” bằng hình ảnh mới từ registry “prom/pushgateway”. Điều này có nghĩa là các bản sao container mới sẽ được tạo ra và triển khai trên các nút của Swarm với hình ảnh mới này.

Tuy nhiên, cần lưu ý rằng việc cập nhật hình ảnh của dịch vụ này có thể làm thay đổi các thông số cấu hình khác của dịch vụ, ví dụ như port, môi trường, cấu hình mạng, v.v. Do đó, trước khi cập nhật hình ảnh của dịch vụ, chúng ta cần kiểm tra kỹ các thông số này để đảm bảo rằng việc cập nhật không ảnh hưởng đến sự hoạt động của ứng dụng.

Lưu ý là trong quá trình cập nhật thì dịch vụ vẫn chạy bình thường ở phiên bản cũ cho đến khi phiên bản mới được cập nhật xong.

Và sau khi thay thế xong, bạn có kết quả, mình sử dụng port 9091 thay thế cho port 9090 vì prom/pushgateway sử dụng port này nhé.

Và bạn có thể thấy, container trước đây chạy prom/prometheus đã chuyển sang chạy prom/pushgateway.

$ docker service ps monitor
ID             NAME             IMAGE                     NODE                 DESIRED STATE   CURRENT STATE            ERROR     PORTS
610fpmrjmtnp   monitor.1        prom/pushgateway:latest   docker-swarm-2.com   Running         Running 2 minutes ago              
12t790s2fy1t    \_ monitor.1    prom/prometheus:latest    docker-swarm-2.com   Shutdown        Shutdown 2 minutes ago             
gtigiqhqmtn0   monitor.2        prom/pushgateway:latest   docker-swarm-1.com   Running         Running 2 minutes ago              
yh9wxar02rte    \_ monitor.2    prom/prometheus:latest    docker-swarm-1.com   Shutdown        Shutdown 2 minutes ago             
qfelhweap2wl   monitor.3        prom/pushgateway:latest   docker-swarm-3.com   Running         Running 2 minutes ago              
k05vdpj4olgh    \_ monitor.3    prom/prometheus:latest    docker-swarm-3.com   Shutdown        Shutdown 2 minutes ago             
ookxna0dm0ue   monitor.4        prom/pushgateway:latest   docker-swarm-1.com   Running         Running 2 minutes ago              
z1t4o1n7z2ny    \_ monitor.4    prom/prometheus:latest    docker-swarm-1.com   Shutdown        Shutdown 2 minutes ago             
mjcd4ma8llkt   monitor.5        prom/pushgateway:latest   docker-swarm-3.com   Running         Running 2 minutes ago              
rjc4pblrp93n    \_ monitor.5    prom/prometheus:latest    docker-swarm-3.com   Shutdown        Shutdown 2 minutes ago             
nb6lxi5w66hu   monitor.6        prom/pushgateway:latest   docker-swarm-2.com   Running         Running 2 minutes ago              
f2yd46sruweh    \_ monitor.6    prom/prometheus:latest    docker-swarm-2.com   Shutdown        Shutdown 2 minutes ago             
j8czkiyz44vq   monitor.7        prom/pushgateway:latest   docker-swarm-1.com   Running         Running 2 minutes ago              
52qloqip6w49    \_ monitor.7    prom/prometheus:latest    docker-swarm-2.com   Shutdown        Shutdown 2 minutes ago             
2h77bwu3sk1s   monitor.8        prom/pushgateway:latest   docker-swarm-2.com   Running         Running 2 minutes ago              
d4zioszsbv67    \_ monitor.8    prom/prometheus:latest    docker-swarm-2.com   Shutdown        Shutdown 2 minutes ago             
z4h56ss82zm6   monitor.9        prom/pushgateway:latest   docker-swarm-1.com   Running         Running 2 minutes ago              
mwih85c1i1yq    \_ monitor.9    prom/prometheus:latest    docker-swarm-1.com   Shutdown        Shutdown 2 minutes ago             
93gv3a4ropmw   monitor.10       prom/pushgateway:latest   docker-swarm-3.com   Running         Running 2 minutes ago              
0davabnc3ffn    \_ monitor.10   prom/prometheus:latest    docker-swarm-3.com   Shutdown        Shutdown 2 minutes ago

Chúng ta có thể giới hạn resource của container, ví dụ giới hạn mức sử dụng Ram.

docker service update --limit-memory 100MB monitor

Hoặc giới hạn mức sử dụng CPU cho các container, giá trị 0.5 tức là chỉ sử dụng 50% cho 1 core cpu.

docker service update --limit-cpu 0.5 monitor

Bạn có thể bấm vào đây để xem các lệnh hỗ trợ.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories