Linux 9 自动化部署 Keepalived + Nginx 高可用负载均衡器
通常使用负载均衡器 (LB) 为一组 real server (提供服务的服务器) 分配流量,以实现后端服务的高可用及可扩展性。在设计负载均衡器的拓扑时,也需要考虑负载均衡器自身的高可用。Keepalived 是主流的 HA (高可用) 软件,Nginx 是常用的负载均衡器工具。本文将通过这两个工具,介绍如何部署高可用的负载均衡器。
本章包含以下主题:
- LB 主备及主主架构介绍
- 部署环境介绍
- 自动化部署主备架构
- 自动化部署主主架构
- 验证
- 总结
37.1 LB 主备及主主架构介绍
通过 Keepalived,可以实现 Nginx 负载均衡器的主备及双主两种架构。
37.1.1 主备架构
在主备架构环境中,仅有一个 VIP (虚拟 IP),最初配置在主节点上。客户端通过 VIP 请求服务。当主节点发生故障时,VIP 会漂移到备节点,客户端依然能够使用 VIP 请求服务。这种架构的弊端是,总有一台主机处于闲置状态。
37.1.2 主主架构
主主架构需要两个 VIP,分别分配给两个主机。这两个主机互为主备,客户端通过不同的 VIP 请求服务,两台负载均衡器均能响应客户端的请求。
37.2 部署环境介绍
需要两个节点部署 Keepalived + Nginx,以及一个 Ansible 控制台节点,完成自动化部署的工作。
37.2.1 节点信息
在实验环境中,两个 LB 节点分别为 2 核 CPU、2 GB 内存的虚拟机。
节点操作系统版本:
# 系统版本:Rocky Linux release 9.1
Ansible Inventory hosts 文件内容:
[lb]lb1.server.aiops.redlb2.server.aiops.red
LB 节点信息:
# LB node 1hostname: lb1.server.aiops.redIP: 10.211.55.56# LB node 2hostname: lb2.server.aiops.redIP: 10.211.55.57# VIP 1vip1: 10.211.55.251/24# VIP 2vip2: 10.211.55.252/24
37.2.2 节点要求
为使安装过程顺利进行,节点应满足以下要求。
37.2.2.1 时钟同步
应保证 LB 节点间、以及 Ansible 控制节点的时钟一致。
要自动化实现时钟同步,可以参考 “Linux 9 自动化部署 NTP 服务”。
37.2.2.2 主机名解析
Ansible 控制节点可以通过主机名访问 LB 节点。
要实现主机名称解析,可以在 Ansible 控制节点的
/etc/hosts文件中指定 LB 节点的 IP、主机名条目,或者参考 “Linux 9 自动化部署 DNS 服务” 一文配置 DNS 服务。
37.2.2.3 权限
Ansible 控制节点可以免密登录各节点,并能够免密执行 sudo。
37.3 自动化部署主备架构
首先介绍自动化部署 Keepalived + Nginx 的主备架构。
文中代码可在 https://github.com/weiwendi/automate 获取。
37.3.1 安装 Nginx
创建名为 nginx 的 Ansible 角色,用来安装 Nginx 软件:
ansible-galaxy role init --init-path . nginx
该命令将在当前目录下创建名为 nginx 目录 (nginx 角色)。切换到 nginx 目录下,编辑 tasks/main.yml 文件,内容如下:
---# tasks file for nginx#- name: disbled selinux taskansible.posix.selinux:state: disabled- name: enabled http service taskansible.builtin.firewalld:immediate: truepermanent: trueservice: httpstate: enabled- name: enabled https service taskansible.builtin.firewalld:immediate: truepermanent: trueservice: httpsstate: enabled- name: deploy nginx server taskansible.builtin.dnf:name: nginxstate: present- name: started nginx service taskansible.builtin.systemd:enabled: truename: nginxstate: started- name: nginx config file taskansible.builtin.template:src: nginx.conf.j2dest: /etc/nginx/nginx.confforce: truenotify: restart nginx service handler
创建 templates/nginx.conf.j2 文件,内容如下:
http {...include /etc/nginx/conf.d/*.conf;server {listen {{ statusPort }};listen [::]:{{ statusPort }};server_name _;location /nginx_status {stub_status on;access_log off;{% for allowip in statusAllowIPs -%}allow {{ allowip }};{% endfor -%}deny all;}}}
编辑 handlers/main.yml 文件,内容如下:
---# handlers file for nginx- name: restart nginx service handleransible.builtin.systemd:name: nginxstate: reloaded
编辑 defaults/main.yml 文件,设置变量:
statusAllowIPs:- 127.0.0.1- 10.211.55.0/24statusPort: 80
statusAllowIPs 定义了允许访问 nginx_status 页面的 IP 或地址段;statusPort 定义了 Nginx 状态页面监听的端口。
至此,nginx Role 配置完成。接下来编辑 playbook/nginx/playbook.yaml 文件,安装 Nginx 服务。
playbook.yaml 文件内容如下:
#!/usr/bin/env playbook---- name: deploy nginx application playhosts: lbbecome: truegather_facts: falseroles:- role: nginx...
执行 playbook.yaml 文件:
ansible-playbook -i ./hosts playbook.yaml
完成 Nginx 的安装。
37.3.2 安装 Keepalived
在 roles/ 目录下创建 keepalived role:
ansible-galaxy role init --init-path . keepalived
安装 keepalived 的任务如下:
tasks/main.yml
---# tasks file for keepalived#- name: install keepalived taskansible.builtin.dnf:name: keepalivedstate: present- name: enabled keepalived service taskansible.builtin.systemd:enabled: truename: keepalived- name: copy keepalived single active config file taskansible.builtin.template:src: single_active.conf.j2dest: /etc/keepalived/keepalived.confforce: truenotify: restart keepalived service handlerwhen: doubleActivity is false- name: copy keepalived doubble active config file taskansible.builtin.template:src: doubble_active.conf.j2dest: /etc/keepalived/keepalived.confforce: truenotify: restart keepalived service handlerwhen: doubleActivity is true
task 文件中有两个复制模板配置文件的任务,根据 doubleActivity 变量的值决定执行哪个任务。doubleActivity 的值被设置为 false,因此默认会配置主备架构的负载均衡器。
模板配置文件内容如下:
templates/single_active.conf.j2
! Configuration File for keepalivedglobal_defs {notification_email {{% for email in emails %}{{ email }}{% endfor -%}}notification_email_from {{ sendEmail }}smtp_server {{ smtpServer }}smtp_connect_timeout 30router_id {{ ansible_facts['nodename'] }}vrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0}vrrp_script check_nginx {script "killall -0 nginx"interval 2weight -5}vrrp_instance {{ vrrpInstanceName1 }} {{% if lb1 in ansible_facts['nodename'] -%}state MASTERpriority 160{% else -%}state BACKUPpriority 158{% endif -%}interface {{ interface }}virtual_router_id 51advert_int 1authentication {auth_type PASSauth_pass {{ authPass }}}virtual_ipaddress {{{ vip1 }} brd {{ broadcast }} dev {{ interface }} label {{ interface }}:1}track_script {check_nginx}}
Handlers 内容如下:
handlers/main.yml
---# handlers file for keepalived#- name: restart keepalived service handleransible.builtin.systemd:name: keepalivedstate: restarted
变量定义如下:
defaults/main.yml
---# defaults file for keepalived#authPass: aiopsbroadcast: 10.211.55.255doubleActivity: falseemails:- user1@aiops.red- user2@aiops.red- user3@aiops.redinterface: enp0s5interfaceID1: 1interfaceID2: 2lb1: lb1.server.aiops.redlb2: lb2.server.aiops.redsendEmail: monitor@aiops.redsmtpServer: 10.211.55.10vip1: 10.211.55.251/24vip2: 10.211.55.252/24vrrpInstanceName1: singleActiveNginxvrrpInstanceName2: dubleActiveNginx
主备架构仅使用一个 VIP,因此在变量中设置 vip1 即可,vrrpInstanceName 也只设置一个即可。
在 playbooks/keeplived 目录下,创建 playbook.yaml 文件,用来执行执行 keepalived role。
playbook.yaml 内容如下:
#!/usr/bin/env playbook---- name: deploy keepalived application playhosts: lbbecome: truegather_facts: truevars_files: variables.yamlroles:- role: keepalived...
执行 playbook.yaml,完成 keepalived 的部署:
ansible-playbook playbook.yaml
37.4 自动化部署主主架构
主主架构需要两个 VIP,并为每个 vrrp 实例设置名称,因此需要在变量中定义两个 vip1、vip2 两个 VIP 变量以及两个 vrrpInstanceName。具体信息可以参考 https://github.com/weiwendi/automate。
在 keepalived Playbook 目录中,创建 vars/variables.yaml 变量文件,设置 doubleActivity: true。
执行 playbook.yaml Playbook 文件,完成主主架构的部署:
ansible-playbook -i ./hosts playbook.yaml
37.5 验证
使用 IP 在 statusAllowIPs 变量中的客户端,分别通过两个 VIP 地址访问 nginx_status 页面,均能出现类似以下页面:
登录任意 LB 主机,停止 Nginx 或者 Keepalived 服务,使用 VIP,仍能访问到 nginx_status 页面。
37.6 总结
本文演示了通过 Keepalived、Nginx 实现负载均衡器。通过本教程,你可以轻松地、自动化地在基于 RPM 的 Linux 发行版上,轻松部署高可用的负载均衡。
文中所有代码,均能在 https://github.com/weiwendi/automate 对应目录下获取。
喜欢就分享吧