1. Yêu cầu

Mô hình:

Các single node trong HA rancher cần phải có đủ tối thiểu các yêu cầu như sau:

  • Chạy trên nhân Linux hỗ trợ được Docker 1.10.3 trở lên
  • 1GB RAM
  • MYSQL server phải có cấu hình max connection > 150
    • Option 1: Chạy với Antelope với default COMPACT
    • Option 2: Chạy MySQL 5.7 với Barracuda với ROW_FORMAT là dynamic
  • Các port phải được mở:
    • Global: TCP Ports 22 , 80, 443, 18080
    • Access giữa các node:
      • UDP port: 500, 4500
      • TCP port: 2181, 2376, 2888, 3888, 6379
  • MySQL
  • External Load Balancer

2. Chuẩn bị

  • Image rancher/server:latest là tag sẽ được build dưới đây
  • Chuẩn bị một cơ sở dữ liệu MySQL với RAM tối thiểu 1. Theo mặc định, người dùng sẽ chỉ có thể truy cập cơ sở dữ liệu từ localhost. Bạn sẽ cần phải cấp quyền truy cập cho người dùng mới cho các mạng, nơi các nút Rancher của bạn.
  • Cấu hình external load balancer sẽ cân bằng lưu lượng trên các cổng 80 và 443 trên các node chạy máy chủ Rancher. Tùy thuộc vào nhà cung cấp cloud, nó có thể là cần thiết để bắt đầu các node trước khi có thể cấu hình external load balancer. LB phải hỗ trợ WebSockets và forward cho header, để cho các chức năng của rancher hoạt động đúng.
  • Chuẩn bị các node để dung trong HA. Sử dụng image rancher/server. Hiện tại có 3 cluster size:
    • 1 node: ko HA
    • 3 node: 1 host có thể fail
    • 5 node: 2 host có thể fail
  • Trên các node, chạy rancher server sẽ tự sinh ra các file scripts HA startup. Các file script này sẽ connect tới Mysql database bên ngoài. Nó sẽ dung để bootstrap quá trình deploy HA. Thậm chí, rancher server container được sử dụng trong bước này sẽ được thay thế bởi 1 HA config rancher server

3. Thực hiện

3.1 Dựng server Mysql external

Như bài viết lần trước, mình có cài 1 rancheros và chạy trực tiếp rancher server trên đó. Các DB sẽ lưu trữ tại ngay container chứa nó. Nếu container đó bị stop thì thật tai hại đúng không. Vì vậy nên mới cần phải tạo 1 server làm db riêng để tránh mất mát thông tin.

Ở đây mình sẽ dựng 1 server chạy mysql 5.5 làm external database. Tạo 1 DB cuongtv, có user và pass là cuongtv. IP server: 10.0.1.6

$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 42
Server version: 5.5.53-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE IF NOT EXISTS cuongtv COLLATE = 'utf8_general_ci' CHARACTER SET = 'utf8';
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL ON cuongtv.* TO 'cuongtv'@'%' IDENTIFIED BY 'cuongtv';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON cuongtv.* TO 'cuongtv'@'localhost' IDENTIFIED BY 'cuongtv';
Query OK, 0 rows affected (0.00 sec)

3.2 Dựng external load balancer

Ở đây mình sẽ thay thế = cách sử dụng round robin trong reverse proxy. Bước đầu tiên: cài nginx trên server $yum install nginx

Sau đó tạo file cấu hình cuongtv.conf trong /etc/nginx/conf.d/ Chú ý: rancher server chạy qua websocket nên cần mở ra trong nginx nhé.

upstream cuongtv {
        server 10.0.1.129:8080;
        server 10.0.1.196:8080;
        server 10.0.1.191:8080;
    }

    server {
        listen 8081;
        server_name cuongtv;

        location / {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://cuongtv;
        }
    }

3.3 Chuẩn bị các node chạy rancher server

ở đây mình chuẩn bị 3 máy chạy rancher: 10.0.1.129, 10.0.1.191 và 10.0.1.196. Để tiện cho việc setup, mình sẽ pull trước image rancher/server về ở cả 3 server.

