Thứ hai, 05/10/2015 | 00:00 GMT+7

Cơ sở hạ tầng SaltStack: Tạo các trạng thái muối cho Bộ cân bằng tải HAProxy

SaltStack, hay Salt, là một hệ thống quản lý cấu hình và thực thi từ xa mạnh mẽ được dùng để dễ dàng quản lý cơ sở hạ tầng theo cách có cấu trúc, có thể lặp lại. Trong loạt bài này, ta sẽ trình bày một phương pháp quản lý môi trường phát triển, dàn dựng và production của bạn từ việc triển khai Salt. Ta sẽ sử dụng hệ thống trạng thái Salt để viết và áp dụng các hành động có thể lặp lại. Điều này sẽ cho phép ta phá hủy bất kỳ môi trường nào của ta , an toàn khi biết rằng ta có thể dễ dàng đưa chúng trở lại trực tuyến ở trạng thái giống hệt nhau sau này.

Trong hướng dẫn trước đây của ta , ta đã tạo trạng thái Salt cho các web server đã cài đặt và cấu hình Nginx. Trong hướng dẫn này, ta sẽ cấu hình các trạng thái cho bộ cân bằng tải sẽ ở phía trước các web server của ta trong môi trường production và dàn dựng của ta . Bộ cân bằng tải của ta cần được cấu hình với địa chỉ web server để chuyển lưu lượng truy cập một cách chính xác.

Bắt đầu nào.

Tạo file trạng thái HAProxy chính

Bộ cân bằng tải của ta sẽ sử dụng HAProxy để truyền lưu lượng truy cập cho ứng dụng của ta giữa tất cả các web server có sẵn trong môi trường. Như với file trạng thái Nginx, ta sẽ tạo một folder cho trạng thái này trong folder /srv/salt :

  • sudo mkdir /srv/salt/haproxy

Ta sẽ sử dụng tên init.sls cho file trạng thái chính của ta trong folder này để ta có thể tham chiếu đến trạng thái bằng tên folder :

  • sudo nano /srv/salt/haproxy/init.sls

Bên trong, ta có thể sử dụng cùng một mẫu mà ta đã sử dụng cho Nginx để cài đặt gói haproxy và đảm bảo nó đang chạy. Ta sẽ đảm bảo dịch vụ được reload khi có các thay đổi đối với gói hoặc các thay đổi đối với file file /etc/default/haproxy hoặc file /etc/haproxy/haproxy.cfg . , hãy rất cẩn thận với khoảng cách để tránh lỗi YAML:

/srv/salt/haproxy/init.sls
haproxy:   pkg:     - installed   service.running:     - watch:       - pkg: haproxy       - file: /etc/haproxy/haproxy.cfg       - file: /etc/default/haproxy 

Ta cần quản lý cả hai file mà dịch vụ haproxy đang xem. Ta có thể tạo các trạng thái cho mỗi.

Tệp /etc/haproxy/haproxy.cfg sẽ là một mẫu. Tệp này cần lấy thông tin về môi trường để đưa vào danh sách các web server của nó để chuyển lưu lượng truy cập đến. Các web server của ta sẽ không có cùng một IP mỗi khi chúng được tạo. Ta cần tạo động danh sách mỗi khi trạng thái này được áp dụng.

Tệp /etc/default/haproxy chỉ là một file thông thường. Ta đang quản lý nó vì ta muốn đảm bảo HAProxy được khởi động khi server khởi động . Tuy nhiên, đây không phải là thông tin động, vì vậy ta không cần đặt đây là một mẫu:

/srv/salt/haproxy/init.sls
haproxy:   pkg:     - installed   service.running:     - watch:       - pkg: haproxy       - file: /etc/haproxy/haproxy.cfg       - file: /etc/default/haproxy  /etc/haproxy/haproxy.cfg:   file.managed:     - source: salt://haproxy/files/etc/haproxy/haproxy.cfg.jinja     - template: jinja     - user: root     - group: root     - mode: 644  /etc/default/haproxy:   file.managed:     - source: salt://haproxy/files/etc/default/haproxy     - user: root     - group: root     - mode: 644 

Đây thực sự là tất cả những gì ta cần cho chính file trạng thái. Lưu file khi bạn hoàn tất.

Cài đặt HAProxy và chuyển file gói sang Salt Master

Ta sẽ sử dụng cùng một kỹ thuật mà ta đã sử dụng với Nginx để có được các file HAProxy cơ bản mà ta cần. Ta sẽ cài đặt gói trên một minion và sau đó yêu cầu server đẩy các file đó lên bản chính.

Hãy sử dụng server stage-lb vì đó sẽ là mục tiêu cuối cùng cho gói này. Nếu bạn chưa cài đặt và chạy các máy dàn dựng của bạn , hãy nhập:

  • sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map

Sau khi server của bạn khả dụng, bạn có thể cài đặt gói haproxy trên server stage-lb bằng lệnh :

  • sudo salt stage-lb pkg.install haproxy

