云计算自动化运维——saltstack+keepalived+haprox+apache+nginx实现高可用

本实验是在云计算自动化运维——SaltStack详解文章基础上进行的,master-minion端已经配置好。
本文涉及到的jinja模板的使用,详情见:云计算自动化运维——saltstack之jinja模块详解
本文涉及到的pillar数据系统详情见:云计算自动化运维——SaltStack之数据系统Grains、Pillar

saltstack+keepalived+haprox+apache+nginx实现高可用

实验环境

主机名 ip 功能
server1 172.25.1.1 saltstack、keepalived(master端)
server2 172.25.1.2 nginx
server3 172.25.1.3 apache
server4 172.25.1.4 keepalived(backup端)

实验

Keepalived

步骤一:将master端的server1主机添加为自己的minion端,因为后续需要在server1上推送

在server1上安装salt-minion:
在这里插入图片描述
在配置文件/etc/salt/minion中添加master主机:
在这里插入图片描述
将server1添加到master端的接收列表中:
在这里插入图片描述
需要注意的是:安装salt-minion后,在/etc/salt目录下生成的文中,minion_id文件保存的是minion端主机名,每次修改主机名都需要删除此文件,重启服务。否则master端会连接不到minion端

步骤二:在/srv/salt目录下创建keepalived目录。并在次目录下编写install.sls文件,实现keepalived源码编译安装,并作好软链接

/mnt/libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm:
  file.managed:
    - source: salt://keepalived/files/libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm

keepalived-install:
  pkg.installed:
    - pkgs:
      - gcc
      - openssl-devel
      - libnl-devel

  file.managed:
    - name: /mnt/keepalived-2.0.6.tar.gz
    - source: salt://keepalived/files/keepalived-2.0.6.tar.gz

  cmd.run:
    - name: cd /mnt && rpm -ivh libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm --nodeps &> /dev/null && tar zxf keepalived-2.0.6.tar.gz && cd keepalived-2.0.6 &&  ./configure --prefix=/usr/local/keepalived &> /dev/null && make &> /dev/null && make install &> /dev/null && ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ && ln -s /usr/local/keepalived/etc/keepalived/ /etc/ && ln -s /usr/local/keepalived/sbin/keepalived /sbin/
    - create: /etc/keepalived/keepalived.conf

在这里插入图片描述
libnfnetlink-devel依赖包在yum仓库不存在,所有我在网上下载到我的saltstack主机上,在saltstack中使用file.managed模块将文件发往keepalived主机。在cmd.run模块中使用rpm -ivh安装
我在安装依赖项时出的问题:
安装libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm时报如下错误:
在这里插入图片描述
解决方法:

rpm -ivh libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm --nodeps  #忽略依赖性安装

步骤二:编写service.sls文件,修改配置文件并开启服务

由于keepalived负载均衡会有主机master和备机backup,主备的配置文件 /etc/keepalived/keepalived.conf中的变量设置是不同的,所以这里需要用jinja模块,定义pillar动态变量。

include:
  - keepalived.install

keepalived-service:

  file.managed:
    - name: /etc/keepalived/keepalived.conf
    - source: salt://keepalived/files/keepalived.conf
    - template: jinja   #调用jinja模板
    - context:  #引用变量到source指定的文件中去
      STATE: {{ pillar['state'] }}  #引用pillar自定义动态变量
      VRID: {{ pillar['vrid'] }}
      PRIV: {{ pillar['priv'] }}

  service.running:
    - name: keepalived
    - reload: true
    - watch:
      - file: /etc/keepalived/keepalived.conf

步骤三:使用pillar数据系统自定义动态变量
(1)编写/srv/pillar/kp.sls文件,定义动态变量
由于我选用server1做master,server4做backup,所以此处只对主机名为server1与server4的主机定义相应变量。

{% if grains['fqdn'] == 'server1' %}
state: MASTER
vrid: 51
priv: 100
{% elif grains['fqdn'] == 'server4' %}
state: BACKUP
vrid: 51
priv: 50
{% endif %}

(2)编写/srv/pillar/top.sls文件,通过top.sls文件关联其他变量所在的kp.sls文件

base:
  '*':
    - kp

在这里插入图片描述
测试:查看变量定义是否正确
在这里插入图片描述
步骤四:将服务要用到的文件放到指定位置
(1)创建files目录,用来存放需要的文件

(2)在任意主机上安装keepalived,生成配置文件,并做修改后放到saltstack主机/srv/salt/keepalived/files目录下
我是在server2虚拟机上安装的:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost   #邮件提醒时的发送方
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict    #必须注释掉,否则会出错
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state {{ STATE }}   #状态,主或者备
    interface eth0
    virtual_router_id {{ VRID }}   #虚拟ID,同一局域网中的值不能相同,主备主机必须相同。
    priority {{ PRIV }}  #优先级
    advert_int 1
    authentication {    #认证
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {   #虚拟ip
        172.25.1.100
    }
}

注:删除配置文件31行后边的信息,后边的是搭建lvs时需要用到的配置,此处不需要。
(3)从网上下载keepalived安装包及依赖项libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm安装包,放到files目录下
在这里插入图片描述(4)安装邮件服务mailx,keepalived主机出错时会有邮件提醒。
在这里插入图片描述

haprox

步骤一:在/srv/salt目录下创建haproxy目录,在haproxy目录中编辑安装文件

install.sls
haproxy-install:
  pkg.installed:
    - name: haproxy

  file.managed:
    - name: /etc/haproxy/haproxy.cfg
    - source: salt://haproxy/files/haproxy.cfg

  service.running:
    - name: haproxy
    - reload: true
    - watch:
      - file: haproxy-install

