Container Orchestration and Rancher
1. Container Orchestration Như chúng ta đã biết, công nghệ điện toán đám mây thế hệ kế tiếp chỉ ra rằng container orchestration sẽ là một công nghệ cần phải biết trong tương lai ngắn. Container orchestration là các công cụ, dịch vụ dùng để điều phối và quản lý nhiều container sao cho chúng làm ...
1. Container Orchestration
Như chúng ta đã biết, công nghệ điện toán đám mây thế hệ kế tiếp chỉ ra rằng container orchestration sẽ là một công nghệ cần phải biết trong tương lai ngắn. Container orchestration là các công cụ, dịch vụ dùng để điều phối và quản lý nhiều container sao cho chúng làm việc một cách hiệu quả nhất. Khi người người sử dụng container, nhà nhà sử dụng container, các công ty cũng sử dụng container để deploy một cách rộng rãi hơn thì việc tìm ra một tool quản lý tất cả container trong hệ thống hạ tầng chúng ta có là một vấn đề cấp thiết.
Để giải quyết vấn đề đó, một số công ty đã phát triển các container orchestration tool như:
- Amazon ECS: là dịch vụ của amazon hỗ trợ container Docker và cho phép bạn chạy các ứng dụng trên một cụm quản lý của EC2 của Amazon.
- Azure container Service (ACS): dịch vụ của microsoft cho phép bạn tạo ra một cụm các máy ảo mà hoạt động như container host cùng với một máy master được sử dụng để quản lý các container ứng dụng.
- Google container Engine: được Google xây dựng trên Kubernetes, cho phép bạn chạy container Docker trên nền tảng đám mây của Google. Nó lập lịch đưa container vào cluster và quản lý chúng dựa trên yêu cầu người dùng xác định.
- Kubernetes: là một hệ thống orchestration cho các container Docker. Nó xử lý lập kế hoạch và quản lý khối lượng công việc dựa trên các thông số người dùng định nghĩa.
- Mesosphere Marathon: là một framework orchestration cho Apache Mesos được thiết kế để khởi động ứng dụng lâu dài. Nó cung cấp các tính năng quan trọng cho các ứng dụng đang chạy trong một môi trường cluster.
- Docker Swarm: là một công cụ giúp chúng ta tạo ra một clustering Docker. Nó giúp chúng ta gom nhiều Docker Engine lại với nhau và ta có thể "nhìn" nó như duy nhất một virtual Docker Engine. Tất nhiên là bất cứ công cụ nào có thể giao tiếp với Docker Engine thì cũng sẽ giao tiếp với Docker Swarm bình thường theo đúng chuẩn Docker API, và tất nhiên là trong suốt. Một cụm Swarm có thể được cấu hình và deploy thông qua Docker-Machine. Và theo như bài test của Docker thì họ có thể scale ra 30.000 container trên 1000 node AWS với chỉ một Swarm Manager. Bạn có thể xem nó tương tự như Kubernetes, nhưng theo Docker thì công cụ Swarm của họ lightweight và nhanh hơn gấp 5 lần so với Kubernetes. Và chúng ta sẽ cùng tìm hiểu về Docker Swarm.
2. Docker Swarm
Trước version 1.12, Docker Swarm là một tool/process chạy độc lập với Docker Engine. Docker Swarm làm nhiệm vụ clustering các host chạy Docker Engine lại thành một hệ thống duy nhất và cho phép người dùng chạy các Docker containers trên clustered-system đó.
Đến version 1.12 “swarm” đã được tích hợp vào Docker core và trở thành một native solution cho việc clustering/orchestration giữa các Docker hosts. Tuy cùng tên là “swarm” nhưng bản chất của Swarm-mode trong Docker 1.12 khác hẳn so với docker-swarm tool/process chạy độc lập trước đó. Swarm-mode trong Docker 1.12 được build dựa trên SwarmKit library – có kiến trúc tốt hơn cũng như khả năng scale tốt hơn so với docker-swarm tool.
Sau khi cài đặt xong Docker 1.12, việc sử dụng Swarm mode là vô cùng đơn giản: bạn chỉ cần chạy docker swarm init trên node đóng vai trò manager và chạy docker swarm join --token <token> $IP:PORT trên các node còn lại – các node đóng vai trò worker
root@test-registry:~# docker swarm init Swarm initialized: current node (4ubkww2a9t1sioibe5svo8czb) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-5sogjq50clr3x90vwg79mgdwkp0v8fvzdq6j1w2ifjy334zmp6-e99ast236g8go5t0hyfbliazx 10.0.1.129:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Trên node worker:
root@Vietdocker:~# docker swarm join --token SWMTKN-1-5sogjq50clr3x90vwg79mgdwkp0v8fvzdq6j1w2ifjy334zmp6-e99ast236g8go5t0hyfbliazx 10.0.1.129:2377 This node joined a swarm as a worker.
Kiểm tra các node có trong swarm
root@test-registry:~# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1nwel5c4phkbv0occmhogg1he Vietdocker Ready Active 4ubkww2a9t1sioibe5svo8czb * test-registry.framgia.com.vn Ready Active Leader
Swarm trong Docker 1.12 sẽ không còn cần đến các data-store bên ngoài như Consul hay etcd; sở dĩ vậy là vì trong SwarmKit đã được tích hợp sẵn một implementation của Raft (một consensus protocol/algorithm). Điều này khiến cho việc cài đặt và sử dụng Swarm trở nên cực kỳ đơn giản và nhẹ nhàng.
Trước khi tạo container trên swarm, chúng ta phải tạo 1 network overlay
root@test-registry:~# docker network create -d overlay net-test bjbdqlkb7uamkhg6wq982o00m
Việc start container trên Swarm được thực hiện qua command docker service thay vì docker run như thông thường.
root@test-registry:~# docker service create --name redis --network net-test redis 2e834udy3equrkfm8o1hlgoo6
Kiểm tra service redis vừa được tạo:
root@test-registry:~# docker service ps redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 09xtvqwi785d0j2zuv8831q8q redis.1 redis test-registry.framgia.com.vn Running Running 30 seconds ago
Việc scale số container chạy service redis có thể thực hiện dễ dàng bằng lệnh:
root@test-registry:~# docker service update --replicas 4 redis redis root@test-registry:~# docker service ps redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 09xtvqwi785d0j2zuv8831q8q redis.1 redis test-registry.framgia.com.vn Running Running 2 minutes ago ds8a3y8apc4ldvpwobf118sm0 redis.2 redis Vietdocker Running Running 14 seconds ago 66xuc5piodw04tafnjuqmyf7j redis.3 redis Vietdocker Running Running 8 seconds ago 4p0u8m8z8z819vz2hf9mjelse redis.4 redis test-registry.framgia.com.vn Running Running 16 seconds ago
Như chúng ta thấy, việc tạo ra các container chạy service redis là ngẫu nhiên xuất hiện trên các node trong Swarm. 2 container ở node manager và 2 container ở node worker.
Để test service redis có được load-balancing hay không, ta có thể tạo ra 1 container để test. miễn là cùng 1 network relay như vừa tạo lúc trước.
root@test-registry:~# docker service create --name test-redis --network net-test redis cak0wypiurzpg7ayw3y9zk3ds root@test-registry:~# docker service ps test-redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR bs3hkpw8k8fu8r31fchmr5z0h test-redis.1 redis test-registry.framgia.com.vn Running Running 27 seconds ago
Để thực hiện việc test, ta exec vào container vừa tạo và dùng redis-cli để kiểm tra:
root@test-registry:~# docker exec -it test-redis.1.bs3hkpw8k8fu8r31fchmr5z0h /bin/bash root@7ae10c84de5e:/data# redis-cli -h redis redis:6379> set name 1 OK redis:6379> exit root@7ae10c84de5e:/data# redis-cli -h redis redis:6379> set name 2 OK redis:6379> exit root@7ae10c84de5e:/data# redis-cli -h redis redis:6379> set name 3 OK redis:6379> exit root@7ae10c84de5e:/data# redis-cli -h redis redis:6379> set name 4 OK redis:6379> exit root@7ae10c84de5e:/data# redis-cli -h redis redis:6379> get name "3" redis:6379> exit root@7ae10c84de5e:/data# redis-cli -h redis redis:6379> get name "4" redis:6379> exit
Điều này chứng tỏ service redis đã Docker tự động load-balancing bằng DNS.
Trong trường hợp bạn không muốn dùng load-balancing qua DNS thì Swarm cũng cung cấp sẵn luôn một Virtual IP để bạn kết nối tới service redis. Ở đây là 10.0.0.2
root@test-registry:~# docker service inspect redis [ ... "Endpoint": { "Spec": { "Mode": "vip" }, "VirtualIPs": [ { "NetworkID": "bjbdqlkb7uamkhg6wq982o00m", "Addr": "10.0.0.2/24" } ] }, ... ]
Mình vừa giới thiệu qua cho các bạn về Docker Swarm. Vậy có bạn nào muốn quản lý trực tiếp qua giao diện, đơn giản trong khâu deploy hay quản lý môi trường của Docker Swarm không?
Nếu có thì mời các bạn xuống tiếp phần tiếp theo. Chúng ta sẽ cùng tìm hiểu 1 tool như vậy.
3. Rancher
3.1. Giới thiệu về Rancher
- Rancher là một nền tảng phần mềm mã nguồn mở cho phép các tổ chức chạy container trong production của mình. Cùng với Rancher, các công ty không còn phải build 1 container service platform từ đầu. Rancher sẽ cung cấp những phần mềm cần thiết để quản lý container trong production. Nó cung cấp các dịch vụ cơ sở hạ tầng như multi-host networking, cân bằng tải toàn cầu và địa phương, và snapshot. Nó tích hợp khả năng quản lý Docker như Docker Machine và Docker Swarm.
- Rancher là dự án khá mới, bắt đầu phát triển cách đây 2 năm. Với mục tiêu ban đầu là phát triển phần mềm để deploy và manage các container trong mọi công ty, chạy với mọi kiến trúc hạ tầng. Giờ đây Rancher đã trở hỗ trợ rất nhiều container orchestration như: Docker Swarm, Kubernetes và Mesos.
- Rancher gồm 4 thành phần chính:
- INFRASTRUCTURE ORCHESTRATION: Rancher lấy tài nguyên từ bất kì đâu hoặc private cloud chỉ cần có nhân Linux. Mỗi máy chủ Linux có thể là máy ảo hoặc máy vật lý, Rancher chỉ quan tâm tới CPU, memory, ổ cứng và kết nối mạng. Từ đó, Rancher sẽ tạo ra 1 instance dựa trên các phần cứng được chia sẻ.
- CONTAINER ORCHESTRATION AND SCHEDULING: nhiều người dùng chọn cách chạy container sử dụng 1 container orchestration và scheduling framework. Rancher bao gồm tất cả container orchestration phổ biến như: Docker Swarm, Kubernetes, và Mesos. Họ có thể tạo nhiều Swarm cluster hay Kubernetes. Và họ cũng có thể sử dụng native Swarm và Kubernetes tools để quản lý các ứng dụng của họ.
- APPLICATION CATALOG: người dùng Rancher có thể triển khai toàn bộ 1 cluster ứng dụng chứa multi-container từ catalog chỉ bằng 1 cái nhấn chuột.
- ENTERPRISE-GRADE CONTROL: Rancher hỗ trợ các plugin xác thực cùng với AD, LDAP và GitHub. Rancher cho phép người dùng share hoặc deny access đến môi trường phát triển và production.
Hình dưới đây minh họa các thành phần chính và các tính năng của Rancher.
3.2. RancherOS
Để chạy được Rancher, yêu cầu tối thiểu là các bạn cần có 1 máy chạy được Docker 1.10.3 trở lên và Ram 1GB. Nếu không, các bạn có thể down trực tiếp RancherOS trên GitHub. Mình nói thêm về RancherOS.
RancherOS là một bản tối giản hoàn hảo của Linux distribution cho chạy container Docker. Bằng cách chạy Docker trực tiếp bên trên của kernel và cung cấp dịch vụ Linux như container, rancheros chỉ cung cấp những gì bạn cần để build những thứ bạn muốn.
RancherOS là cách tiện lợi và dễ nhất để chạy container trong production, và chỉ bao gồm các dịch vụ cần thiết để chạy Docker. Bằng cách loại bỏ các thư viện không cần thiết, và chạy phiên bản mới nhất của Docker theo mặc định, RancherOS làm giảm những rắc rối với việc cập nhật, vá lỗi, và duy trì hệ thống điều hành máy chủ của bạn. Container trên RancherOS khởi động trong vài giây, làm cho nó dễ dàng cho các team di chuyển và mở rộng một cách nhanh chóng.
3.3. Cài đặt RancherOS
Sau khi các bạn đã down được file ISO về, hãy burn ra USB và boot bằng USB nhé.
Từ phiên bản 0.7.0, rancher tự động login khi boot bằng usb. Nếu các bạn down phiên bản cũ hơn thì ta có thể login bằng user/pass: rancher/rancher để tiến hành cài đặt.
Trước khi cài đặt, ta phải đặt tạm thời 1 IP và gateway cho rancher (lý do thì lát nữa mình sẽ thông báo)
sudo ip addr add 10.0.1.2/24 dev eth0
sudo route add default gw 10.0.1.254
ok vậy là đã ra được internet. Ta tiếp tục. Giờ lấy 1 máy bên ngoài ssh vào rancher qua IP vừa đặt nào. Trước khi SSH nhớ đổi pass cho user rancher trên máy nhé
[c:~]$ ssh 10.0.1.190 Connecting to 10.0.1.190:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. [rancher@rancher ~]$ sudo su - [root@rancher ~]#
ok. giờ ta sẽ viết script cloud-config.yml để rancher đọc và install nhé
#cloud-config ssh_authorized_keys: - ssh-rsa xxxxxxz cuongtv hostname: rancher-master rancher: network: dns: nameservers: - 8.8.8.8 interfaces: eth*: dhcp: false eth0: address: 10.0.1.190/24 gateway: 10.0.1.254 mtu: 1500
trong đó:
- ssh_authorized_keys: là public key của user sẽ sử dụng để SSH vào sau khi cài đặt xong
- hostname: tên server
- nameservers: server DNS
- address: IP của server
- gateway: default gateway
- mtu: số lượng unit tối đa trên card mạng (thường đặt là 1500)
Install: sudo ros install -c cloud-config.yml -d /dev/sda
[root@rancher ~]# sudo ros install -c cloud-config.yml -d /dev/sda INFO[0000] No install type specified...defaulting to generic Installing from rancher/os:v0.7.0 Continue [y/N]: y Unable to find image 'rancher/os:v0.7.0' locally v0.7.0: Pulling from rancher/os 952132ac251a: Downloading [===========================> ] 27.43 MB/49.73 MB 82659f8f1b76: Download complete c19118ca682d: Download complete 8296858250fe: Download complete 24e0251a0e2c: Download complete ae4af5d61b04: Waiting 4727cc5b7643: Downloading [=> ] 851.3 kB/42.02 MB ddf413465c65: Waiting ddf413465c65: Pulling fs layer
đợi rancher pull version về và bắt đầu install là ok. Vì phải viết script này để cài đặt nên nếu ai nhớ được đoạn script trên thì không cần thiết phải đặt IP tạm thời để SSH. Lý do mình SSH từ 1 máy ngoài vào để copy script này cho đơn giản thôi