Khi cài đặt xong , ta có thể yêu cầu minion đẩy hai file ta cần lên server chính:

  • sudo salt stage-lb cp.push /etc/default/haproxy
  • sudo salt stage-lb cp.push /etc/haproxy/haproxy.cfg

Các phần có liên quan của hệ thống file minion sẽ được tạo lại trong folder /var/cache/salt/master/minions/ minion_id /files . Trong trường hợp này, ID minion là stage-lb . Sao chép toàn bộ cấu trúc file minion vào folder trạng thái HAProxy của ta :

  • sudo cp -r /var/cache/salt/master/minions/stage-lb/files /srv/salt/haproxy

Ta có thể thấy cấu trúc file bằng lệnh :

  • find /srv/salt/haproxy -printf "%P\n"
Output
files files/etc files/etc/default files/etc/default/haproxy files/etc/haproxy files/etc/haproxy/haproxy.cfg init.sls

Bây giờ ta có các file từ minion, ta có thể phá hủy server cân bằng tải:

  • sudo salt-cloud -d stage-lb

Sau đó, ta có thể tạo lại server trong nền để ta có một phương tiện chặn sạch sẽ sau này để thực hiện kiểm tra và xác nhận cuối cùng của ta . Nhắm đến server chính Salt của bạn bằng lệnh này, vì nó có quyền truy cập vào các file cloud có liên quan:

  • sudo salt --async sm cloud.profile stage-lb stage-lb

Trong khi server đang xây dựng lại, ta có thể tiếp tục và thực hiện các sửa đổi cần thiết đối với file HAProxy mà ta đang quản lý.

Cấu hình file / etc / default / haproxy

Ta có thể bắt đầu với file /etc/default/haproxy . Trong folder trạng thái HAProxy của ta trên Salt master, hãy di chuyển đến folder chứa file mặc định:

  • cd /srv/salt/haproxy/files/etc/default

Sao chép file vào haproxy.orig để ta có thể bảo quản file như được đóng gói ban đầu:

  • sudo cp haproxy haproxy.orig

Bây giờ, hãy mở file để chỉnh sửa:

  • sudo nano haproxy

Thay đổi ENABLED thành “1”. Điều này sẽ cho hệ thống init của Ubuntu, Upstart, khởi động dịch vụ HAProxy khi server khởi động:

/ srv / salt / haproxy / files / etc / default / haproxy
# Set ENABLED to 1 if you want the init script to start haproxy. ENABLED=1 # Add extra flags here. #EXTRAOPTS="-de -m 16" 

Đây là thay đổi duy nhất mà ta cần thực hiện. Lưu và đóng file .

Cấu hình Tệp Mẫu /etc/haproxy/haproxy.cfg

Tiếp theo, hãy làm việc trên file cấu hình HAProxy chính. Di chuyển vào folder thích hợp trên server Salt:

  • cd /srv/salt/haproxy/files/etc/haproxy

, hãy sao chép cấu hình để lưu lại trạng thái ban đầu:

  • sudo cp haproxy.cfg haproxy.cfg.orig

Sau đó, đổi tên file để phản ánh rằng đây là file mẫu Jinja:

  • sudo mv haproxy.cfg haproxy.cfg.jinja

Mở file mẫu trong editor của bạn:

  • sudo nano haproxy.cfg.jinja

Ở đầu file , ta có thể bắt đầu bằng cách đặt một biến Jinja. Ta cần lấy môi trường mà bộ cân bằng tải đang hoạt động bằng cách sử dụng chức năng thực thi network.interface_ip . Ta sẽ sử dụng điều này sau để điền danh sách server với các web server từ cùng một môi trường:

/srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja
{%- set env = salt['grains.get']('env') -%} global         log /dev/log    local0         log /dev/log    local1 notice         chroot /var/lib/haproxy         . . . 

Bỏ qua phần "mặc định" của file . Ta cần thay đổi mode thành “tcp” và option đầu tiên thành “tcplog”:

/srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja
. . .  defaults     . . .     mode    tcp     option  tcplog     . . . 

Ở cuối file , ta cần tạo cấu hình thực của bạn . Ta cần tạo phần “giao diện user ”, phần này sẽ mô tả cách HAProxy sẽ chấp nhận các kết nối. Ta sẽ gắn nhãn phần này là “www”.

Ta muốn liên kết điều này với địa chỉ IP công cộng của server . Ta có thể lấy điều này bằng cách sử dụng hàm module thực thi network.interface_ip với đối số eth0 . Các yêu cầu web sẽ đến ở cổng 80. Ta có thể chỉ định phần backend mặc định để chuyển đến với tùy chọn default_backend . Ta sẽ gọi backend của ta là nginx_pool :

/srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja
. . .  frontend www     bind {{ salt['network.interface_ip']('eth0') }}:80     default_backend nginx_pool 

Tiếp theo, ta cần thêm backend nginx_pool . Ta sẽ sử dụng mô hình cân bằng vòng tròn thông thường và đặt lại chế độ thành “tcp”.