$ docker pull rancher/server:latest
latest: Pulling from rancher/server
96c6a1f3c3b0: Pull complete
ed40d4bcb313: Pull complete
b171f9dbc13b: Pull complete
ccfc4df4fbba: Pull complete
9e4d5a1238bb: Pull complete
f986ba0d224d: Pull complete
303d9649bb89: Pull complete
56825bfb5bb7: Pull complete
86a35696481e: Pull complete
eb2848176ff4: Pull complete
fabbcc718243: Pull complete
35489637da84: Pull complete
5c005e2df0e8: Pull complete
64ba16c4c9f4: Pull complete
Digest: sha256:d5a798d1274bcf6813fc9866660dc8559b7e17cdce47608bce28d134bd4f2dc1
Status: Downloaded newer image for rancher/server:latest

Ta đã thiết lập external database tại server 10.0.1.6 nên sẽ chạy rancher/server với db trên server 10.0.1.6 với câu lệnh:

sudo docker run -d -p 8080:8080 \
-e CATTLE_DB_CATTLE_MYSQL_HOST=10.0.1.6 \
-e CATTLE_DB_CATTLE_MYSQL_PORT=3306 \
-e CATTLE_DB_CATTLE_MYSQL_NAME=cuongtv \
-e CATTLE_DB_CATTLE_USERNAME=cuongtv \
-e CATTLE_DB_CATTLE_PASSWORD=cuongtv \
-v /var/run/docker.sock:/var/run/docker.sock \
rancher/server

Sau khi thực hiện xong câu lệnh này trên cả 3 node, ta kiểm tra lại xem đã chạy rancher server hay chưa:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
b5aa8b66d25d        rancher/server      "/usr/bin/s6-svscan /"   39 minutes ago      Up 39 minutes       3306/tcp, 0.0.0.0:8080->8080/tcp   pensive_brahmagupta

ok vậy là đang chạy. Sau khi chạy thì các bạn cần phải chờ 10-15’ để rancher đọc db và load giao diện nên tới bước này cần sự kiên nhẫn từ phía người cài đặt 

4. Gen file script cấu hình

Sau khi đã tạo xong LB trên nginx và run rancher trên cả 3 node. Các bạn vào link: http://cuongtv như config trên nginx vừa xong để cấu hình tiếp nhé. (Ở đây mình sẽ cần trỏ thêm domain cuongtv tới server reverse proxy trong file hosts để có thể vào được link này nhé)

Chọn Admin > High Availability sẽ có confirm rancher server đã kết nối thành công tới external database 10.0.1.6.

Và các bạn sẽ chọn size cluster, số lượng node rancher server mà bạn cấu hình ở bước thứ 3.

Trong Host Registration URL bạn sẽ phải cung cấp địa chỉ IP external loadbalancer hoặc domainname cho LB (ở đây mình cấp địa chỉ IP của server reverse proxy)

Chọn cert mà bạn muốn sử dụng. Rancher sẽ tự gen cho các bạn 1 cert (cùi thôi) hoặc các bạn có thể tự dung cert của mình. Ở đây mình tự gen qua rancher.

Click on Generate Config Script > Download và lưu file đó trên local

Sau khi download xong, các bạn phải stop tất cả các container đang chạy Rancher server.

5. Chạy Rancher trên HA

Trên các node bạn muốn HA, dùng script đó để chạy rancher server với câu lệnh sudo bash ./rancher-ha.sh rancher/server:v1.1.4

Nó sẽ start rancher server container kết nối tới external DB đã tạo trước đó.

Lưu ý: phải đảm bảo rằng các bạn đã stop script generating Rancher server container sau khi bạn nhận được file rancher-ha.sh . Nếu bạn cố tình chạy file script HA trên cùng node đó, port sẽ bị conflict và node HA sẽ ko thể start.

Có 2 điểm cần lưu ý thêm ở đây:

  • Vì chúng ta dùng reverse proxy nên trên HA, các node phải run = IP. Vào giao diện Rancher trên từng node
  • Vì khi start lại và run theo script tự gen của rancher thì các container sẽ start theo port 18080 nên chúng ta cần sửa file cuongtv.conf trong reverse proxy cho đúng
upstream cuongtv {
        server 10.0.1.129:18080;
        server 10.0.1.196:18080;
        server 10.0.1.191:18080;
    }

    server {
        listen 8081;
        server_name cuongtv;

        location / {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://cuongtv;
        }
    }

Đây là khi hoạt động bình thườngScreenshot_7.png

Và khi có 1 host down. Nó sẽ tự động reconect lại.

Ok. vậy là đã xong phần cấu hình HA cho rancher và bạn có thể bắt đầu triển khai các dịch vụ trên đó hoặc chạy các template từ rancher catalogue.