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:
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:
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"
Outputfiles 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:
# 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:
{%- 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”:
. . . 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
:
. . . 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:
. . . 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:
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 .
Các tin liên quan