首页 > 其他分享 >opensips容器通过keepalived实现高可用

opensips容器通过keepalived实现高可用

时间:2023-01-04 16:44:52浏览次数:64  
标签:容器 -- keepalived 192.168 etc opensips op

opensips容器通过keepalived实现高可用

详情请见(含截图):

https://tranquil-chill-ce7.notion.site/opensips-keepalived-ab4dca3e301642c882ed5dfe8e7a34cd

通过docker pull命令从docker hub上拉取opensips镜像,然后创建两个opensips容器(这里我命名为op和op_1。由于我们公司已经做好了op容器,所以我需要将op容器commit成镜像,然后创建两个一模一样的容器op和op_1即可。

将opensips容器op备份(要创建两个同样的容器):

docker commit -p op op_backup

确认网卡名称

ifconfig

开启混杂模式(eno7为网卡名,要根据实际情况变更)

ip link set eno7 promisc on
ifconfig eno7 promisc

创建Macvlan网络

docker network create -d macvlan \\
> --subnet=192.168.5.0/24 \\
> --ip-range=192.168.5.0/24 \\
> --gateway=192.168.5.1 \\ 
> -o parent=eno7 \\
> my_macvlan

创建两个opensips容器op和op_1,并加入macvlan网络

op(IP指定为192.168.5.160):

docker run -itd --privileged --cpus="16" -m 32000M --name op --ip=192.168.5.160 --network my_macvlan -v `pwd`/etc:/etc/opensips -v `pwd`/log:/var/log/ --entrypoint zsh op_backup:latest

op_1(IP指定为192.168.5.161):

cp -rf etc etc_1
cp -rf log log_1

docker run -itd --privileged --cpus="16" -m 32000M --name op_1 --ip=192.168.5.161 --network my_macvlan -v `pwd`/etc_1:/etc/opensips -v `pwd`/log_1:/var/log/ --entrypoint zsh op_backup:latest
(修改etc_1/opensips.cfg里的socket=...监听端口(5050->5051),里面的mysql配置的数据库名字:opensips->opensips1)

环境准备

由于两个opensips容器都是精简版的Debian系统,所以需要安装一些必要的工具,如下:

//先更新一波
apt-get update
//wget
apt install wget
//ifconfig
apt install net-tools
//ping
apt install iputils-ping

又由于keepalived需要依赖于一些库,需要安装一些必要的依赖库,如下:

apt-get install curl gcc libssl-dev libnl-3-dev libnl-genl-3-dev libsnmp-dev libtool pciutils-dev build-essential openssl

下载、安装、编译keepalived

由于以指令apt-get install keepalived 安装的keepalived太旧,所以我选择用另一种方式安装稍高版本的keepalived:

#下载安装包
wget <https://www.keepalived.org/software/keepalived-2.0.20.tar.gz>
#解压缩
tar -zxvf keepalived-2.0.20.tar.gz
#移动
mv keepalived-2.0.20 /usr/local/keepalived
#进入目录
cd /usr/local/keepalived
#编译安装
./configure --prefix=/usr/local/keepalived
#安装
make && make install

配置keepalived.conf

IP为192.168.5.160的容器:

! Configuration File for keepalived

global_defs {
	router_id GienTech_1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 130
    priority 130
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2019
    }
    virtual_ipaddress {
        192.168.5.200/24 dev eth0
    }
}

IP为192.168.5.161的容器:

! Configuration File for keepalived

global_defs {
	router_id GienTech_2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 130
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2019
    }
    virtual_ipaddress {
        192.168.5.200/24 dev eth0
    }
}

配置keepalived的启动文件

发现keepalived的命令并不能正常使用,需要配置/etc/init.d/keepalived文件。才能正常使用:

/etc/init.d/keepalived {start|stop|reload|restart|condrestart|status}

#!/bin/sh
#
# Startup script for the Keepalived daemon
#
# processname: keepalived
# pidfile: /var/run/keepalived.pid
# config: /etc/keepalived/keepalived.conf
# chkconfig: - 21 79
# description: Start and stop Keepalived

