Vì sao cần Docker Swarm ?
Trong quy trình phát triển, quản lý và vận hành, scale cũng như deploy project của tín đồ với việc dùng lệnh của Docker để deploy thì lúc đầu project nhỏ chỉ việc chạy một host(vps) nên không hề có vấn đề gì cả. Tuy nhiên khi project đó vì một vài yêu cầu hoặc lý do gì đó phải cần thêm nhiều host hoặc rất nhiều host(vps). Lúc này tín đồ khó hoàn toàn có thể quản lý và vận hành, scale và cũng không thể nào dùng lệnh để đi deploy lên từng con host(vps) điều đó rất vật vã. Biết được nỗi lòng đó Docker đã phát triển thêm vào cho ta cái gọi là Docker Swarm.
Docker Swarm là gì ?
Docker Swarm là phương tiện native clustering cho Docker. Được chấp nhận ta hoàn toàn có thể gom một vài Docker host lại với nhau thành dạng cụm (cluster) và ta có xem nó như một sever 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 hoạt động. Và Swarm mode hỗ trợ cho ta những tính năng để quản lý và vận hành và điều phối cluster.
Tính năng Docker Swarm
- Cluster management integrated with Docker Engine: Quản lý và vận hành cluster với Docker Engine bằng việc tận dụng Docker CLI để tạo swarm.
- Decentralized design: Docker Swarm được thiết kế dạng phân cấp. Thay vì xử lý sự khác lạ giữa những roles của node tại thời khắc triển khai, Docker Engine xử lý ngẫu nhiên trình độ chuyên môn hoá nào khi runtime. Chúng ta cũng có thể triển khai cả hai loại node: managers và worker bằng Docker Engine.
- Declarative service model: Docker Engine tận dụng phương thức khai báo làm cho phép tín đồ define trạng thái mong muốn của những dịch vụ không giống nhau trong stack ứng dụng của tín đồ. VD: Chúng ta cũng có thể mô tả ứng dụng bao gồm tất cả: web front-end với service message queueing và database back-end.
- Scaling: So với mỗi service chúng ta có thể khai báo số lượng task mà bạn thích run. Khi tín đồ scale up hoặc down thì swarm manager sẽ tự động hóa thêm hoặc xoá task để duy trì trạng thái mong muốn.
- Desired state reconciliation: Hãy tưởng tượng tín đồ thiết lập một service run 10 replicas của một container và một worker machine (host/vps) đang giữ 2 trong số 10 replicas đó gặp sự cố bị crash, lúc này swarm manager sẽ tiến hành tạo thêm 2 replicas mới để thay làm cho 2 replicas đã trở nên crash đó và tiến hành chuyển 2 replicas mới này cho những worker đang run.
- Multi-host networking: Chúng ta cũng có thể chỉ định một overlay network cho những services của tôi. Swarm manager sẽ tự động hóa gán địa chỉ IP cho những container trên overlay network khi nó khởi tạo và update application.
- Service discovery: Swarm manager node gán mỗi service trong swarm một DNS duy nhất và chúng ta có thể truy vấn được trải qua DNS này.
- Load balancing: Hoàn toàn có thể expose những port cho những services tới load balance để tiếp xúc với bên phía ngoài.
- Secure by default: Những service tiếp xúc với nhau trải qua giao thức bảo mật thông tin TLS. Chúng ta cũng có thể tuỳ chỉnh tận dụng chứng thư ký tự root hoặc chứng thư từ một custom root CA.
- Rolling updates: Swarm giúp tín đồ update image của service một kiểu trọn vẹn tự động hóa. Swarm manager giúp tín đồ kiểm soát độ trễ giữa service deploy tới những node không giống nhau và chúng ta có thể rolling back bất kể lúc nào.
Kiến trúc Swarm
Bao gồm tất cả những Manager và những Worker. Người tiêu dùng hoàn toàn có thể khai báo trạng thái mong muốn của nhiều service để chạy trong Swarm tận dụng YAML files.
- Swarm: là một cluster của một hoặc nhiều Docker Engine đang run (ví dụ ở đó là những node) trong cơ chế Swarm, thay vì phải chạy những container bằng câu lệnh thì ta sẽ thiết lập những services để phân chia những phiên bản replicas tới những node.
- Node: Một node là một máy vật lý hay máy ảo đang run phiên phiên bản Docker Engine trong cơ chế Swarm. Node sẽ gồm hai loại: Manager Node và Worker Node.
- Manager Node: Là node nhận những define service từ user, nó quản lý và vận hành và điều phối những task đến những node Worker. Theo mặc định node Manager cũng rất được xem là node Worker.
- Worker Node: là node nhận và thực thi những task từ node Manager.
- Service: Một service xác định image của container và số lượng những replicas (phiên bản sao) mong muốn khởi chạy trong swarm.
- Task: là một tác vụ mà node worker phải triển khai. Tác vụ này sẽ do node Manager phân chia xuống. Một task mang một Docker Container và những lệnh để chạy bên container.
Thao tác với Docker Swarm
Trong phần này ta sẽ tiến hành thực hiện với Docker Swarm trải qua demo nhỏ. Thứ nhất ta cần 4 máy ảo (vps ảo) để tạo những máy ảo ta tận dụng câu lệnh sau:
$ docker-machine create <machine-namevàgt;
Trong số đó:
- <machine-namevàgt;: tên máy ảo bạn thích đặt.
Tạo machine(máy ảo) cho swarm manager:
$ docker-machine create manager
Tiếp đến là những machine cho swarm worker theo lần lượt là : worker1, worker2, worker3.
$ docker-machine create worker1 $ docker-machine create worker2 $ docker-machine create worker3
Sau thời điểm tạo xong ta kiểm tra list machine:
$ docker-machine ls
Lúc này ta tận dụng lệnh inspect thử xem thông tin của một machine
$ docker-machine inspect manager
Thường trông thấy một vài thông tin cơ phiên bản về machine như: địa chỉ IP, MachineName (tên do ta đặt), SSHKey để hoàn toàn có thể truy vấn vào machine trải qua SSHKey này, thông tin về CPU ( 1 CPU), Memory ( 1GB), ….
Việc setup những machine đã hoàn thành giờ ta tiến hành khởi tạo swarm trên con manager nhé và để truy vấn vào con manager hay những con worker thì ta tận dụng trải qua SSH ví dụ như sau:
$ docker-machine ssh <name-machinevàgt;
Ở đây:
- <name-machinevàgt; = manager
Và để quay trở về host local:
$ exit
Khởi tạo swarm
$ docker swarm init -advertise-addr <IP Machinevàgt;
Nếu tín đồ đang tận dụng Docker Desktop for Mac hoặc Docker Desktop for Windows thì chỉ việc docker swarm init . Nhưng ở đây Operating System là Boot2Docker nên buộc phải có flag -advertise-addr.
Kiểm tra list node hiện đang sẵn có trong swarm
$ docker node ls
Những node (machine/vps) là manager thì mới có thể có xem list này và dấu * cho biết thêm tín đồ đang ở node manager nào trong swarm. Ở đây ta chỉ có một node manager và node này đang ở status Ready. OK ! vậy là xong nhiệm vụ ở con manager.
Giờ ta chuyển qua thao tác làm việc trên con worker1 nhé. Tại worker1 ta tiến hành join nó vào swarm như một worker:
$ docker swarm join -token <tokenvàgt; <hostvàgt;:<portvàgt;
Trong số đó:
- host: Địa chỉ ip của con manager.
- port: Cổng port của con manager.
Để lấy thông tin về token thì trên con manager của swarm đó ta tận dụng lệnh
$ docker swarm join-token <worker|managervàgt;
Trên hai con worker2 và worker3 ta cũng làm tương tự
Lưu ý: một node worker chỉ hoàn toàn có thể join vào trong 1 swarm.
Trên node manager ta kiểm tra lại list node Thường trông thấy 3 node worker kia có chung 1 status là rỗng tại cột MANAGER STATUS. Điều này cho ta biết chúng là node worker.
Vậy là ta đã tạo thành công 3 con worker và 1 con manager và gom chúng thành một swarm (cluster).
Một thắc mắc được đưa ra ở đó là vì sao ở đây ta không tận dụng cái swarm mà ta đã tiết ra ở Phần 3 tại máy host local (Docker Desktop for Mac) và coi nó như một node manager để join những node khác vào swarm này mà lại tiết ra thêm một machine để làm node manager chi cho phí tài nguyên như vậy ? Thì lời giải đáp nằm ở Phần 3 (đã được nói rất rõ ràng) trên phiên phiên bản Docker Desktop for Mac không thể mở luồng định tuyến tới những machine nên việc ta nỗ lực join những node (machine/vps) vào swarm với manager swarm là host local là vô tác dụng. Này cũng đó là điểm yếu kém khi triển khai networking trên OSX.
Lúc này ta tiếp tục tiết ra service và những replicas cũng như deploy trên node manager.
Để làm được điều này ta cần config file docker-compose.yml:
version: ‘3’ services: webreactjs: image: quanphamptit/docker-swarm-demo:webreactjs_1 build: . ports: – 3000:3000 restart: always networks: – my-net deploy: mode: replicated replicas: 3 servergo: image: quanphamptit/docker-swarm-demo:servergo_1 build: . ports: – 8080:8080 restart: always networks: – my-net deploy: mode: replicated replicas: 3 networks: my-net: driver: overlay
và copy file docker-compose.yml mà ta đã config qua bên con manager:
$ docker-machine scp filesource name-machine:/path-docker-machine/
Trong demo này:
$ docker-machine scp ~/Workspace/gocode/docker-swarm-demo/docker-compose.yml manager:/home/docker/docker-compose.yml
Tiếp theo ta cần push 2 image mà ở Phần 2 ta đã tận dụng lên repository trên hub.docker nhé:
$ docker tag <imagevàgt; <usernamevàgt;/<repository-namevàgt;:<tag-namevàgt; $ docker push <usernamevàgt;/<repository-namevàgt;
Trong số đó:
-
<imagevàgt; : Id image bạn thích push
-
<usernamevàgt;: là username trên hub.docker của tín đồ.
-
<repository-namevàgt;: tên repository bạn thích đặt.
-
<tag-namevàgt;: tên tag bạn thích đặt cho image được push lên đó.
Trên Docker Hub
Vậy là ta đã push thành công 2 image và giờ ta cần deploy stack :
$ docker stack deploy -c /home/docker/docker-compose.yml swarm-demo-app
Kiểm tra list services:
Ta thử xem những phiên bản replicas này đang hoạt động trên những node nào nhé:
Ngoài ra chúng ta có thể tạo service dùng lệnh với cú pháp như sau:
$ docker service create -replicas <task-numbervàgt; -name <service-namevàgt; <ID-Imagevàgt; <commandvàgt;
Trong số đó:
- <task-numbervàgt;: số task bạn thích tiết ra ( hay nói cách khác là số phiên bản sao của image/container).
- <service-namevàgt;: tên service bạn thích đặt.
- <ID-Imagevàgt;: ID của image/container.
- <commandvàgt;: lệnh muốn chạy.
Và ta hoàn toàn có thể thay đổi số container của cluster một kiểu nhanh gọn lẹ bằng câu lệnh sau:
$ docker service scale <service-namevàgt;=<numbervàgt;
Trong số đó :
- <service-namevàgt;: tên service mà ta muốn đổi số container.
- <numbervàgt;: Số container mong muốn.
Tiếp theo ta sẽ xem thử liệu tính năng load balancing hoạt động và sinh hoạt thế nào nhé ?
Ta thấy trên con node worker3 không hề có giữ replicas của service servergo_1 nào cả. Ta tiến hành gửi request thử tới service servergo_1 trên con worker3 này xem sao nhé !
$ curl http://192.168.99.103:8080/api/v1/foods?id=2
Điều này Có nghĩa là khi ta gửi những request đến những node trong swarm. Những node này hoàn toàn có thể chứa một hoặc nhiều replicas của những service hoặc không hề chứa cái replicas nào cả thì Routing mesh của swarm sẽ chuyển tiếp những request đó đi qua ingress network tới Swarm Load Balancer, bộ balancer này sẽ phân chia request tới những container của những service ở những machine( host/vps của manager và worker) cùng chung một mạng swarm. Chúng ta cũng có thể xem hình sau để nắm rõ hơn:
Thử lại với những request khác:
Lúc này ta thử shutdown con machine worker1 ( như trên thực tiễn khi một server bị die ) xem có điều mới mẻ và lạ mắt gì không nhé !
$ docker-machine stop <machine-namevàgt;
Ở đây :
- <machine-namevàgt; = worker1
Kiểm tra lại list node và service trên node manager Chưa thấy gì mới mẻ và lạ mắt ngoài việc worker1 bị Down
Tiếp tục kiểm tra trên từng service
Tại đây ta đã thấy điều mới mẻ và lạ mắt đó. Khi worker1 bị Shutdown thì lúc này swarm manager sẽ tiến hành tạo thêm một replicas mới để thay để cho một replicas đã trở nên Shutdown đó và tiến hành chuyển 1 replicas mới này cho những worker đang run (ví dụ là worker3). Này cũng đó là tính năng Desired state reconciliation, Scaling đã được nói rõ trong phần Tính năng Docker Swarm.
Vậy vấn đề phát sinh ở đây khi toàn bộ node worker bị die thì điều gì sẽ xẩy ra tiếp theo ?
Trong trường hợp này node manager cũng sẽ tiến hành thêm những replicas để lành mạnh đủ số replicas mà ta đã config (mong muốn) và chạy trên chính con manager này ( tức thị node manager sẽ đóng vai trò là node worker luôn luôn). Và nếu con manager này die luôn luôn thì mọi chuyện coi như chấm hết !!.
Trường hợp trái lại nếu những node worker đang run nhưng con node manager bị die thì external storage sẽ ghi nhận điều đó và thông tin đến những manager node để lại trong cluster. Và external storage sẽ chọn một node manager ngẫu nhiên để làm Leader tiếp theo của cluster. Hiện nay tuy vậy hành với Docker Swarm ta còn tồn tại thêm một người tín đồ khác đó là Kubernetes (K8S). Và nó được triển khai thoáng rộng hơn Docker Swarm. Trong phần sau ta sẽ tìm hiểu những điều thú vị về nó nhé !!
Nếu bạn thích xem được những nội dung bài viết unique, hay thảo luận những tri thức, share hiểu biết của tín đồ đến mọi người, hãy tham gia group của bọn mình trên Facebook nhé: ^^