12/08/2018, 14:18

HA for Rancher

Như các bạn đã tìm hiểu ở phần trước, định nghĩa về rancher, nó hỗ trợ docker swarm như thế nào, cơ bản về rancher. Hôm nay, mình sẽ trình bày về cách cấu hình HA cho rancher. 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ư các bạn đã tìm hiểu ở phần trước, định nghĩa về rancher, nó hỗ trợ docker swarm như thế nào, cơ bản về rancher. Hôm nay, mình sẽ trình bày về cách cấu hình HA cho rancher.

1. Yêu cầu

Mô hình:

2016.05.09-HA-v1.0.1.jpg

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             </div>
            
            <div class=

0