# Source function library
. /lib/lsb/init-functions
# Source configuration file (we set KEEPALIVED_OPTIONS there)
. /etc/sysconfig/keepalived

RETVAL=0

prog="keepalived"

start() {
    echo -n $"Starting $prog: "
    daemon -- keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}

stop() {
    echo -n $"Stopping $prog: "
    killproc keepalived
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
}

reload() {
    echo -n $"Reloading $prog: "
    killproc keepalived -1
    RETVAL=$?
    echo
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    reload)
        reload
        ;;
    restart)
        stop
        start
        ;;
    condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
        fi
        ;;
    status)
        status keepalived
        RETVAL=$?
        ;;
    *)
        echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
        RETVAL=1
esac

exit $RETVAL

故障模拟测试

测试一:

1、op和op_1启动keepalived服务,优先级高的op的eth0出现VIP,而此时op_1还是自己的IP。

2、op关闭keepalived服务,此时op的eth0恢复为自己的IP,而VIP已经跑到op_1。

3、重新启动op的keepalived服务,发现VIP又跑到了op上,而op_1网络恢复正常。

测试二:

1、将op停止,发现VIP跑到了op_1上。

2、将op启动,进入容器并开启keepalived服务,发现VIP出现在op上,而op_1的IP恢复正常。

标签:容器,--,keepalived,192.168,etc,opensips,op
From: https://www.cnblogs.com/cbp33060/p/17025307.html

相关文章

  • Dockerfile发布微服务部署到容器
    Dockerfile发布微服务部署到容器idea里打包jar包编写Dockerfile#基础镜像使用javaFROMjava:8#作者MAINTAINERzzyy#VOLUME指定临时文件目录为/tmp,在主机/var/lib/dock......
  • 解答|虚拟机、容器和沙箱是什么关系?
    首先,什么是沙箱?它本身就是一种线下生活现象的虚拟化。现实世界里,小孩子们在沙地、沙滩上用木板隔离出一个方盒子,在盒子里堆砌、创造各种东西-城堡、房屋、山丘...这就是......
  • string容器2
    string构造函数1string();//创建一个空的字符串例如stringstr;2string(constchar*s)//使用字符串s进行初始化3string(conststring&str);//使用一个string对......
  • string容器1
    string基本概念本质:string是C++风格的字符串,而string本质是一个类string和char*区别:char*是一个指针string是一个类,类内部封装了char,管理这个字符串,是个char型的......
  • ​硬核来袭 | 2 万字 + 10 图带你手撕 STL 关联式容器源码
    本篇已同步收录GitHub仓库,这里有小贺的源码阅读笔记:https://github.com/rongweihe/CPPNotes/tree/master/STL-source-code-notes大家好,我是小贺。鸽了好久的 STL源码系......
  • 《STL 源码剖析》学习笔记之容器(一)vector
    [图]TheContainer 2019-08-01前言侯捷大师的《STL源码剖析》,实乃一本神书,可以说也是一本很硬核的书了,不管是实验室的师兄师姐,还是牛客网上一些大佬们,都无不推荐此书,想要深......
  • 《STL 源码剖析》学习笔记之容器(二)list
    [图]Theorange 2019-08-061、list概述相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次安插或删除一个元素,就配置或释放一个元素空间。因此,list对于空间......
  • k8s中利用nsenter命令代替容器中安装telnet检查网络
    命令介绍nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量......
  • 玩转dnmp之自定义PHP容器
    文章简介在前面几篇文章中,我们使用dnmp搭建了一个完整的docker开发环境。这篇文章接着分享如何在dnmp的基础上搭建一个自定义的PHP容器,实现多版本的PHP容器。前期准备首先我......
  • 容器化开发_01_Docker镜像到哪里去下载?Docker镜像下载不下来四种原因?Docker镜像占满磁
    文章目录​​问题:Docker镜像到哪里去下载?​​​​问题:Docker镜像下载不下来四种原因?​​​​问题:Docker镜像占满磁盘了?​​问题:Docker镜像到哪里去下载?问题:Docker镜像到哪里......