步骤二:在haproxy目录下创建files目录,存放haproxy.cfg配置文件

提前在某台主机上安装haproxy服务,将生成的配置文件haproxy.cfg拷贝到server1主机上/srv/salt/haproxy/files目录下,并作如下配置:
在这里插入图片描述

nginx

步骤一:在/srv/salt目录下创建nginx目录,在nginx目录中编辑安装文件
此处我用的是nginx源码安装

nginx-install:
  pkg.installed:
    - pkgs:
      - gcc
      - pcre-devel
      - openssl-devel
  file.managed:
    - name: /mnt/nginx-1.16.1.tar.gz
    - source: salt://nginx/files/nginx-1.16.1.tar.gz

  cmd.run:
    - name: cd /mnt/ && tar zxf nginx-1.16.1.tar.gz && cd nginx-1.16.1 && sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make install &> /dev/null
    - creates: /usr/local/nginx   #监控,一旦/usr/local/nginx存在则不再执行cmd.run模块

步骤二:编辑服务配置文件service.sls文件

include:  #包含nginx目录下的install文件
  - nginx.install

/usr/local/nginx/conf/nginx.conf:
  file.managed:
    - source: salt://nginx/files/nginx.conf

nginx-service:
  file.managed:
    - name: /usr/lib/systemd/system/nginx.service
    - source: salt://nginx/files/nginx.service

  service.running:
    - name: nginx
    - reload: true
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf

步骤三:在nginx目录下创建files目录,拷贝nginx配置文件及nginx安装包到此目录下

在任意主机上安装nginx,将生成的配置文件拷贝到files目录下,拷贝的文件有:/usr/local/nginx/conf/nginx.conf 和/usr/lib/systemd/system/nginx.service
不做修改。
在这里插入图片描述

apache

步骤一:在/srv/salt目录下创建apache目录,在apache目录中编辑安装文件

此处我调用了jinja模块,定义pillar动态变量,也可以不使用,直接指定静态数据。

apache-install:
  pkg.installed:
    - pkgs:
      - httpd
      - httpd-tools

  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/files/httpd.conf
    - template: jinja
      http_host: {{ grains['ipv4'][-1]}}
      http_port: {{ pillar['port']}}

  service.running:
    - name: httpd
    - reload: true
    - watch:
      - file: apache-install

步骤二:使用pillar数据系统自定义动态变量

(1)编写web.sls文件,定义动态变量

由于我选用server3安装apache,所以此处只对主机名为server3主机定义端口变量。

{% if grains['fqdn'] == 'server3' %}
port: 80
{% endif %}

在这里插入图片描述
(2)编写top.sls文件,通过top.sls文件关联其他变量所在的kp.sls文件

base:
  '*':
    - kp
    - web

在这里插入图片描述
(3)测试:查看变量定义是否正确
在这里插入图片描述
步骤三:在apache目录下创建files目录,拷贝apache配置文件httpd.conf到此目录下

提前在某台主机上安装httpd服务,将生成的配置文件/etc/httpd/conf/httpd.conf传到files目录下,并做如下修改:
在这里插入图片描述

saltstack

步骤一:编辑多节点推送文件/srv/salt/top.sls

base:
  'server2':
    - nginx.service
  'server3':  
    - apache.install
  'server1':
    - keepalived.service
    - haproxy.install
  'server4':
    - keepalived.service
    - haproxy.install

在这里插入图片描述
步骤二:多节点推送

salt '*' state.highstate

推送成功标志:
server3:
在这里插入图片描述
server2:
在这里插入图片描述
server4:
在这里插入图片描述
server1:
在这里插入图片描述
步骤三:在web界面搜索虚拟ip 172.25.1.100,发现轮询调度后端主机nginx和apache
在这里插入图片描述
在这里插入图片描述
搜索haproxy默认发布界面172.25.1.100/status,查看主备节点的节点信息
在这里插入图片描述
步骤四:模拟主备节点故障
(1)可查看虚拟ip在server1主机上,此时对外的服务端为server1
在这里插入图片描述
(2)模拟server1主机down掉,关闭keepalived
在这里插入图片描述
(3)此时haproxy负载均衡正常工作,不受影响
在这里插入图片描述
(3)查看此时虚拟ip在server4主机上,此时对外的服务端为server4
在这里插入图片描述
故障恢复:
(1)开启server1主服务器的keepalived服务
此时虚拟ip回归到server1上,因为上边我们在配置文件中设置优先级时,server1的优先级高于server4
在这里插入图片描述
(2)此时haproxy负载均衡正常工作,不受影响
在这里插入图片描述
步骤五:模拟后端轮询调度主机某一台发生故障
(1)关闭server2主机上的nginx
在这里插入图片描述
(2)此时haproxy监测到server2主机故障
在这里插入图片描述
故障恢复:
(1)开启server2主机上的nginx
在这里插入图片描述
(2)此时haproxy监测到server2主机正常
在这里插入图片描述
本次实验容易遇到的错误及解决方法

在keepalived源码安装时很容易出错,每次推送完发生报错时,修改安装配置文件后必须删除文件中报错部分对目标主机做的相应操作,然后再重新推送。
我在server1和server4上源码安装keepalived,进行推送时报了如下错误:
在这里插入图片描述
我在修改完安装文件后,删除了对目标主机server1和server4的所有操作,然后重新推送。删除步骤如下:

yum remove gcc openssl-devel libnl-devel -y
rpm -e libnfnetlink-devel
rm -fr /mnt/*
rm -fr /usr/local/keepalived
rm -fr /etc/sysconfig/keepalived 
rm -fr /sbin/keepalived 
发布了170 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/CapejasmineY/article/details/103319521