keepalived+nginx ansible部署
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.red
lb2.server.aiops.red
LB 节点信息:
# LB node 1
hostname: lb1.server.aiops.red
IP: 10.211.55.56
# LB node 2
hostname: lb2.server.aiops.red
IP: 10.211.55.57
# VIP 1
vip1: 10.211.55.251/24
# VIP 2
vip2: 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 task
ansible.posix.selinux:
state: disabled
- name: enabled http service task
ansible.builtin.firewalld:
immediate: true
permanent: true
service: http
state: enabled
- name: enabled https service task
ansible.builtin.firewalld:
immediate: true
permanent: true
service: https
state: enabled
- name: deploy nginx server task
ansible.builtin.dnf:
name: nginx
state: present
- name: started nginx service task
ansible.builtin.systemd:
enabled: true
name: nginx
state: started
- name: nginx config file task
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
force: true
notify: 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 handler
ansible.builtin.systemd:
name: nginx
state: reloaded
编辑 defaults/main.yml
文件,设置变量:
statusAllowIPs:
- 127.0.0.1
- 10.211.55.0/24
statusPort: 80
statusAllowIPs
定义了允许访问 nginx_status
页面的 IP 或地址段;statusPort
定义了 Nginx 状态页面监听的端口。
至此,nginx
Role 配置完成。接下来编辑 playbook/nginx/playbook.yaml
文件,安装 Nginx 服务。
playbook.yaml
文件内容如下:
#!/usr/bin/env playbook
---
- name: deploy nginx application play
hosts: lb
become: true
gather_facts: false
roles:
- 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 task
ansible.builtin.dnf:
name: keepalived
state: present
- name: enabled keepalived service task
ansible.builtin.systemd:
enabled: true
name: keepalived
- name: copy keepalived single active config file task
ansible.builtin.template:
src: single_active.conf.j2
dest: /etc/keepalived/keepalived.conf
force: true
notify: restart keepalived service handler
when: doubleActivity is false
- name: copy keepalived doubble active config file task
ansible.builtin.template:
src: doubble_active.conf.j2
dest: /etc/keepalived/keepalived.conf
force: true
notify: restart keepalived service handler
when: doubleActivity is true
task 文件中有两个复制模板配置文件的任务,根据 doubleActivity
变量的值决定执行哪个任务。doubleActivity
的值被设置为 false,因此默认会配置主备架构的负载均衡器。
模板配置文件内容如下:
templates/single_active.conf.j2
! Configuration File for keepalived
global_defs {
notification_email {
{% for email in emails %}
{{ email }}
{% endfor -%}
}
notification_email_from {{ sendEmail }}
smtp_server {{ smtpServer }}
smtp_connect_timeout 30
router_id {{ ansible_facts['nodename'] }}
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx {
script "killall -0 nginx"
interval 2
weight -5
}
vrrp_instance {{ vrrpInstanceName1 }} {
{% if lb1 in ansible_facts['nodename'] -%}
state MASTER
priority 160
{% else -%}
state BACKUP
priority 158
{% endif -%}
interface {{ interface }}
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_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 handler
ansible.builtin.systemd:
name: keepalived
state: restarted
变量定义如下:
defaults/main.yml
---
# defaults file for keepalived
#
authPass: aiops
broadcast: 10.211.55.255
doubleActivity: false
emails:
- user1@aiops.red
- user2@aiops.red
- user3@aiops.red
interface: enp0s5
interfaceID1: 1
interfaceID2: 2
lb1: lb1.server.aiops.red
lb2: lb2.server.aiops.red
sendEmail: monitor@aiops.red
smtpServer: 10.211.55.10
vip1: 10.211.55.251/24
vip2: 10.211.55.252/24
vrrpInstanceName1: singleActiveNginx
vrrpInstanceName2: dubleActiveNginx
主备架构仅使用一个 VIP,因此在变量中设置 vip1
即可,vrrpInstanceName 也只设置一个即可。
在 playbooks/keeplived
目录下,创建 playbook.yaml
文件,用来执行执行 keepalived
role。
playbook.yaml
内容如下:
#!/usr/bin/env playbook
---
- name: deploy keepalived application play
hosts: lb
become: true
gather_facts: true
vars_files: variables.yaml
roles:
- 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 对应目录下获取。
喜欢就分享吧