Sau đó, ta cần điền danh sách các web server backend từ môi trường của ta . Ta có thể làm điều này bằng cách sử dụng vòng lặp “for” trong Jinja. Ta có thể sử dụng hàm module thực thi mine.get để lấy giá trị của hàm khai thác internal_ip . Ta sẽ phù hợp với role web server và môi trường. ~ env Env sẽ phân loại giá trị của biến env mà ta đã đặt trước đó cho chuỗi đối sánh đứng trước nó.

Kết quả của việc tra cứu này sẽ được lưu trữ trong server và các biến addr cho mỗi lần lặp lại của vòng lặp. Trong vòng lặp, ta sẽ thêm thông tin chi tiết của server bằng cách sử dụng các biến vòng lặp này. Kết quả cuối cùng trông như thế này:

/srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja
. . .  frontend www     bind {{ salt['network.interface_ip']('eth0') }}:80     default_backend nginx_pool  backend nginx_pool     balance roundrobin     mode tcp     {% for server, addr in salt['mine.get']('G@role:webserver and G@env:' ~ env, 'internal_ip', expr_form='compound').items() -%}     server {{ server }} {{ addr }}:80 check     {% endfor -%} 

Lưu file khi bạn hoàn tất.

Kiểm tra file trạng thái HAProxy

Trạng thái cân bằng tải của ta khá cơ bản, nhưng hoàn chỉnh. Bây giờ ta có thể chuyển sang thử nghiệm nó.

Đầu tiên, hãy sử dụng state.show_sls để hiển thị thứ tự file :

  • sudo salt stage-lb state.show_sls haproxy

Ta có thể cho biết theo trình tự trong các giá trị "thứ tự" khác nhau trong kết quả rằng gói sẽ được cài đặt, dịch vụ sẽ được bắt đầu và sau đó hai file sẽ được áp dụng. Đây là những gì ta mong đợi. Các thay đổi file sẽ kích hoạt reload dịch vụ do cài đặt "xem" mà ta đã cấu hình .

Tiếp theo, ta có thể chạy khô ứng dụng trạng thái. Điều này sẽ bắt một số (nhưng không phải tất cả) lỗi khiến trạng thái bị lỗi khi chạy:

  • sudo salt stage-lb state.apply haproxy test=True

Kiểm tra xem tất cả các trạng thái sẽ được thông qua. Dù số lỗi ở cuối hay ở kết quả , hãy cuộn lên và xem dòng “ Comment ” cho mỗi trạng thái. Đôi khi, điều này sẽ bao gồm thông tin bổ sung về các vấn đề tiềm ẩn, mặc dù thử nghiệm đã được đánh dấu là thành công.

Sau khi khắc phục sự cố nào xuất hiện trong các lệnh kiểm tra, bạn có thể áp dụng trạng thái của bạn cho các server cân bằng tải của bạn . Đảm bảo rằng bạn có các web server Nginx backend đang chạy và được cấu hình trước khi áp dụng trạng thái:

  • sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map
  • sudo salt -G 'role:webserver' state.apply nginx

Khi web server của bạn đang chạy, hãy áp dụng trạng thái haproxy :

  • sudo salt -G 'role:lbserver' state.apply haproxy

Đến đây bạn có thể truy cập một trong hai web server backend của bạn thông qua địa chỉ IP công khai của trình cân bằng tải của bạn. Bạn có thể hiển thị địa chỉ IP công khai của bộ cân bằng tải của bạn bằng lệnh sau:

  • sudo salt -G 'role:lbserver' network.interface_ip eth0

Nếu bạn sử dụng trình duyệt, nó sẽ trông giống như sau:

trang cân bằng tải

Dễ dàng thấy trình cân bằng tải vượt qua lưu lượng truy cập giữa các server backend với curl :

  • curl load_balancer_public_IP
Output
<!DOCTYPE html> <html> <head> <title>Welcome from stage-www2</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>Hello! This is being served from:</p> <h2>stage-www2</h2> </body> </html>

Nếu bạn gõ lại lệnh một vài lần, nó sẽ swap giữa hai server của bạn:

  • curl load_balancer_public_IP
Output
<!DOCTYPE html> <html> <head> <title>Welcome from stage-www1</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>Hello! This is being served from:</p> <h2>stage-www1</h2> </body> </html>

Như bạn thấy , server phục vụ yêu cầu đã thay đổi, nghĩa là bộ cân bằng tải của ta đang hoạt động chính xác.

Kết luận

Đến đây, ta có một trạng thái HAProxy đang hoạt động có thể được áp dụng cho các máy cân bằng tải của ta . Điều này được dùng để phân chia lưu lượng đến cho ứng dụng của ta giữa tất cả các server Nginx backend . Ta có thể dễ dàng phá hủy các bộ cân bằng tải của bạn và sau đó xây dựng lại chúng dựa trên các web server có sẵn.

Trong hướng dẫn tiếp theo , ta sẽ tập trung vào việc cài đặt và chạy MySQL dưới dạng hệ thống database backend của ta . Điều này sẽ được sử dụng để lưu trữ dữ liệu ứng dụng trong các môi trường khác nhau của ta .


Tags:

Các tin liên quan