keepalived+nginx ansible部署

发布时间 2023-04-17 15:07:50作者: 往事已成昨天

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 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/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 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: 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 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 实例设置名称,因此需要在变量中定义两个 vip1vip2 两个 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 页面,均能出现类似以下页面:

图片图 37.1, 通过 VIP 访问 nginx_status 页面

登录任意 LB 主机,停止 Nginx 或者 Keepalived 服务,使用 VIP,仍能访问到 nginx_status 页面。

37.6 总结

本文演示了通过 Keepalived、Nginx 实现负载均衡器。通过本教程,你可以轻松地、自动化地在基于 RPM 的 Linux 发行版上,轻松部署高可用的负载均衡。

文中所有代码,均能在 https://github.com/weiwendi/automate 对应目录下获取。

魏文第

喜欢就分享吧

收录于合集 #linux
 39
上一篇Linux 9 部署 Ceph 分布式存储下一篇Linux 9自动化部署Kubernetes高可用集群
阅读 1073
魏文第
95篇原创内容