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.rancher_overview_2.png

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 

+ BASE_DIR=/mnt/new_img
+ CLOUD_DATA=/opt/user_config.yml
+ IFS=,
+ read -ra FILES
+ '[' -z /mnt/new_img ']'
+ mkdir -p /mnt/new_img/var/lib/rancher/conf/cloud-config.d
+ '[' /opt/user_config.yml '!=' /scripts/conf/empty.yml ']'
+ cp /opt/user_config.yml /mnt/new_img/var/lib/rancher/conf/cloud-config.d/
+ '[' -e /mnt/new_img/boot/append ']'
+ '[' '' = '' ']'
+ APPEND=
+ echo ''
+ grub2_config ''
+ local grub_cfg=/mnt/new_img/boot/grub/grub.cfg
+ local append_line=
+ cat
+ '[' '!' -z ']'
+ syslinux_config ''
+ local syslinux_cfg=/mnt/new_img/boot/syslinux/syslinux.cfg
+ local append_line=
+ cat
+ '[' '!' -z ']'
+ pvgrub_config ''
+ local grub_file=/mnt/new_img/boot/grub/menu.lst
+ local append_line=
+ cat
+ '[' '!' -z ']'
+ install_rancher
+ cp /dist/initrd /mnt/new_img/boot/initrd-v0.7.0-rancheros
+ cp /dist/vmlinuz /mnt/new_img/boot/vmlinuz-v0.7.0-rancheros
+ seusers=/mnt/new_img/etc/selinux/ros/seusers
+ failsafe_context=/mnt/new_img/etc/selinux/ros/contexts/failsafe_context
+ '[' -f /mnt/new_img/etc/selinux/ros/seusers ']'
+ '[' -f /mnt/new_img/etc/selinux/ros/contexts/failsafe_context ']'
+ '[' '' = y ']'
+ umount /mnt/new_img
Continue with reboot [y/N]: y
INFO[0189] Rebooting

Chờ rancher reboot lại là xong. Và sau khi Rancher online lại, các bạn phải sử dụng user: rancher cùng với private key tương ứng với public key ssh của các bạn sử dụng trong quá trình cài đặt thì mới access được vào server.

Ok. Giờ ta sẽ enable giao diện quản lý của Rancher lên nhé: docker run -d --restart=always -p 8080:8080 rancher/server

Nào ta cùng lên giao diện thôi

Sau khi thiết lập Admin và Enable access control, chúng ta sẽ cùng tạo và quản lý Swarm nhé.

Click Default > Manage Environment > Add Environment. Phần này nhớ add access control các bạn nhé

Sang Swarm để config tiếp nào

Click INFRASTRUCTURE > Hosts > Add Host

Ở đây chúng ta sẽ điền IP cho các node được add vào mục 4 và copy command ở mục 5 paste vào node cần add. Lưu ý: các node ở đây không cần thiết phải chạy rancheros mà chỉ cần là máy Linux cài được bản Docker mới nhất lên đó. Ta cũng có thể add chính server RancherOS vừa cài xong

Ở đây, ta thấy Rancher tự động chạy image rancher/swarm-agent:v0.1.3 trên các node.

Để thêm 1 service hay project, ta click SWARM > System > Add service hoặc SWARM > project